nginx + php-fpm 是现在常常用来与代替以前的 php apache 伺服器,其最大的优点是使用的系统资源较少,并且 nginx 对于静态档案的处理速度非常快,本篇将讲解 nginx 与 php-fpm 之间是如何运作的。
nginx 是什麼 ?
首先来了解一下 nginx 是什麽,nginx 是一个 web server,其主要功能是反向代理、负载平衡器和 HTTP 快取,nginx 本身就能够做一个静态档案伺服器,现在最常主要负责:
处理静态档案
依据规则转发 request
资料压缩 (gzip)
传输的资料加密 (https)
其没有一定要用于 php,可以依据情况将 request 丢给其他程式语言处理,或是将 request 丢给不同的 php 版本处理。
php-fpm 是什麼 ?
fpm 是 FastCGI Process Manager 的缩写,其功能非常的单纯,专门接收特定 request 并且运行 php 脚本产生结果。
fpm-fpm 可以启动多个 child process 来运行 php 脚本,有效的使用多核心 cpu 的效能
而每个 process 并不是 request 执行完就关闭,而是会先閒置,等待处理下一个 request,如果閒置太久,且已经太多 process 都閒置状态才会关闭,所以不会有反覆启动 processs 导致资源浪费。
例如下面得設定
pm.start_servers = 4
pm.max_children = 10
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
其效果为:
伺服器启动时就开启 4 个 process
最多 10 个 children process
最小閒置 process 数量
最大閒置 process 数量
一个 process 处理 500 个 request 后会重启
nginx 與 php-fpm 運作說明
这边以常见的 php-fpm 设定来说明
server {
gzip on;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
这设定有几项规则:
启用压缩 (gzip)
url path 是以 .php 结尾的丢给 php-fpm 处理
其他 request 检查该路径是否是档案或资料夹,如果是传回档案,否则回应 404 not found
而静态档案与 PHP 的 request 实际运作经过是不同的,下面图片解说
檔案 request 的運作
1.客户端发送 request
2.nginx 寻找到对应的档案并读取
3.返回档案的资料给使用者
PHP request (.php 結尾的 request) 的運作
1.客户端发送 request
2.将 request 丢给 php-fpm 来处理
3.php-fpm 找到对应的 php 脚本档案并且执行
4.讲脚本执行的结果丢回给 nginx
5.nginx 将结果返回给使用者
常見問題
網頁出現 504 Gateway timeout 原因與解決方法?
以上面这张图解说,nginx 转发 request 给 php-fpm 后会开始等 output,而 nginx 会设定一个等待回应 timeout 的设定值,假如 php-fpm 超过这个时间都没有回应 (php执行太久) 那就会显示 504 Gateway timeout
※ 预设 php-fpm 是没有设定执行时间上限
解决方法有两种:
1.调高 nginx 的等待时间
调整 nginx.conf 设定 fastcgi_read_timeout:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_read_timeout 300;
}
2.降低 php-fpm 的可执行时间上限
调整 php-fpm 的 php.ini 设定 max_execution_time:
max_execution_time = 30
参考:conson