原来的服务器上写了一个Nginx的service用于开机自启,但是通过systemctl启动服务,总是不能代理网站。一直是502 Bad Gateway。service配置里写的启动命令手动输入就可以运行。
/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=nginx -c /www/server/nginx/conf/nginx.conf
ExecReload=/www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf -s reload
ExecStop=/www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
查了很多问题,Nginx正常启动了。但是网站就是502。发现配置文件里有
include enable-php-80.conf;
这么一行,可能是502 错误是因为 PHP-FPM 服务没有启动!nginx 正常运行了,但它无法连接到 PHP-FPM 来处理 PHP 文件。
root@linux:~# cat /www/server/panel/vhost/nginx/blog.ingke.net.conf
server
{
listen 80;
listen 443 ssl http2 ;
server_name blog.ingke.net;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/blog.ingke.net;
#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
include /www/server/panel/vhost/nginx/well-known/blog.ingke.net.conf;
#CERT-APPLY-CHECK--END
include /www/server/panel/vhost/nginx/extension/blog.ingke.net/*.conf;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/blog.ingke.net/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/blog.ingke.net/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-80.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/blog.ingke.net.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/blog.ingke.net.log;
error_log /www/wwwlogs/blog.ingke.net.error.log;
然后检查一下PHP_FPM是否运行
# 1. 检查 PHP-FPM 是否在运行
ps aux | grep php-fpm
# 2. 检查 PHP-FPM 监听端口/socket
netstat -tlnp | grep php
# 或者
ls -la /tmp/ | grep php
# 3. 查看 enable-php-80.conf 的内容
cat /www/server/nginx/conf/enable-php-80.conf
结果
root@linux:~# ps aux | grep php-fpm
root 599 0.0 0.0 344552 108 ? Ss Nov18 1:39 php-fpm: master process (/www/server/php/80/etc/php-fpm.conf)
www 2223597 0.1 3.4 351916 36288 ? S 06:52 0:35 php-fpm: pool www
www 2223598 0.1 2.8 347820 29912 ? S 06:52 0:35 php-fpm: pool www
www 2223604 0.1 3.2 348748 34260 ? S 06:52 0:35 php-fpm: pool www
www 2223605 0.1 3.6 353036 37952 ? S 06:52 0:35 php-fpm: pool www
www 2223606 0.1 3.6 352984 37988 ? S 06:52 0:35 php-fpm: pool www
www 2223607 0.1 3.1 348760 33316 ? S 06:52 0:35 php-fpm: pool www
www 2223608 0.1 3.3 352836 35240 ? S 06:52 0:35 php-fpm: pool www
www 2223614 0.1 3.1 347884 32560 ? S 06:52 0:35 php-fpm: pool www
www 2223615 0.1 3.5 352840 37500 ? S 06:52 0:35 php-fpm: pool www
www 2223616 0.1 3.6 352860 38492 ? S 06:52 0:35 php-fpm: pool www
root 2301954 0.0 0.1 3316 1748 pts/0 S+ 12:44 0:00 grep php-fpm
root@linux:~# netstat -tlnp | grep php
root@linux:~# cat /www/server/nginx/conf/enable-php-80.conf
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-80.sock;
fastcgi_index index.php;
include fastcgi.conf;
include pathinfo.conf;
}
root@linux:~#
PHP-FPM 正在运行,使用的是 Unix Socket:unix:/tmp/php-cgi-80.sock
当通过 systemd 启动 nginx 时,配置中的 PrivateTmp=true 导致 nginx 使用了独立的 /tmp 目录,所以找不到 /tmp/php-cgi-80.sock 这个文件!
这就是为什么手动启动可以(使用真实的 /tmp),而 systemctl 启动不行(使用隔离的 /tmp)。
现在检查这个 socket 文件:
root@linux:~# ls -la /tmp/php-cgi-80.sock srw-rw-rw- 1 www www 0 Nov 18 16:44 /tmp/php-cgi-80.sock
PrivateTmp=true 的作用:
- 为服务创建一个隔离的 /tmp 目录
- 这会导致 nginx 看不到真实 /tmp 下的 php-cgi-80.sock 文件
- 这就是 502 的根本原因
去掉service配置里的PrivateTemp就可以了
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=nginx -c /www/server/nginx/conf/nginx.conf
ExecReload=/www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf -s reload
ExecStop=/www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf -s quit
[Install]
WantedBy=multi-user.target
文章评论