一、nginx的502错误

    lnmp中错误率相当高的一种,使用curl或者浏览器访问时显示"502 Bad Getway",我总结了三条解决方法,但是可能还有其他原因造成。

    解决方法:

      1.配置错误引起

        因为我们的nginx是通过php的fastcgi进行连接的,所以在nginx的虚机主机配置文件中有一个地方和php的配置文件是必须设置成一样的。在lnmp中有两种监听方式:(1)tcp/ip方式(2)socket方式

fastcgi_pass值,这里的值必须要和/usr/local/php/etc/php-fpm.conf里面listen一样。(fastcgi_pass要根据php-fpm.conf的listen监听一样)

       XX.conf配置:


location ~ \.php$ {
        include fastcgi_params;
      #  fastcgi_pass unix:/tmp/php-fcgi.sock;
        
       fastcgi_pass 127.0.0.1:9000;





 php-fpm.conf配置


error_log = /usr/local/php/var/log/php-fpm.log
[www]
#listen = /tmp/php-fcgi.sock
listen = 127.0.0.1:9000





   2.用户权限问题

    因为我们的nginx的工作进程的属主属组是nobody

[root@centos-6 logs]# ps aux |grep nginx
root      5128  0.0  0.1  25016  1500 ?        Ss   Nov20   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    7420  0.0  0.3  26848  3528 ?        S    05:42   0:01 nginx: worker process                                          
nobody    7421  0.0  0.4  27196  4164 ?        S    05:42   0:00 nginx: worker process


     而php-fpm服务进程是php-fpm,两者的属主属组不一样,从而导致nginx的请求不能被php-fpm进程处理。


需要在php-fpm.conf配置中添加nobody的监听属主属组


error_log = /usr/local/php/var/log/php-fpm.log
[www]
#listen = /tmp/php-fcgi.sock
listen = 127.0.0.1:9000
listen.owner = nobody
listen.group = nobody

        

   3.资源耗尽导致

     在lnmp架构中,我们的nginx服务是直接调用php-fpm服务的fastcgi,如果nginx的请求量很高时,而我们给php-fpm的子进程(子进程可以在php-fpm.conf中设置)又很少,总有一天php-fpm的资源被耗尽,那么nginx就会找不到php-fpm的子进程。

     这个时候我们需要到php-fpm.conf调整pm_max_chilren(php-fpm最大启动多少个子进程)数值,但是也不能无限制的增加,毕竟服务器资源有限。查询资料后,是4G的服务器,如果只跑nginx服务和php-fpm服务,不跑mysql服务,可以设置150,如果是8G服务器可以设置300,以此类推。

     502错误原因可能还有其他的,不再列举。


#####################################################################################################


二、nginx的错误日志级别

   nginx的错误日志路径:/usr/local/nginx/logs/nginx_error.log       (错误日志路径可以在nginx.conf下自定义)

   php的错误日志路径:/usr/local/php/var/log/php-fpm.log              (日志可以在php-fpm.conf下自定义)

  

     nginx的错误日志记录有6个级别:debug, info, notice, warn, error, crit ,默认是crit,

     需要在nginx的nginx.conf里面修改




crit 记录的日志最少,而debug记录的日志最多。如果有一些很深的bug,使用crit级别可以无法记录,就需要临时改成更高级别。如 你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。



调整日志级别使用error_log指令 : error_log /your/path/nginx/logs/nginx_error.log crit;



如:error_log /usr/local/nginx/logs/nginx_error.log debug;



debug只能临时改成,看完日志后要改回crit,防止错误日志把磁盘撑满。