>  기사  >  운영 및 유지보수  >  nginx에서 오류 502를 보고하면 어떻게 해야 합니까? 솔루션 공유

nginx에서 오류 502를 보고하면 어떻게 해야 합니까? 솔루션 공유

青灯夜游
青灯夜游앞으로
2022-03-04 16:07:539053검색

nginx에서 오류 502를 보고하면 어떻게 해야 하나요? 이 기사에서는 nginx 오류 502에 대한 해결책에 대해 설명합니다. 모든 사람에게 도움이 되기를 바랍니다!

nginx에서 오류 502를 보고하면 어떻게 해야 합니까? 솔루션 공유

http 요청 프로세스: 일반적인 상황에서 동적 요청을 제출할 때 nginx는 요청을 php-fpm으로 직접 전송하고 php-fpm은 관련 요청을 처리하기 위해 php-cgi 프로세스를 할당한 다음 반환합니다. , 그리고 마지막으로 nginx는 결과를 클라이언트 브라우저에 다시 제공합니다.

Nginx 502 잘못된 게이트웨이 오류는 FastCGI의 문제입니다

Solution

502 문제가 발생하면 다음 두 단계를 우선적으로 수행하여 문제를 해결할 수 있습니다.

1. 현재 PHP FastCGI 프로세스 수가 충분한지 확인하세요(max_children 값).

netstat -anpo | grep "php-cgi"| wc -l

사용된 실제 "FastCGI 프로세스 수"가 미리 설정된 "FastCGI 프로세스 수"에 가까우면 " FastCGI 프로세스 수"로는 충분하지 않으며 늘려야 합니다.

2. 일부 PHP 프로그램의 실행 시간이 Nginx의 대기 시간을 초과합니다(php 메모리 부족).

nginx.conf 구성 파일에서 FastCGI 시간 초과 시간을 늘립니다. 예: php의

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

.ini memory_limit=64M, nginx를 다시 시작하세요. memory_limit=64M,重启nginx。

如果这样修改了还解决不了问题,可以参考下面这些方案:

3、max-children和max-requests

一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右

最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了

检查php-fpm的日志文件发现了一些线索:

    Sep3008:32:23.289973[NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200,cur:51200
    Sep3008:32:23.290212[NOTICE] fpm_sockets_init_main(), line 371:using inherited socket fd=10,“127.0.0.1:9000″
    Sep3008:32:23.290342[NOTICE] fpm_event_init_main(), line 109: libevent:using epoll
    Sep3008:32:23.296426[NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf

调大以下两个参数(根据服务器实际情况,过大也不行)

    <valuename=”max_children”>5120</value>
    <valuename=”max_requests”>600</value>

然后重启php-fpm。

5、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

6、request_terminate_timeout

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

这个值是max_execution_time

이 수정 후에도 문제가 해결되지 않으면 다음 해결 방법을 참조할 수 있습니다.

3, max-children 및 max-requests

nginx php (fpm) xcache가 평균적으로 서버에서 실행 중입니다. 일일 방문량 300W pv 정도

최근 이런 상황이 자주 발생합니다. PHP 페이지가 매우 느리게 열리고, CPU 사용량이 갑자기 매우 낮은 수준으로 떨어지며, 시스템 부하가 갑자기 매우 높은 수준으로 올라가고, 네트워크 카드의 트래픽이 갑자기 매우 낮은 수준으로 떨어지는 것을 발견할 수도 있습니다. 이 상황은 몇 초만 지속되었다가 회복되었습니다

php-fpm의 로그 파일을 확인하고 몇 가지 단서를 찾았습니다:

netstat -anpo | grep “php-cgi” | wc -l

이 문장 앞에는 하위 항목 닫기 및 하위 항목 열기에 대한 로그가 1,000줄 이상 있습니다

It php-fpm에는 종료되기 전에 각 하위 항목이 처리할 수 있는 최대 요청 수를 지정하는 max_requests 매개변수가 있습니다. PHP는 각 하위 항목에 대한 요청을 폴링하기 때문에 트래픽이 많은 경우 각 하위 항목은 max_requests에 도달하는 데 거의 동일한 시간이 걸리며 이로 인해 기본적으로 모든 하위 항목이 동시에 닫힙니다.

이 기간 동안 nginx는 처리를 위해 PHP 파일을 php-fpm으로 전송할 수 없으므로 CPU가 매우 낮은 수준으로 떨어지고(SQL 실행은 물론 PHP를 처리할 필요도 없음) 부하가 매우 높아집니다. 수준(자식 닫기 및 열기, nginx php-fpm 대기 중), 네트워크 카드 트래픽도 매우 낮은 수준으로 떨어졌습니다(nginx는 클라이언트에 전송할 데이터를 생성할 수 없음)🎜🎜자식 수를 늘리고 max_requests를 다음으로 설정하세요. 0보다 작거나 큰 값: 🎜🎜Open /usr/local/php/etc/php-fpm.conf🎜🎜다음 두 매개변수를 추가합니다(서버의 실제 상황에 따라 다름) 크면 작동하지 않습니다)🎜rrreee🎜그런 다음 php-fpm을 다시 시작하세요. 🎜🎜🎜5. 버퍼 용량 늘리기 🎜🎜🎜nginx 오류 로그를 열고 "업스트림에서 응답 헤더를 읽는 동안 pstream이 너무 큰 헤더를 보냈습니다."와 같은 오류 메시지를 찾습니다. 정보를 확인한 결과, nginx 버퍼에 버그가 있는 것으로 나타났습니다. 당사 웹사이트의 페이지 소비에 사용되는 버퍼가 너무 클 수 있다는 것입니다. 외국인이 작성한 수정 방법을 참고하면 버퍼 용량 설정이 늘어나 502 문제가 완전히 해결되었습니다. 나중에 시스템 관리자는 매개변수를 조정하고 클라이언트 헤드 버퍼와 fastcgi 버퍼 크기라는 두 가지 설정 매개변수만 유지했습니다. 🎜🎜🎜6. request_terminate_timeout🎜🎜🎜 502가 주로 정적 페이지 작업에서 발생하지 않고 일부 게시물이나 데이터베이스 작업 중에 발생하는 경우 php-fpm.conf 설정 중 하나를 확인할 수 있습니다: request_terminate_timeout 🎜🎜이 값은 fast-cgi의 실행 스크립트 시간인 max_execution_time입니다. 🎜🎜0s가 종료되었습니다. 즉, 무기한 계속된다는 의미입니다. (드레싱할 때 잘 보지 않고 숫자를 바꿨어요) 🎜🎜 fastcgi 최적화 시 이 값을 5초 동안 바꿔서 효과를 볼 수도 있습니다. 🎜🎜php-cgi 프로세스 수가 부족하거나, php 실행 시간이 길거나, php-cgi 프로세스가 종료되면 502 오류가 발생합니다. 🎜🎜🎜확장 지식: 🎜🎜🎜Nginx 502 Bad Gateway는 요청한 PHP-CGI가 실행되었으나 어떤 이유로(보통 리소스 읽기 문제) 인해 실행되지 않고 PHP-CGI 프로세스가 종료되었음을 의미합니다. 일반적으로 Nginx 502 Bad Gateway는 php-fpm.conf 설정과 관련이 있는 것으로 보입니다. 🎜🎜 php-fpm.conf에는 두 개의 중요한 매개변수가 있습니다. 하나는 max_children이고 다른 하나는 request_terminate_timeout이지만 이 값은 보편적이지 않으며 직접 계산해야 합니다. 설치 및 사용 중 502 문제가 발생하는 경우는 대개 기본 php-cgi 프로세스가 5이기 때문입니다. php-cgi 프로세스가 부족하여 발생할 수도 있습니다. /usr/local/php/etc/php-를 수정해야 합니다. fpm.conf max_children 값을 적절하게 늘리십시오. 🎜🎜 계산 방법은 다음과 같습니다. 🎜

 如果你服务器性能足够好,且宽带资源足够充足,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左右

 按照官方的答案,排查了相关的可能,并结合了网友的答案,得出了下面的解决办法。

 1、查看php fastcgi的进程数(max_children值)

netstat -anpo | grep “php-cgi” | wc -l

5(假如显示5)

2、查看当前进程

 top观察fastcgi进程数,假如使用的进程数等于或高于5个,说明需要增加(根据你机器实际状况而定)

 3、调整/usr/local/php/etc/php-fpm.conf 的相关设置

 19b28ecdcb02fd02e7977bafb610285a104b175f9a50d57c75316becd702e959dc46f80ce9d85bf57c6302aebe0e298a8260s4b175f9a50d57c75316becd702e959dcmax_children最多10个进程,按照每个进程20MB内存,最多200MB。request_terminate_timeout执行的时间为60秒,也就是1分钟。

推荐教程:nginx教程

위 내용은 nginx에서 오류 502를 보고하면 어떻게 해야 합니까? 솔루션 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제