收藏文章 楼主

nginx错误解决方案大全

版块:网站建设   类型:普通   作者:小绿叶技术博客   查看:1657   回复:0   获赞:0   时间:2020-04-17 12:43:23

一、Nginx出现413 Request Entity Too Large错误解决方法

Nginx出现的413 Request Entity Too Large错误,这个错误一般在上传文件的时候出现,打开nginx主配置文件nginx.conf,找到http{}段,添加

打开nginx主配置文件nginx.conf,一般在/usr/local/nginx/conf/nginx.conf这个位置,找到http{}段,修改或者添加

client_max_body_size 2m;

然后重启nginx,

sudo /etc/init.d/nginxd reload

 即可。
要是以php运行的话,这个大小client_max_body_size要和php.ini中的如下值的最大值差不多或者稍大,这样就不会因为提交数据大小不一致出现错误。

post_max_size = 2M
upload_max_filesize = 2M

重启NGINX

kill -HUP `cat /usr/local/nginx/nginx.pid 

恢复正常。

二、nginx提示:Too many open files解决办法

nginx提示:Too many open files这种错误问题的原因是因为linux文件系统最大可打开文件数为1024而你的nginx中的error.log出现大量的Too many open files,说明文件句柄不够用了所以就错误提示出来了。

如果nginx的error.log出现大量的Too many open files,说明文件句柄不够用了,这时候我们需要加大系统的文件句柄数和nginx的允许最大的连接数。

默认情况下linux文件系统最大可打开文件数为1024,对于一个应用于生产环境下的服务器来说,这个设置太小,例如在用nginx做web服务器,当并发达到一定数量时,可以看到error.log里出现大量的“Nginx accept() failed (24: Too many open files)” 错误。解决这个问题的办法有两种:

方法一:使用ulimit -n 655350 把打开文件上限设置为655350,同时还需要修改nginx的配置文件,把worker_rlimit_nofile 值设置为一样。

1、更改系统文件句柄

vi /etc/security/limits.conf
root soft nofile 10240
root hard nofile 10240
nobody soft nofile 10240
nobody hard nofile 10240

增加以下内容:

通常我们只需要为root用户和nginx运行用户nobody增加文件句柄数,如果你需要为每个用户都增加该值,则可以加入以下内容:

* soft nofile 10240
* hard nofile 10240

方法二:在/etc/security/limits.conf文件中添加如下信息:
注意:通过ulimit修改打开文件上限只会影响当前shell环境,所以这是一个临时解决方法,终极解决方法使用方法二。

* soft nofile 655360
* hard nofile 655360

2、更改nginx.conf参数

找到worker_rlimit_nofile和worker_connections参数,将值改为:

vi /etc/nginx/nginx.conf
worker_rlimit_nofile 10240;
worker_connections 10240;

3、重新启动nginx

nginx -s reload
这样新的允许最大连接数就生效了。

4、检查error.log,看看是否还有Too many open files信息。如果仍然有大量该错误产生,则按照以上步骤继续加大文件句柄数。

注意:这个方法修改后必须重启机器才能使之生效。

三、nginx 502 Bad Gateway的解决方法总结

昨天自己的机器老提示502 Bad Gateway错误提示,下面小编来给大家总结关于nginx出现502 Bad Gateway的解决方法,有碰到此类问题的朋友可参考。

发生原因

1、PHP FastCGI进程数不够用 
当网站并发访问巨大时,php fastcgi的进程数不有一定的保障,因为cgi是单线程多进程工作的,也就是说cgi需要处理完一个页面后再继续下一个页面。如果进程数不够,当访问巨大的时候,cgi按排队处理之前的请求,之后的请求只有被放弃。这个时候nginx就会不时的出现502错误。

2、PHP FastCGI的内存不够用

当nginx返回静态页面时,这个问题一般不会出现,因为nginx不需要php cgi的处理而直接返回静态页面。但是当网页需要处理大量的php复杂操作的时候,例如执行api采集,或者采集页面的时候,那对php的要求是相当高的,如果配置给他的内存太少,那很容易就会导致php崩溃。


1、首先判断是不是php fastcgi进程数是否够用。 
netstat -anpo | grep "php-cgi" | wc -l 
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。 但是要注意计算你的内存是否足够支撑更多的进程数,如果物理机内存并不足够大,加大这个进程数是没有用处的。 
2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,如下: 
http 

...... 
fastcgi_connect_timeout 300; 
fastcgi_send_timeout 300; 
fastcgi_read_timeout 300; 
...... 

...... 
php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。 
如果以上方法依然不能解决问题,请尝试优化你的php程序,尽量的减少采集和数据库操作,加快其反应速度,有时候往往是因为自己的php程序反应速度太慢造成的。


3:目前lnmp一键安装包比较多的问题就是502 Bad Gateway,大部分情况下原因是在安装php前,脚本中某些lib包可能没有安装上,造成php没有编译安装成功。
解决方法:

可以尝试根据lnmp一键安装包中的脚本手动安装一下,看看是什么错误导致的,在网上搜索一下,或者把错误信息发上来。我们给你分析一下错误原因。

4:在php.ini里,eaccelerator配置项一定要放在Zend Optimizer配置之前,否则也可能引起502 Bad Gateway

第三种原因:
在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。(一般1个php-cgi占有20M内存,请依照内存来设定该值)
也有可能是max_requests值不够用。

5:php执行超时,修改/usr/local/php/etc/php.ini 将max_execution_time 改为300

第五种原因:
磁盘空间不足,如mysql日志占用大量空间

6:查看php-cgi进程是否在运行

可以通过# top 命令查看。


nginx反向代理解决办法有点不同

将nginx的error log打开,发现”pstream sent too big header while reading response header from upstream”这样的错误提示,查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大

apache返回的header  太大nginx处理不过来就导致了。

 代码如下复制代码

 
  server {
        listen       80;
        server_name  *.xywy.com ;

        large_client_header_buffers 4 16k;

        #charset koi8-r;

        # access_log off;

        location / {

#添加这3行 ,
                proxy_buffer_size 64k;
                proxy_buffers   32 32k;
                proxy_busy_buffers_size 128k;

           proxy_set_header Host $host;
           proxy_set_header X-Real-IP       $remote_addr;
           proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;

           set $baiduspider '';

           if ( $http_user_agent ~ Baiduspider) {
              set $baiduspider Baidu;
          }

............

 
 如果是 nginx+PHPcgi 就该 
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on
011/01/07 11:12:57 [error] 10770#0: *38585340 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 116.22.131.154, server: *.xywy.com, request: "GET /ysmp/index.php?did=124994 HTTP/1.0", upstream: "http://127.0.0.1:8080/ysmp/index.php?did=124994", host: "xywy.yn16.com"

 

后来原来那错误没了出了新错误了


upstream timed out 超时?

 代码如下复制代码

server {
        listen       80;
        server_name  *.xywy.com ;
  large_client_header_buffers 4 16k;
        client_max_body_size 300m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
                proxy_buffer_size 64k;
                proxy_buffers   4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
        #charset koi8-r;

        # access_log off;

request_terminate_timeout

  如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)问题解决了,执行很长时间也不会出错了。优化fastcgi中,还可以改改这个值5s 看看效果。

四、nginx提示:500 Internal Server Error错误

本文章来给大家总结了大量关于导致nginx中提示500 Internal Server Error错误的原因总结与解决方法分析有需要了解的朋友可参考参考。

1、硬盘空间满了

使用 df -k 查看硬盘空间是否满了。清理硬盘空间就可以解决500错误。nginx如果开启了access log,在不需要的情况下,最好关闭access log。access log会占用大量硬盘空间。

2、nginx配置文件错误

这里不是指语法错误,nginx如果配置文件有语法错误,启动的时候就会提示。当配置rewrite的时候,有些规则处理不当会出现500错误,请仔细检查自己的rewrite规则。如果配置文件里有些变量设置不当,也会出现500错误,比如引用了一个没有值的变量。

3、如果上面的问题都不存在可能是模拟的并发数太多了,需要调整一下nginx.conf的并发设置数

解决方法是:

1 打开/etc/security/limits.conf文件,加上两句

* soft nofile 65535 
* hard nofile 65535

2 打开/etc/nginx/nginx.conf 

在worker_processes的下面增加一行

worker_rlimit_nofile 65535;

3 重新启动nginx,重新载入设置

kill -9 `ps -ef | grep php | grep -v grep | awk '{print $2}'` 
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 100 -u www-data -f /usr/bin/php-cgi 
killall -HUP nginx

重启后再看nginx的错误日志,也没有发现500报错的情况了。

4、有可能是数据库问题我的在nginx日志php日志都没有发现什么问题, 最后发现数据库访问不了,修正后问题解决.

五、nginx 504 Gateway Time-out错误解决办法

我们经常会发现大量的nginx服务器访问时会提示nginx 504 Gateway Time-out错误了,下面我来总结了一些解决办法,有需要了解的同学可进入参考。

一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点

在nginx.conf里, 加入:

fastcgi_buffers 8 128k

这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点, 例如设置成60秒:

send_timeout 60;

我只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错

另一篇文章

首先是更改php-fpm的几处配置:

把max_children由之前的10改为现在的30,这样就可以保证 有充足的php-cgi进程可以被使用;

request_terminate_timeout由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。

接着再更改nginx的几个配置项,减少FastCGI的请求次 数,尽量维持buffers不变:

  fastcgi_buffers由 4 64k 改为 2 256k; 
  fastcgi_buffer_size 由 64k 改为 128K; 
  fastcgi_busy_buffers_size 由 128K 改为 256K; 
  fastcgi_temp_file_write_size 由 128K 改为 256K。

好了,重新加载php-fpm和nginx的配置,再次测试,至今两周时间内没有再出现504 Gateway Time-out的情况,算是达到效果了。

另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。 
apache-like


403 forbidden

1、由于启动用户和nginx工作用户不一致所致 

查看nginx的启动用户,发现是nobody,而为是用root启动的


命令:ps aux | grep "nginx: worker process" | awk' {print $1}'


将nginx.config的user改为和启动用户一致


2、缺少index.html或者index.php文件, 

就是配置文件中index index.html index.htm这行中的指定的文件。


 server {  

     listen       80;  

     server_name  localhost;  

     index  index.php index.html;  

     root  /data/www/;

 }

1

2

3

4

5

6

如果在/data/www/下面没有index.php,index.html的时候,直接文件,会报403 forbidden。


3、权限问题,如果nginx没有web目录的操作权限,也会出现403错误。


解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决


 chmod -R 777 /data


 chmod -R 777 /data/www/

1

2

3

4、SELinux设置为开启状态(enabled)的原因。


查看当前selinux的状态。


sestatus

1

将SELINUX=enforcing 修改为 SELINUX=disabled 状态。


 vi /etc/selinux/config

 #SELINUX=enforcing

 SELINUX=disabled

1

2

3

重启生效


nginx FastCGI sent in stderr: “Primary script unknown”

1、nginx的配置文件问题


即 /usr/local/nginx/nginx.conf (个人的,你们的路径不一定是这个)中的 fastcgi_param 参数配置问题,nginx默认配置为:


fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

1

  但是,如果你在nginx.conf 中设置了设置你本地的 root 目录(服务根目录),例如:


root           /var/www/console/frontend/www/;

1

那么需要将 fastcgi_param 参数修改为:


fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

1

配置完成后,尝试重启 nginx 和 php-fpm, 看下服务是否恢复了,如果没有恢复,请接着往下看:


2、默认的php-fpm.conf 中会 include 这个一个文件夹(可能会不同):


include=/usr/local/etc/php/7.1/php-fpm.d/*.conf 

   意思是把 php-fpm.d 文件夹下面的所有 .conf 结尾的文件都 include 进来,一般情况下,会在这些 .conf 文件中配置 user/group 

进行到这里,你可以执行一下下面这条命令,看下你目前的 php-fpm 是用什么身份运


 ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

1

特别的,在OS X 系统下,用户应该是 :


user = [your username]

group = staff

1

2

  如果发现用户不对,比如,你的身份是 admin ,但是上面命令的执行结果却是 nobody,那么你需要将 php-fpm.d 文件夹(或者其他文件夹,或者直接在 php-fpm.conf 中进行设置,视个人情况而定)下的 user 修改为你当前的身份,同样的,修改完成后重启 nginx 和 php-fpm 看下是否正常


如果还是不正常,那么请参考下其他的解决方案,不过大部分情况,上面两种case 应该都包含进去了。




提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:nginx错误解决方案大全

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息