V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
strayberry
V2EX  ›  程序员

请教 nginx 502 Bad Gateway 错误的问题

  •  
  •   strayberry · 2016-05-25 20:31:43 +08:00 · 3239 次点击
    这是一个创建于 3086 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查了一下 Nginx 502 Bad Gateway 的含义是请求的 PHP-CGI 已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致 PHP-CGI 进程终止。

    FastCGI 配置正确

    php-fpm.conf 如下

    [global]

    pid = /usr/local/php/var/run/php-fpm.pid

    error_log = /usr/local/php/var/log/php-fpm.log

    log_level = notice

    [www]

    listen = /tmp/php-cgi.sock

    listen.backlog = -1

    listen.allowed_clients = 127.0.0.1

    listen.owner = www

    listen.group = www

    listen.mode = 0666

    user = www

    group = www

    pm = dynamic

    pm.max_children = 10

    pm.start_servers = 2

    pm.min_spare_servers = 1

    pm.max_spare_servers = 6

    request_terminate_timeout = 900

    request_slowlog_timeout = 0

    slowlog = var/log/slow.log

    php-fpm.log 里面无报错

    请问可能是哪方面的原因 (lnmp 环境

    12 条回复    2016-05-26 15:38:07 +08:00
    strayberry
        1
    strayberry  
    OP
       2016-05-25 20:34:49 +08:00
    server {
    listen 80;
    server_name;
    set $root_path ' ';
    root $root_path;

    index index.php index.html index.htm;

    try_files $uri $uri/ @rewrite;

    location @rewrite {
    rewrite ^/(.*)$ /index.php?_url=/$1;
    }

    location ~ \.php {

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index /index.php;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
    root $root_path;
    }

    location ~ /\.ht {
    deny all;
    }
    }
    strayberry
        2
    strayberry  
    OP
       2016-05-25 20:35:31 +08:00
    上面为 nginx.conf 的 server 配置
    smallpath
        3
    smallpath  
       2016-05-25 20:51:56 +08:00
    502 的原因多了去了, 我遇到最悲惨的一次,是本地 npm install 一个包时没有加--save 参数, 部署时候 require 失败导致 502,足足花了十个小时才排错排出来
    haolisand
        4
    haolisand  
       2016-05-25 20:59:14 +08:00
    看看是不访问太多 php-fpm 进程不够用了
    moro
        5
    moro  
       2016-05-25 21:09:12 +08:00
    502 是服务端错误,你看 php-fpm 日志就可以了。
    Balthild
        6
    Balthild  
       2016-05-25 23:03:58 +08:00 via Android
    打开 php.ini 中 ERROR_REPORTING
    windfarer
        7
    windfarer  
       2016-05-25 23:09:28 +08:00
    nginx 部分配置的问题挺多的,
    先把
    fastcgi_pass 那句改成 fastcgi_pass unix:/tmp/php-cgi.sock
    试一下

    参考下这个 https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04
    DesignerSkyline
        8
    DesignerSkyline  
       2016-05-25 23:12:55 +08:00
    后端出错,检查后端配置是否正常, nginx 可以暂时先不管,因为只要 fastcgi_pass 对应 php 配置一致即可,可以用 127.0.0.1 也可以用 sock
    bdbai
        9
    bdbai  
       2016-05-25 23:16:53 +08:00 via Android
    @smallpath 配置一下 Node 输出 log 呗
    zcrdhm
        10
    zcrdhm  
       2016-05-26 08:45:58 +08:00
    一看楼上都是没有经验的。
    我来告诉楼主。
    我猜楼主的配置肯定是 centos6 系列或者是 redhat6 系列,用了 lnmp 结构,但是 PHP 选择了 5.2 系列。
    这个问题是 php 版本造成的。直接将 php 升级到 5.4 以上,就完美解决了。
    这个问题似乎就是操作系统和 nginx 与 php 版本兼容导致的。只发现在 centos 和 redhat 上出现问题, ubuntu 及其他,暂未发现。
    strayberry
        11
    strayberry  
    OP
       2016-05-26 10:32:19 +08:00
    已解决

    原因是
    自己修改过下面 2 处的配置,导致 nginx 配置文件里的设置和 php-fpm 上的设置不一样也会 502 。如果使用 unix 套接字,修改 /usr/local/php/etc/php-fpm.cnf 里设置, php 5.2 为

    /tmp/php-cgi.sock
    php 5.3 及以上版本为 listen = /tmp/php-cgi.sock ,同时 /usr/local/nginx/conf/nginx.conf 及其 /usr/local/nginx/conf/vhost/ 下面的虚拟主机配置里的 fastcgi_pass unix:/tmp/php-cgi.sock; 不一致就必定 502 。
    有时候 unix 套接字模式下可能会 502 ,可以尝试改成 tcp/ip 的方式 php 5.2 下

    /tmp/php-cgi.sock
    替换为

    127.0.0.1:9000
    php 5.3 及以上版本 listen = /tmp/php-cgi.sock 替换为 listen = 127.0.0.1:9000 , nginx 配置文件及虚拟主机配置文件里 fastcgi_pass unix:/tmp/php-cgi.sock;替换为 fastcgi_pass 127.0.0.1:9000; 之后重启试试。



    参考 https://lnmp.org/faq/lnmp-Nginx-502-Bad-Gateway.html
    benteke
        12
    benteke  
       2016-05-26 15:38:07 +08:00
    这么巧,我昨天在 LNMP 下装 phphub 时也碰到类似问题,看 nginx log ,说的是 php-fpm.sock no such file ,最终是在 V2EX 上搜帖子的时候发现一个妹子说可通过命令重新生成这个文件,还真解决了 502 问题。

    TCP/IP sockets 和 UNIX socket 那个好呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.