nginx是一个高性能的web服务器,它可以处理静态文件和反向代理的请求,但是它不知道如何运行php脚本。为了让nginx能够支持php,我们需要使用一个php模块,比如php-fpm(FastCGI Process Manager),它可以在nginx外部创建自己的进程,然后通过FastCGI协议与nginx通信。这样,当用户请求一个php页面时,nginx就会把请求转发给php-fpm,然后把php-fpm返回的结果发送给用户。这种方式比传统的CGI或者mod_php更快更节省资源,也更方便管理和配置。
要在nginx里集成php模块,需要完成以下几个步骤:
第一步:安装php-fpm
我们假设已经安装了最新版本的php(>= 7.3),那么可以使用apt-get命令来安装php-fpm:
sudo apt-get install php7.3-fpm
安装完成后,php-fpm服务会自动启动,可以使用systemctl命令来查看它的状态:
systemctl status php7.3-fpm
应该看到类似这样的输出:
php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago
Docs: man:php-fpm7.3(8)
Main PID: 32210 (php-fpm7.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1152)
CGroup: /system.slice/php7.3-fpm.service
├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─32235 php-fpm: pool www
└─32236 php-fpm: pool www
第二步:配置php-fpm池
php-fpm服务会创建一个默认的池,它的配置文件(www.conf)可以在/etc/php/7.3/fpm/pool.d目录下找到。可以根据的需求来修改默认的池,或者创建新的池。一般来说,建议为每个网站或者应用创建单独的池,这样可以更好地控制每个php-fpm进程的资源分配和权限。
在这里,我们假设只有一个网站或者应用,那么可以使用默认的池。需要注意以下几个重要的参数:
- user和group:指定运行php-fpm进程的用户和组,默认是www-data,可以根据的实际情况进行修改。
- listen:指定监听请求的方式,可以是tcp端口(例如127.0.0.1:9000)或者unix套接字(例如/var/run/php/php7.3-fpm.sock)。一般来说,使用unix套接字会更快更安全。
- pm:指定进程管理器的模式,可以是static(固定数量)、dynamic(动态调整)或者ondemand(按需启动)。一般来说,dynamic模式比较适合大多数场景。
- pm.max_children:指定最大允许的子进程数量,这个值取决于的服务器性能和负载情况。
- pm.start_servers:指定启动时创建的子进程数量,在dynamic模式下有效。
- pm.min_spare_servers:指定最小空闲子进程数量,在dynamic模式下有效。
- pm.max_spare_servers:指定最大空闲子进程数量,在dynamic模式下有效。
- pm.max_requests:指定每个子进程处理的最大请求数,在达到该值后会重启子进程,防止内存泄漏。
可以根据的实际情况进行调整,或者使用默认的值。修改完配置文件后,需要重启php-fpm服务:
sudo systemctl restart php7.3-fpm
第三步:配置nginx
要让nginx能够与php-fpm通信,需要在nginx的配置文件中添加一些指令。可以在/etc/nginx/sites-available目录下创建一个新的配置文件,或者修改默认的配置文件(default)。在这里,我们假设创建了一个名为example.com的配置文件,它的内容如下:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
}
这个配置文件的含义如下:
- listen 80:指定监听80端口。
- server_name example.com www.example.com:指定处理example.com和www.example.com域名的请求。
- root /var/www/example.com:指定网站的根目录。
- index index.php:指定默认的索引文件。
- location /:匹配所有的请求,使用try_files指令来检查请求的文件是否存在,如果不存在,则重写到index.php文件。
- location ~ .php$:匹配所有以.php结尾的请求,使用include指令来引入fastcgi.conf文件,它包含了一些通用的FastCGI参数。然后使用fastcgi_pass指令来指定php-fpm监听的unix套接字。最后使用fastcgi_buffers和fastcgi_buffer_size指令来调整缓冲区的大小。
修改完配置文件后,需要创建一个软链接到/etc/nginx/sites-enabled目录,以便nginx能够读取它:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
然后需要测试nginx的配置是否正确:
sudo nginx -t
如果没有错误,应该看到类似这样的输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
最后,需要重启nginx服务:
sudo systemctl restart nginx
第四步:测试nginx和php-fpm
要测试nginx和php-fpm是否正常工作,可以在网站根目录下创建一个名为info.php的文件,它的内容如下:
然后可以通过浏览器访问example.com/info.php,应该看到类似这样的页面:
这个页面显示了php的一些信息,证明了nginx和php-fpm已经成功集成了。