备注:php我用的版本是7.1.4的,最新的版本,之前用5.6版本的时候没有出现过这个问题
使用lnmp一键安装包搭建lnmp环境后,使用yii2.0框架测试时出现502报错,看到这个问题,
我立刻想到是php-fpm没有起来,但是我用 ps -ef | grep php-fpm 截取 php-fpm 的进程,发现是有的
按照YII2.0官网的Nginx 配置如下
1 server { 2 charset utf-8; 3 client_max_body_size 128M; 4 5 listen 80; ## listen for ipv4 6 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 7 8 server_name mysite.local; 9 root /path/to/basic/web; 10 index index.php; 11 12 access_log /path/to/basic/log/access.log; 13 error_log /path/to/basic/log/error.log; 14 15 location / { 16 # Redirect everything that isn't a real file to index.php 17 try_files $uri $uri/ /index.php$is_args$args; 18 } 19 20 # uncomment to avoid processing of calls to non-existing static files by Yii 21 #location ~ .(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { 22 # try_files $uri =404; 23 #} 24 #error_page 404 /404.html; 25 26 location ~ .php$ { 27 include fastcgi_params; 28 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 29 fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php; 30 #fastcgi_pass unix:/tmp/php-cgi.sock;
31 try_files $uri =404;
32 }
33
34 location ~* /. { 35 deny all; 36 } 37 }
其实问题就出现在 fastcgi_pass 127.0.0.1:9000;
备注:php我用的版本是7.1.4的,最新的版本,之前用5.6版本的时候没有出现过这个问题
思路:发现php-fpm的listen是unix sock方式运行的,问题可能出在php-fpm上。
1、打开 /user/local/php/etc/php-fpm.conf 其中配置如下
1 [global] 2 pid = /usr/local/php/var/run/php-fpm.pid 3 error_log = /usr/local/php/var/log/php-fpm.log 4 log_level = notice 5 6 [www] 7 listen = /tmp/php-cgi.sock 8 listen.backlog = -1 9 listen.allowed_clients = 127.0.0.1 10 listen.owner = www 11 listen.group = www 12 listen.mode = 0666 13 user = www 14 group = www 15 pm = dynamic 16 pm.max_children = 20 17 pm.start_servers = 10 18 pm.min_spare_servers = 10 19 pm.max_spare_servers = 20 20 request_terminate_timeout = 100 21 request_slowlog_timeout = 0 22 slowlog = var/log/slow.log
2、我在网上也查看了下,说是其中
fastcgi_pass为配置nginx与php-fpm的交互路径,一般有两种方式
sock方式:fastcgi_pass unix:/tmp/php-cgi.sock;
http方式:fastcgi_pass 127.0.0.1:9000;
任选其中一种即可,
但必须和php-fpm的配置一致。
但必须和php-fpm的配置一致。
但必须和php-fpm的配置一致。
后来我就在nginx的配置文件中加上一下代码
location ~ .php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php; try_files $uri =404; 32 }
3、同时修改php-fpm的配置文件php-fpm.conf,将listen = 127.0.0.1:9000改为
listen = /tmp/php-cgi.sock
#这个是设置 /tmp/php-cgi.sock 权限用的
listen.owner = www
listen.group = www
listen.mode = 0660
再次重启ngix和php-fpm,问题解决
总结:
1、其实这个问题总体就是nginx与php-fpm的交互问题,看我们选择是sock方式还是http方式,但是不管选择哪一种,我们都需要统一
2、我在网上看到有人说将max_children 进程改大,其实这种情况我之前遇到过,它适用于本来php运行正常,突然出现502的问题,这个问题是php-fpm队列满了,出现连接拒绝的错误。
3、还有人说将php-fpm配置文件里有backlog,backlog是linux服务器在socket处理连接数的定义,phpfpm默认为-1,将-1改为4096,重启php-fpm问题。
4、其实我们不管选择哪一种,主要是针对自己的问题,先要看报错,然后再对症下药,不要这一种试试那一种试试。