preface
这篇是 Linux 下配置 lnmp 的教程,和 win10 下配置 wamp 教程是姐妹篇,网上的教程质量参差不齐,官网又没有给出安装教程,所以就自己记录一下,下次要装的话就不用再去找网上的教程了,此篇文章环境为 Kali Linux
安装软件
主要安装的还是 php ,nginx 和 MySQL ,怎么说呢,相比 Windows 还是要更加简单一点的,只不过刚开始要去搜索它们的配置文件存放在哪儿,先装 nginx
root@kali:~# sudo apt install nginx
再装 php,同时要装很多附加的东西
root@kali:~# sudo apt install php php-fpm php-MySQL
最后就是 MySQL,不过 Kali 系统上只有 mariadb 可以用,这比 MySQL更高级一点,是 MySQL 的衍生版本
root@kali:~# sudo apt install mariadb-client mariadb-server
这样安装就结束了,不过 Kali Linux 自带了 php 和 MySQL ,用的是 apache 服务器,所以我这里自己下载了 nginx ,不想折腾的直接用系统自带的 apache 就行了
ATTENTION
写在前面,下面每次更改配置之后都要重启 nginx ,一定要记得重启,否则改动是不会生效的,php-fpm 也一样,改动过后都要重启
$ service nginx restart
$ service php7.3-fpm restart
Windows 下用的是 php-cgi ,Linux 可以选择更强大的 php-fpm ,因为 php-fpm 是用 Linux 的 fork() 来工作的,所以 Windows 上用不了
进行配置
php
首先来配置 php 的功能,单独的 php 只是个 CLI 工具,也就是在命令行中调用,而 php-fpm 可以在网络中被调用,是一个 CGI(Common Gateway Interface) 应用,它可以监听计算机端口,得到请求然后返回结果,这和 php-cgi 的功能是一样的,不过 php-fpm 是加强版,一般监听的端口为 9000,所以我们来进行配置
root@kali:~# vim /etc/php/7.3/fpm/pool.d/www.conf
打开 php-fpm 的配置文件后,找到下面这行,将其注释,然后写上一行 listen = 127.0.0.1:9000
代表 php-fpm 监听本机的 9000 端口。这里用的是网络端口监听,上面被注释的是用 sock 协议进行监听,一般用在 nginx 和 php 装在同一台机器中的情况,通常情况下 sock 的效率更高,我们待会儿再讲,先来配置本地端口监听的 php
nginx
然后就配置我们的服务器,首先看看 nginx 目录下的文件,默认安装位置为 /etc/nginx
.
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules-available
├── modules-enabled
│ ├── ......
├── nginx.conf
├── proxy_params
├── scgi_params
├── sites-available
│ └── default
├── sites-enabled
│ ├── ctf.conf
│ └── default -> /etc/nginx/sites-available/default
├── snippets
│ ├── fastcgi-php.conf
│ └── snakeoil.conf
├── uwsgi_params
└── win-utf
刚刚下载完的时候,会在 /vaw/www/
文件夹中新建一个 html
文件夹,里面有一个 index.html ,这是 nginx 的默认首页,我们可以用我们网站的数据替换掉 html
文件夹中的内容,也可以新建一个文件夹,重新配置一个站点,这里我们就重新配置一下
首先,在 /var/www/
中新建一个目录,由于我是用来搭建 ctf 靶机,我的目录就叫 upload-labs
,这就是我们网站的根目录,然后把网站的数据粘贴进文件夹,这是我的文件夹的结构
/var/www/upload-labs/
├── index.php
├── css
├── doc
├── docker
├── img
├── js
├── Pass-01
├── Pass-02
├── ......
└── upload
然后就去 nginx 的配置文件中进行配置,我们先看 nginx.conf
这个文件,这里面是一个总的 nginx 配置,有 http ,events ,mail 等几个配置块
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
...
}
http {
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
mail {
...
}
主要是 http 这个块,可以看到,最后他加了两行 include
,说明我们可以将 http 的配置写在其他的文件中,最后引用进来就行了,所以为了保持原生的配置文件,我们就去 sites-enabled
这个文件夹新建一个名叫 ctf.conf
的配置文件(里面有个默认的配置文件,里面有很多模板配置,我们将自己需要的复制一下就行了)
server {
listen 80;
listen [::]:80;
server_name localhost;
root /var/www/upload-labs;
index index.html index.php;
location ~ [^/]\.php(/|$)
{
#fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
下面说下这些配置都是啥意思
配置 | 意义 |
---|---|
listen | 表示监听的端口号 |
server_name | 网站的域名,没有的话直接填 localhost ,有的话可以填自己购买的域名 |
root | 网站根目录的存储位置 |
index | 默认的首页的名称 |
location | 处于某个位置时应该执行的动作,这里通过 nginx 的正则表达式,如果 nginx 接收到 php 后缀的请求就交给监听 127.0.0.1:9000 处的 php-fpm 去处理(否则就直接下载该 php 文件) |
这里的配置大概说一下,先能简单明白就好,至于反向代理,负载均衡之后再讲,这里主要是 location 需要理解一下,因为 nginx 是不能解释 php 内容的,初始状态下如果它遇到了 php 后缀的文件,就会当成是普通的文件,然后直接让我们下载,不会在网页中渲染,所以我们要让 fastcgi 程序来处理 php 文件,也就是说对于 fastcgi 来说(这里是 php-fpm),nginx 相当于客户端,fastcgi 相当于服务器
下面这行就是调用 fastcgi服务,由于我们配置的是端口监听,所以这里是监听本地端口 9000 ,这时默认的端口
fastcgi_pass 127.0.0.1:9000;
上面这种的好处呢就是可以不监听本地端口,可以监听网络上的装了 fastcgi 应用的计算机的端口。但如果我们只想用本地的 php 服务的话完全可以用 sock 协议,也就是上面被注释的那行,这个效率是更高的,网上的一些教程只是说注释了它,没有说为什么注释,其实完全不用注释,只要 /etc/php/7.3/fpm/pool.d/www.conf
里面监听的内容和这里是一样的就可以了,我已经亲身试过了,所以网上的教程还是不要全信,看完之后要有点自己的思考
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
下面的两行,都是跟 fastcgi-param
有关的,也就是 nginx 与 fastcgi 服务器交互的一些参数,我们先来看看默认情况下是怎样的
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
第一行,表示的是 nginx 传输文件给 fastcgi 时的具体文件名,fast-cgi 会去网站根目录的 /script
中找这个文件,这有什么不好的地方呢,如果 php 文件不在 /script 中,fastcgi 就找不到他了,因此我们要将这个参数 /script
修改成网站的根目录(也就是 root 的位置),然后 nginx 官方也发现这样太麻烦了,就提供了一个参数 $document_root
指向当前的网站根目录,所以我们可以这样修改一下
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
第二行,就是将 nginx 目录下的 fastcgi-parms
给引进来了,也就是说在 fastcgi_params
中没有对 SCRIPT_FILENAME
做定义,所以要先定义,然后再将其他的变量给引入,说个好消息,在新版的 nginx 中其实已经对这些东西做好了定义,就在 fastcgi.conf
中,所以我们可以直接将这两行给替换掉,直接用下面的这行语句代替会更加方便!
include fastcgi.conf;
到这一步其实就已经可以了,我们已经可以在浏览器中访问我们的网站了,下一步配置一下数据库
MySQL
Linux 下的 MySQL 好像不用怎么动,安装完就直接能够和 php 进行连接,只要保证打开了 MySQL 服务就行,测试一下,ok,一次通过
开机自启动
一般用 systemctl 就可以了
root@kali:/var/www/html# systemctl enable nginx.service
root@kali:/var/www/html# systemctl enable php7.3-fpm.service
root@kali:/var/www/html# systemctl enable mysql
summary
感觉 php 还是和 apache 配合更加方便,php 都集成了 apache 的模块,都不用怎么配置了,在 nginx 上要多些配置的步骤,不想折腾的话还是用 apache 吧,而且 ctf 靶机还有些题目专门用的是 apache 的漏洞,不过 nginx 的好处就是可以反向代理和负载均衡,这个有机会我之后再写一下。还有一个就是,搭建 ctf 靶机环境的时候最好还是用集成环境吧,多版本 php 随便切换,不存在说哪一关不能通过的现象
reference
https://mobilesite.github.io/2017/03/26/config-and-use-of-php-nginx-MySQL/
https://my.oschina.net/kenshiro/blog/187926
https://xuchen.wang/index.php/archives/nginxphp.html