清科谷体的博客

  • 文章
  • 关于
  • 联系
  • 隐私政策

  1. 首页
  2. 建站
  3. 正文

记录一次Nginx添加service服务无法工作的解决

2025年12月13日 11点热度 0人点赞 0条评论

原来的服务器上写了一个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
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2025年12月13日

ingker

自娱自乐

点赞
< 上一篇

文章评论

取消回复

COPYRIGHT © 2025 清科谷体's blog. ALL RIGHTS RESERVED.
THEME KRATOS MADE BY VTROIS | MODIFIED BY INGKER

正在加载今日诗词....

本站已运行