本试验是基于树莓派的 buster 版本。
一、安装 nginx
apt install nginx -y
完成安装之后,可以使用 dpkg -l | grep nginx 找到相关的安装包:
通过分析 /var/lib/dpkg/status 可以得到 nginx 安装包的依赖关系:
nginx --> nginx-full --> libnginx-mod-http-xxxx
--> nginx-common --> lsb-base, debconf
--> libc6, libpcre3, libssl1.1, zlib1g
安装完成后,我们可以看一下 nginx 的版本:
nginx 的配置文件全在 /etc/nginx/ 路径下。
其中 /etc/nginx/nginx.conf 为总的配置入口。
其大概的结构如下:
user www-data;
worker_processes auto;
include /etc/nginx/modules-enabled/*.conf
events {
worker_connections 768;
}
http {
# Basic Settings
...
# SSL Settings
...
# Logging Settings
...
# Gzip Settings
...
# Virtual Host Configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
虚拟主机的定议在 /etc/nginx/sites-enable/ 路径下。
目前该路径下只有 default 一个文件。它在里面定义了一个 80 端口的服务,根目标在 /var/www/html 路径下。
二、安装 php 与 php-fpm
使用 apt search 搜一下有没有对应的安装包。发现有:
执行安装的时候,发现已经有了。
那就不用再安装了。
2.1 php
试了一下 php 命令,也是有的,且可以正常使用。
写一个最简单的php程序试一下:
echo "Hello World!"
?>
执行:php test.php
说明 php 是可用的。
2.2 php-fpm
能找到 php-fpm 相关的命令:
另外还在 /etc/init.d 下找到对应的启动项:
通过执行上述的指定,php-fpm 服务就已经启动了。
通过 ps 可以看到对应的服务进程:
可以看到有一个 master 与两个 woker。
在网上的资料说,php-fpm 是绑的 127.0.0.1:9000 端口。我们实际看:
是 unix:/run/php/php7.3-fpm.sock
与 php 相关的配置文件在 /etc/php/ 路径下。
三、配置 nginx + php-fpm
3.1 FastCGI 的工作原理
http的请求处理流程:
要将 nginx 与 php 的 fastcgi 进行组装,就要告诉 nginx php-fpm 的 unix domain socket 或 ip socket。
3.2 在nginx中添加新的服务
在 /etc/nginx/sites-enabled/ 路径下创建文件 mytest 作为一个新的服务,内容如下:
server {
listen 8000; # 这个 http 服务绑定在 8000 TCP端口上。
server_name localhost;
root /tmp/http; # 指定 root ,表示Web页面的路径。
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.3-fpm.sock; # 指定与 php-fpm 的通信 socket
include /etc/nginx/fastcgi.conf; # 通过导入文件,来指定FastCGI的参数与内容格式
}
}
每个 location 都是路由设置,表示对应的路径该怎么处理。
这里,我们定义了两个 location:
/ 如果没有指定资源路径,就去 root 路径下去找 index.htm, index.html, index.php 作为页面。
~ \.php$ 如果匹配到以 .php 结尾的资源,那么就使用 fastcgi 交给第三方的模块去处理。
我们重点分析 ~ \.php 的 location。
这里,我们使用的就是 php 的 fastcgi。由于 php-fpm 绑定的是域 socket unix:/run/php/php7.3-fpm.sock
unix:/run/php/php7.3-fpm.sock是通过以下方法找到的。
首先,找出 php-fpm 的进程号
查 1410 进程所占的资源有就有:
况且,在 /etc/php/7.3/fpm/pool.d/www.conf 中有:
所以 L38,fastcgi_pass 填写的就是unix:/run/php/php7.3-fpm.sock
完成了nginx的配置文件编写之后,使用 nginx -t -c /etc/nginx/nginx.conf 检查一下配置文件的语法是否有问题。
如果有错,则纠正,直止没错误为止。
3.3 编写测试Web页面
我们到 /tmp/http 路径下,创建 index.php 与 test.php 两个文件:
/tmp/http/index.php
echo phpinfo();
?>
/tmp/http/test.php
echo phpinfo();
?>
3.4 测试
使用命令重新加载配置:
nginx -s reload
然后使用浏览器尝试访问:http://192.168.0.139:8000
尝试一下:curl -v http://192.168.0.139:8000/test.php
成功了。