• jimmy Windows 7    8月2日 17:56

    微博分享

    标签: Nginx 502

    第一种原因:

    安装lnmp一键安装包时php没安装成功而出现502 Bad Gateway,从0.9开始只要安装成功或失败都就会有提示。没安装成功一般原因是在安装php前,脚本中某些lib包可能没有安装上,造成php没有编译安装成功。可以看一下是否存在/usr/local/php/sbin/php-fpm ,如果没有肯定没安装成功

    解决方法:

    可以尝试根据lnmp一键安装包中的脚本手动安装一下,看看是什么错误导致的,在网上搜索一下,或者把错误信息发上来。如果实在不会提供按http://lnmp.org/install.html这个安装时的lnmp.log日志文件(可以用winscp登陆下载lnmp.log,压缩并上传到本论坛),没有错误信息我们没法说什么原因。本方法只限于lnmp没安装成功,只要lnmp安装成功了这一项就没可能。

    第二种原因:

    在php.ini里,eaccelerator配置项一定要放在Zend Optimizer配置之前,否则也可能引起502 Bad Gateway。php一些模块之间也可能会造成502,如Zend GuardLoader与Opcache,ioncube与Zend GuardLoader等,一般可以通过注释掉一个然后重启php-fpm,然后看是否还502进行排除。

    第三种原因:

    在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加,如果php已升级到5.3.*以上且使用的是dynamic模式,需要调整pm.min_spare_servers和pm.max_spare_servers的值适当增加。最大值可以按内存xxMB/2/20 的整数来算(内存以MB为单位进行计算,/ 为除,取整数),最小值可以按内存/2/40 的整数来算,可以少点或多大,可以自己调整运行看看,同时pm.max_children也调整为和pm.max_spare_servers的值一样。

    也有可能是max_requests值不够用。

    第四种原因:

    php执行超时,修改/usr/local/php/etc/php.ini 将max_execution_time 改为300 或直接改成0 不限制,同时还需要修改/usr/local/php/etc/php-fpm.conf 调整request_terminate_timeout的值

    再/etc/init.d/php-fpm restart重启使其生效。

    第五种原因:

    磁盘空间不足,如mysql日志占用大量空间清理一下磁盘上的文件,有部分剩余空间,重启即可恢复。

    第六种原因:

    查看php-cgi或php-fpm进程是否在运行

    第七种原因:

    将nginx.conf里的

    fastcgi_connect_timeout

    fastcgi_send_timeout

    fastcgi_read_timeout都调大一点。

    第八种可能原因:

    按日志可能是php打开文件数的限制

    打开php-fpm.conf 找到 rlimit_files 改成:65535

    编辑 /etc/security/limits.conf 加上:

    * soft nofile 65535

    * hard nofile 65535

    编辑/etc/sysctl.conf  底部添加fs.file-max=65535

    echo "ulimit -SHn 65535" >> /etc/rc.local

    九、不要按网上找到的教程随便修改配置,网上找到的可能会路径不一样,也可能会导致502或有相关的错误产生,例如网上其他的教程可以使用的是9000端口,而lnmp默认使用socket,你如果按网上的教程设置的端口或socket路径不一样那肯定100% 502无疑。

    LNMP默认使用unix套接字,虚拟主机配置文件里 fastcgi_pass参数为unix:/tmp/php-cgi.sock; 需要确保/usr/local/php/etc/php-fpm.cnf 里的设置,php 5.2为<value name=“listen_address”>/tmp/php-cgi.sock</value> 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下<value name=“listen_address”>/tmp/php-cgi.sock</value>替换为<value name=“listen_address”>127.0.0.1:9000</value>  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;  之后重启试试。

    十、如果虚拟主机的日志文件过大也可能会造成502问题。

    建议定期清空一下虚拟主机的日志文件。

    十一、有些程序或者程序的主题有死循环或其他非常占用资源的代码也可能会引起502,可以尝试暂时注释掉可能的主机的配置文件,重启看看是否还会502。

    十二、如果以上方法都试过,但还有时会出现502错,可以尝试添加502自动重启脚本:

    推荐脚本
    需要确保系统已安装curl,centos可以执行:yum install curl,debian/ubuntu可以执行:apt-get install curl 
    
    用winscp或vi有或nano在/root目录下创建502.sh 内容如下:
    复制内容到剪贴板
    代码:
    #!/bin/bash
    # author: licess
    # website: http://www.k82.org
    
    CheckURL="https://www.k82.net"
    
    STATUS_CODE=`curl -o /dev/null -m 10 --connect-timeout 10 -s -w %{http_code} $CheckURL`
    #echo "$CheckURL Status Code:\t$STATUS_CODE"
    if [ "$STATUS_CODE" = "502" ]; then
            /etc/init.d/php-fpm restart
    fi
    chmod +x /root/502.sh 
    用crontab 一分钟执行一次。

    其他的重启脚本,下面这个如果php函数里禁用了shell_exec 将无法使用。

    #!/usr/bin/php
    <?
    $url = 'https://www.k82.org';
    $cmd = '/etc/init.d/php-fpm restart';
    
    for($i = 0; $i < 5; $i ++){
    $exec = "curl --connect-timeout 3 -I $url 2>/dev/null";
    $res = shell_exec($exec);
    
    if(stripos($res'502 Bad Gateway') !== false){
    shell_exec($cmd);
    exit();
    }
    }
    ?>

    用crontab 一分钟执行一次。 url和cmd根据自己的改。

    原理就是用curl获取HTTP头,发现502状态码就执行重启php-fpm的命令。

    十三、实在找不到原因可以开启slowlog看看慢日志是否有相关有用的信息:

    你可以编辑/usr/local/php/etc/php-fpm.conf 开启slowlog 慢日志看看

    里面有个request_slowlog_timeout参数,后面设置多少秒就是执行超过设置时间的就会被记录下来

    日志一般在/usr/local/php/var/log/slow.log,这个配置文件里都有具体的设置选项

    上一篇:linux常用命令

    下一篇:wamp server 3.0.6允许局域网内访问

  • 亲,使用会员登录 QQ帐号登录 后,在线交流才会学到更多知识哦~