Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was soll ich tun, wenn Nginx den Fehler 502 meldet? Lösungsaustausch

Was soll ich tun, wenn Nginx den Fehler 502 meldet? Lösungsaustausch

青灯夜游
青灯夜游nach vorne
2022-03-04 16:07:538818Durchsuche

Was soll ich tun, wenn Nginx den Fehler 502 meldet? In diesem Artikel geht es um die Lösung des Nginx-Fehlers 502. Ich hoffe, dass er für alle hilfreich ist!

Was soll ich tun, wenn Nginx den Fehler 502 meldet? Lösungsaustausch

HTTP-Anfrageprozess: Unter normalen Umständen überträgt Nginx beim Senden einer dynamischen Anfrage die Anfrage direkt an PHP-FPM, und PHP-FPM weist den PHP-CGI-Prozess für die Verarbeitung der zugehörigen Anfragen zu und kehrt dann zurück wiederum und schließlich gibt Nginx die Ergebnisse an den Client-Browser zurück.

Nginx 502 Bad Gateway-Fehler ist ein Problem mit FastCGI

Lösung

Wenn Sie auf ein 502-Problem stoßen, können Sie die folgenden zwei Schritte zur Lösung priorisieren.

1. Prüfen Sie, ob die aktuelle Anzahl der PHP-FastCGI-Prozesse ausreicht (max_children-Wert)

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

Wenn die tatsächliche „Anzahl der verwendeten FastCGI-Prozesse“ nahe an der voreingestellten „Anzahl der FastCGI-Prozesse“ liegt, dann geben Sie die „Anzahl der verwendeten FastCGI-Prozesse“ an. „Anzahl der FastCGI-Prozesse“ reicht nicht aus und muss erhöht werden.

2. Die Ausführungszeit einiger PHP-Programme übersteigt die Wartezeit von Nginx (PHP hat keinen Speicher).

Erhöhen Sie die FastCGI-Timeout-Zeit in der Konfigurationsdatei nginx.conf, zum Beispiel:

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

in php .ini memory_limit=64M, starten Sie Nginx neu. 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

Wenn das Problem nach dieser Änderung nicht gelöst werden kann, können Sie auf die folgenden Lösungen zurückgreifen:

3, Max-Children und Max-Requests

Nginx PHP (FPM) Xcache läuft auf einem Server, mit einem Durchschnitt tägliches Besuchsvolumen von ca. 300W pv

Situationen wie diese kommen in letzter Zeit häufig vor: Die PHP-Seite öffnet sich sehr langsam, die CPU-Auslastung sinkt plötzlich auf ein sehr niedriges Niveau, die Systemlast steigt plötzlich auf ein sehr hohes Niveau, und wenn man das überprüft Wenn der Datenverkehr der Netzwerkkarte abnimmt, werden Sie auch feststellen, dass dieser plötzlich auf ein sehr niedriges Niveau sinkt. Diese Situation dauerte nur ein paar Sekunden und erholte sich dann.

Überprüfen Sie die Protokolldatei von php-fpm und finden Sie einige Hinweise:

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

Vor diesen Sätzen gibt es mehr als 1.000 Protokollzeilen zum Schließen und Öffnen von untergeordneten Elementen

Es Es stellt sich heraus, dass php-fpm einen Parameter max_requests hat, der die maximale Anzahl von Anfragen angibt, die jedes Kind verarbeiten kann, bevor es heruntergefahren wird. Die Standardeinstellung ist 500. Da PHP Anfragen an jedes untergeordnete Element abfragt, dauert es bei starkem Datenverkehr jedes untergeordnete Element ungefähr gleich lange, bis es max_requests erreicht, was dazu führt, dass alle untergeordneten Elemente praktisch gleichzeitig geschlossen werden.

Während dieser Zeit kann Nginx keine PHP-Dateien zur Verarbeitung an PHP-FPM übertragen, sodass die CPU auf ein sehr niedriges Niveau fällt (keine Notwendigkeit, PHP zu verarbeiten, geschweige denn SQL auszuführen) und die Last auf ein sehr hohes Niveau ansteigt Ebene (Schließen und Öffnen von Kindern, Nginx Warten auf PHP-FPM), der Netzwerkkartenverkehr ist ebenfalls auf ein sehr niedriges Niveau gesunken (Nginx kann keine Daten zur Übertragung an den Client generieren)🎜🎜Erhöhen Sie die Anzahl der Kinder und setzen Sie max_requests auf kleiner als 0 oder ein größerer Wert: 🎜🎜Öffnen Sie /usr/local/php/etc/php-fpm.conf🎜🎜Fügen Sie die folgenden zwei Parameter hinzu (auch entsprechend der tatsächlichen Situation des Servers). groß wird nicht funktionieren)🎜rrreee🎜Dann starten Sie php-fpm neu. 🎜🎜🎜5. Erhöhen Sie die Pufferkapazität 🎜🎜🎜Öffnen Sie das Nginx-Fehlerprotokoll und finden Sie eine Fehlermeldung wie „pstream hat beim Lesen des Antwortheaders vom Upstream einen zu großen Header gesendet“. Nach Überprüfung der Informationen besteht die allgemeine Annahme, dass ein Fehler im Nginx-Puffer vorliegt. Der durch den Seitenverbrauch unserer Website belegte Puffer ist möglicherweise zu groß. Unter Bezugnahme auf die von einem Ausländer geschriebene Änderungsmethode wird die Einstellung der Pufferkapazität erhöht und das 502-Problem vollständig gelöst. Später passte der Systemadministrator die Parameter an und behielt nur zwei Einstellungsparameter bei: Client-Kopfpuffer und Fastcgi-Puffergröße. 🎜🎜🎜6. request_terminate_timeout🎜🎜🎜Wenn 502 hauptsächlich bei einigen Beiträgen oder Datenbankvorgängen auftritt und nicht bei statischen Seitenvorgängen üblich ist, können Sie eine der php-fpm.conf-Einstellungen überprüfen: request_terminate_timeout 🎜🎜Dieser Wert ist max_execution_time, was die Ausführungszeit des Skripts von Fast-CGI ist. 🎜🎜0s ist geschlossen, was bedeutet, dass es auf unbestimmte Zeit weitergehen wird. (Beim Anziehen habe ich eine Zahl geändert, ohne genau hinzusehen) 🎜🎜 Bei der Optimierung von fastcgi kann man diesen Wert auch 5 Sekunden lang ändern, um den Effekt zu sehen. 🎜🎜Wenn die Anzahl der PHP-CGI-Prozesse nicht ausreicht, die PHP-Ausführungszeit lang ist oder der PHP-CGI-Prozess abstürzt, tritt ein 502-Fehler auf. 🎜🎜🎜Erweiterte Kenntnisse: 🎜🎜🎜Nginx 502 Bad Gateway bedeutet, dass das angeforderte PHP-CGI ausgeführt wurde, aber aus irgendeinem Grund (normalerweise ein Problem beim Lesen von Ressourcen) nicht ausgeführt wurde und der PHP-CGI-Prozess beendet wurde Im Allgemeinen scheint Nginx 502 Bad Gateway mit den Einstellungen von php-fpm.conf zusammenzuhängen. 🎜🎜 php-fpm.conf hat zwei entscheidende Parameter, einen ist max_children und der andere ist request_terminate_timeout, aber dieser Wert ist nicht universell und muss selbst berechnet werden. Wenn während der Installation und Verwendung ein 502-Problem auftritt, liegt das normalerweise daran, dass der Standard-PHP-CGI-Prozess 5 ist. Dies kann durch nicht genügend PHP-CGI-Prozesse verursacht werden. Sie müssen /usr/local/php/etc/php- ändern. fpm.conf Erhöhen Sie den max_children-Wert entsprechend. 🎜🎜 Die Berechnungsmethode ist wie folgt: 🎜

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

Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn Nginx den Fehler 502 meldet? Lösungsaustausch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen