💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# Nginx 401 unauthorized 意思是请求压根就没有被认证,或者认证不正确,重新输入账号密码认证。 # Nginx 403 forbidden 认证过了,但是没有权利访问 或者访问目录下缺少对应文件比如 index.php index.html # Nginx 404 not found 访问的资源不存在 # Nginx 405 not allowed Nginx 用POST访问静态资源就会产生405 # Nginx 500 Internal Server Error **出错原因:** * php语法错误。 * Nginx打开文件数受限制 * 磁盘空间满了  df -h **解决:** * 排查错误日志 * 如果是 too many open files, 修改 worker\_rlimit\_nofile参数 * ulimit -a 查看系统最大打开文件数,修改 /etc/security/limits.conf * 修改了还是500 那就得做负载均衡了,把请求分散到不同服务器。 * 如果是脚本错误修改代码。 ```php # Nginx 最大打开文件数 vim /etc/nginx.conf worker\_rlimit\_nofile 65535; # 系统允许打开的最大文件数 vim /etc/security/limits.conf soft 告警设定 、 hard 严格设定 【去掉内存限制】 * soft memlock unlimited * hard memlock unlimited 【每个用户创建的最大进程数】 * soft nproc 65535 * hard nproc 65535  【每个进程可以打开的最大文件数】 * soft nofile 65535 #最大打开文件数 默认是1024 * hard nofile 65535 # 系统所有进程一共可以打开的文件数量 vim /etc/sysctl.conf fs.file-max = 6553560 重启生效 ``` # Nginx 502 Bad GateWay Nginx 请求已经发给了php-fpm,但是过了等待超时时间后,请求还是迟迟没有返回,导致php-cgi进程终止执行了。 Nginx 502 Bad Gateway 和 php-fpm.conf 的设置有关。 Nginx 504 Gateway Time-out 则是与 nginx.conf的设置有关。 在php.ini和php-fpm.conf中分别有这样两个配置项:**max_execution_time**和**request_terminate_timeout**。 这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这两个个时间时,PHP-FPM不只会终止脚本的执行,而且还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。 **max_execution_time 和 request_terminate_timeout计算方式** 如果服务器性能足够好,且宽带资源足够充足,PHP脚本没有死循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让 PHP-CGI 一直执行下去而没有时间限制。 如果做不到这一点,也就是说PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据服务器的性能进行设定。一般来说性能越好你可以设置越高,20 - 30分钟都可以。 max_children这个值原则上是越大越好。php-cgi的进程多了就会处理的很快,排队的请求就会很少。 设置max_children也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,如果max_children设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于有效内存1Gb。而如果”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。 **fpm返回的头部太大Nginx缓冲有限** 对于来自 FastCGI Server 的 Response,Nginx 将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数 **fastcgi_buffers 8 32k;** nginx 最多创建 8 个大小为 32K 的缓冲区 **fastcgi_buffer_size 32k; ** 处理 Response 时第一个缓冲区的大小,不包含在前者中。所以总计能创建的最大内存缓冲区大小是 8\*32kK+32K。 缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,没意义 **fastcgi_cache TEST;** 开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防止502错误发生. **fastcgi_busy_buffers_size 128k;** 默认值是fastcgi_buffer的2倍 **fastcgi_temp_file_write_size 128k;** 写入缓存文件使用多大的数据块,默认值是fastcgi_buffer的2倍 应答代码缓存时间,200和302应答缓存为1个小时,301一天,其他1分钟 fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; **nginx的负载均衡Proxying** **proxy_buffering on;** 开启从后端被代理服务器的响应body缓冲。 **proxy_buffers 256 8k;** 开辟256个长度为8k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。 **proxy_buffer_size 16k; ** 指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。 **proxy_busy_buffers_size** 用来设置处于busy状态的buffer有多大。 nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。 1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端; 2)如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端; **proxy_max_temp_file_size** 设置临时文件的总大小 **proxy_temp_file_wirte_size** 设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。 php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。 # Nginx 503 服务器占时不可用 请求打到了Nginx,如果Nginx配置了请求限制和链接限制,就会出现503。 503 就是访问量过大,请求被拒绝了。 解决办法,只能升级服务器,配置反向代理负载均衡。 如果服务器没有问题,检查程序是否有内存泄漏,或者有死循环。 # Nginx 504 Gateway Timeout Nginx将请求转发给php-fpm的时候,php那边没有worker接受。 **解决办法:** 平滑重启 php-fpm 释放内存 修改nginx.conf ``` http client_header_timeout 60; #建立连接后,nginx 在规定时间内没有收到http头部,则返回给客户端408 request time out client_body_timeout 60; #读取http body的超时时间 send_timeout 60 # nginx向客户端发送数据包,如果规定时间内没有收到客户端响应则超时 keepalive_timeout 70; # 闲置长连接的超时时间,过了70秒后服务端会主动释放链接 resolve_timeout 30; # 域名解析超时时间 fastcgi fastcgi_connect_timeout 300 #链接到fastcgi的超时时间 默认是60 fastcgi_send_timeout 300 #nginx进程发送给php-fpm的超时时间 默认是60 fastcgi_read_timeout 300 #nginx接受php-fpm响应的超时时间 默认是60 代理 proxy_connect_timeout 60; # nginx服务器与代理服务器链接的超时时间 proxy_send_timeout 60; # nginx服务器向代理服务器发送数据的超时时间 proxy_read_timeout 60; # nginx服务器接受代理服务器响应的超时时间 ```