PHP-FPM und Nginx: 502 Bad Gateway

78

Aufbau

  • Ubuntu Server 11.10 64 Bit
  • Amazon AWS, Ec2, gehostet in der Cloud
  • t1.micro Instanz

Bevor ich etwas anderes schreiben, würde ich feststellen, dass ich beide überprüft habe nginx 502 falsches Gateway und Nginx + PHP-FPM 502 Bad Gateway - Threads, die leider mir in dieser Hinsicht nicht geholfen haben.

Das Problem scheint ziemlich häufig zu sein: Eine Fehlkonfiguration von nginx oder php-fpm kann zu einem 502 Bad GatewayFehler führen, den ich nicht beseitigen konnte. Beachten Sie, dass dies auch dann angezeigt wird , wenn ich zu meinem Domänenstamm gehe , ohne ein bestimmtes Verzeichnis anzugeben.

Ich verwende einen Amazon EC2-Webserver mit aktiviertem Port 9000, geöffnetem Port 80 usw.

Die Frage ist insbesondere, wie ich diesen bösen Fehler loswerden kann. Oder, noch besser, wie kann ich php5-fpmzu tatsächlich funktionieren .

Was ich bisher versucht habe

Meist konsistente Bearbeitung von Konfigurationsdateien, insbesondere php-fpm.confund nginx.conf.

ich. php-fpm.conf

Ich habe folgendes hinzugefügt, was nicht viel geholfen hat:

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

Danach habe ich versucht, meine Konfigurationsdateien einzuschließen:

include=/etc/php5/fpm/*.conf

Was mich nur noch weiter verarscht hat.

Vollständige Konfiguration

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = no

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

ii . nginx.conf

Ehrlich gesagt ist diese Konfiguration ein kleiner Teil einiger Websites, die ich besucht habe, aber ich kann Ihnen sagen, dass der Server vor diesem 502 Bad Gateway-Geschäft einwandfrei lief (ohne dass PHP funktionierte. Zeitraum).

Das Problem liegt hauptsächlich in der Tatsache, dass etwas schrecklich, schrecklich falsch ist. Und jetzt, wenn ich versuche , eine zu tun service php5-fpm restart, hängt es in dem, was ich vermute , eine Endlosschleife oder etwas ist, was ich kann nicht einmal CTRL- Caus.

Vollständige Konfiguration

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 64;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80;
        server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com;

        location ~ ^(.+\.php)(.*)$ {
            root   /home/wayvac/public;
            fastcgi_pass   unix:/var/run/php5-fpm.pid;  
            #fastcgi_pass   127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm.
            fastcgi_index  index.php;
            set $document_root2 $document_root;
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param   SCRIPT_FILENAME $document_root2$fastcgi_script_name;
            fastcgi_param   PATH_INFO   $fastcgi_path_info;
            fastcgi_param   PATH_TRANSLATED $document_root2$fastcgi_path_info;
            include fastcgi_params;
            fastcgi_param  DOCUMENT_ROOT      $document_root2;
        }       

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
            root /home/wayvac/public;   
            index index.html index.htm index.php;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
            # Some basic cache-control for static files to be sent to the browser
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }

        #include drop.conf;
        #include php.conf;
    }
}
Zeboidlund
quelle

Antworten:

151

Wenn jemand diese Seite findet, indem er auf dasselbe Problem stößt, das ich hatte, habe ich hier die Antwort gefunden .

Für diejenigen unter Ihnen, die sich nicht die Mühe machen können, zu klicken und es selbst herauszufinden ...;)

Die Bedingung:

Ubuntu- oder Debian-Server mit NGINX und PHP 5.3 funktionieren einwandfrei, aber ein Upgrade von PHP auf 5.4 führt zu 502 Bad Gateway-Fehlern. Wenn Sie nach Diensten suchen, die auf Port 9000 ausgeführt werden (normalerweise ausgeführt netstat -lpoder ähnlich), wird nichts zurückgegeben.

Die Reparatur:

Öffnen /etc/php5/fpm/pool.d/www.confSie den Parameter 'listen' und notieren Sie ihn (in meinem Fall /var/run/php5-fpm.sock):

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

und ersetzen Sie die Variable fastcgi_pass in Ihrem vhost durch den gerade notierten Speicherort.

Also dieses Beispiel für eine symfony2-Konfiguration (von hier übernommen ):

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

wird dies:

  # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

Starten Sie dann nginx neu:

sudo /etc/init.d/nginx restart

Hinweis: Ersetzen Sie ~ ^/(app|app_dev)\.php(/|$) {durch, ~ ^/index\.php(/|$) {wenn Sie nicht mit SF2 ** arbeiten

Hoffe das spart jemandem ein bisschen Zeit :)

Bearbeiten

Natürlich können Sie das listen = /var/run/php5-fpm.sockin listen = 127.0.0.1:9000in ändern/etc/php5/fpm/pool.d/www.conf dann php5-fpm neu starten (was Sie davon abhält, Ihre vhosts zu ändern), aber Sie müssen davon ausgehen, dass sie php5-fpm geändert haben, um über einen Socket zu laufen, anstatt auf Port 9000 nach a zu warten Grund.

Edit2

Wenn immer noch ein 502-Fehler auftritt, lesen Sie diese Antwort .

nealio82
quelle
2
Unix-Sockets sind nur unwesentlich schneller und können unter hoher
Desmond Hume
hat nicht geholfen, es war schon so eingestellt, und ich erlebe die ganze Zeit 502.
vsync
Schlechtes Gateway bedeutet nur, dass Nginx PHP nicht finden kann. Sind Sie sicher, dass der PHP-Fpm-Dienst installiert ist und ausgeführt wird? Versuchen Sie es neu zu starten, wenn es läuft, vielleicht hängt es.
Nealio82
@Nealio Ich verwende einen Ubuntu-Server, auf dem Nginx ausgeführt wird. Wissen Sie, wo genau ich die Datei finden kann, auf die ich mich beziehe # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock location ~ ^/(app|app_dev)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; }?
user111671
1
Sie scheinen dies kürzlich geändert zu haben und haben es so gemacht, dass es immer die ursprünglichen Portnummern verwendet, dh127.0.0.1:9000
marksyzm
28

Versuchen Sie, diese Werte einzustellen, es löst das Problem in Fast-CGI

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
Ananthan
quelle
Das hat es für mich getan. Es war ziemlich schwierig zu bestimmen, da der Fastcgi-Fehler im Nginx-Protokoll abgeschnitten wurde. Vielen Dank!
jrhorn424
1
Gehen Sie voran und setzen Sie es auf 64k für Symfony2.3 :) Die Fehlerausgabe von Symfony scheint nur die Puffer zu überwältigen ...
Stefan
2
@Jusfeel Diese Optionen sollten zur Konfigurationsdatei von nginx hinzugefügt werden.
Biphobe
Was für eine Wunderlösung. Dank
Januar
Ich habe mich bei Siwapp beworben, das unter Nginx installiert ist, und es funktioniert großartig! Vielen Dank :)
Akajack
11

Ich habe all diese ähnlichen Änderungen vorgenommen, aber von Zeit zu Zeit bekam ich 501/502 Fehler (täglich).

Dies sind meine Einstellungen unter /etc/php5/fpm/pool.d/www.conf , um 501- und 502-Nginx-Fehler zu vermeiden. Der Server verfügt über 16 GB RAM. Diese Konfiguration gilt für einen 8-Gbit-RAM-Server.

sudo nano /etc/php5/fpm/pool.d/www.conf

Stellen Sie dann die folgenden Werte für ein

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

Nach diesen Änderungen starten Sie php-fpm neu

sudo service php-fpm restart
PJunior
quelle
4

Wenn Sie das Problem nach dem Upgrade von php-fpm wie mir festgestellt haben, versuchen Sie Folgendes: Öffnen Sie /etc/php5/fpm/pool.d/www.conf und kommentieren Sie die folgenden Zeilen aus:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

Starten Sie dann php-fpm neu.

Yang
quelle
Hat es auch für mich gelöst. Die conf-Datei war /etc/php/php-fpm.d/www/confunter Arch Linux. Beachten Sie, dass das Festlegen von Berechtigungen auf 0666wahrscheinlich nicht für die Produktion geeignet ist. Stattdessen sollte ein Produktionsserver mit dem Nginx-Benutzer und dem PHP-FPM-Benutzer übereinstimmen und die Berechtigungen 0660zur Erhöhung der Sicherheit behalten .
Conradkleinespel
3

Vergiss nicht, dass php-fpmdas ein Service ist. Stellen Sie nach der Installation sicher, dass Sie es starten:

# service php-fpm start
# chkconfig php-fpm on
Jake Wilson
quelle
2

Für alle anderen, die Schwierigkeiten haben, dem auf den Grund zu gehen, habe ich versucht, die Zeitüberschreitungen wie vorgeschlagen anzupassen, da ich die Verwendung von Unix-Sockets nicht beenden wollte. Nach vielen Fehlerbehebungen und nicht viel zu tun stellte ich fest, dass dieses Problem verursacht wurde durch die APC-Erweiterung, die ich vor ein paar Monaten in php-fpm aktiviert hatte. Durch Deaktivieren dieser Erweiterung wurden die zeitweise auftretenden 502-Fehler behoben. Der einfachste Weg, dies zu tun, bestand darin, die folgende Zeile auskommentieren:

;extension = apc.so

Das hat den Trick für mich getan!

William Emmerson
quelle
1

Der Port wurde in 5.4 auf 9001 geändert, nur das Ändern des Ports von 9000 auf 9001 in der Nginx Conf und in der PHP-Fpm-Konfiguration funktionierte für mich.

Aaron Judd
quelle
1

Hoffe, dieser Tipp wird jemand anderem das Leben retten. In meinem Fall war das Problem, dass mir der Speicher ausgegangen war, aber nur geringfügig, und es war schwer, darüber nachzudenken. Verschwendete 3 Stunden darauf. Ich empfehle zu laufen:

sudo htop

oder

sudo free -m

... zusammen mit problematischen Anforderungen auf dem Server, um festzustellen, ob Ihr Speicher nicht knapp wird. Und wenn es in meinem Fall gefällt, müssen Sie eine Auslagerungsdatei erstellen (es sei denn, Sie haben bereits eine).

Ich habe dieses Tutorial befolgt, um eine Auslagerungsdatei unter Ubuntu Server 14.04 zu erstellen, und es hat einwandfrei funktioniert: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

Rav
quelle
0

Ich habe auch festgestellt, dass dieser Fehler beim Schreiben von json_encoded () -Daten in MySQL verursacht werden kann. Um das zu umgehen, habe ich den JSON base64_encode (). Bitte beachten Sie, dass die JSON-Codierung beim Dekodieren Werte ändern kann. Nb. 24 kann 24.00 werden

Lionel Morrison
quelle
0

Nachdem ich jede Lösung im Web ausprobiert hatte, fand ich das Problem mit einer sehr einfachen Methode heraus. Zuerst habe ich das PHP-Fpm-Fehlerprotokoll überprüft

cat /var/log/php5-fpm.log 

und der am häufigsten wiederholte Fehler war

" WARNING: [pool www] server reached pm.max_children setting (5), consider raising it "

Ich bearbeite die Einstellung für PHP-fpm-Pools

nano /etc/php5/fpm/pool.d/www.conf

Ich habe diese Zeile geändert

pm.max_children = 5

Zu neuem Wert

pm.max_children = 10

Übrigens verwende ich Low-End-VPS mit 128 MB RAM. Wie alle anderen, von denen ich dachte, dass die Wiederverwendung dazu pm.max_childrenführt, dass mein Server schneller läuft, verbraucht er weniger Speicher, aber die von uns verwendeten Einstellungen waren zu niedrig, um den PHP-fpm-Prozess überhaupt zu starten. Ich hoffe, dies hilft anderen, da ich dies nach 24-stündigem Testen und Fehlschlagen festgestellt habe. Mein Webhost-Support konnte das Problem jedoch nie lösen.

Salem
quelle
0

Sie sollten das Fehlerprotokoll sehen. Standardmäßig befindet sich der Speicherort in /var/log/nginx/error.log

In meinem Fall kommen 502 weg wegen:

GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:28 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local"

Wenn wir genau wissen, was falsch ist, beheben Sie es. Ändern Sie für diesen Fehler einfach den Puffer:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;
De Nguyen
quelle
0

Ich bin sehr spät zu diesem Spiel, aber mein Problem begann, als ich PHP auf meinem Server aktualisiert habe. Ich konnte einfach die .socket-Datei entfernen und meine Dienste neu starten. Dann hat alles funktioniert. Ich bin mir nicht sicher, warum es einen Unterschied gemacht hat, da die Datei die Größe 0 hat und der Besitz und die Berechtigungen gleich sind, aber es hat funktioniert.

Menschheit
quelle
0

Versuchen Sie zunächst, ChromePHP zu deaktivieren, bevor Sie mit der Nginx-Konfiguration herumspielen.

1 - Öffnen Sie app / config / config_dev.yml

2 - Kommentieren Sie diese Zeilen:

chromephp:
    type:   chromephp
    level:  info

ChromePHP packt die json-codierten Debug-Informationen in den X-ChromePhp-Data-Header, der für die Standardkonfiguration von nginx mit fastcgi zu groß ist.

Lucas Bustamante
quelle
0

Stellen Sie in Ihrer NGINX vhost-Datei im Speicherortblock, der Ihre PHP-Dateien (normalerweise location ~ \.php$ {) über FastCGI verarbeitet, sicher, dass Sie die nächsten Zeilen haben:

proxy_buffer_size          128k;
proxy_buffers              4 256k;
proxy_busy_buffers_size    256k;
fastcgi_buffer_size        16k;
fastcgi_buffers            4 16k;

Vergessen Sie danach nicht, fpm und nginx neu zu starten.


Zusätzlich:

NGINX vhost Pfade

  • /etc/nginx/sites-enabled/ - Linux
  • '/ usr / local / etc / nginx / sites-enabled /' - Mac

Starten Sie NGINX neu:

  • sudo service nginx restart - Linux
  • brew service restart nginx - Mac

Starten Sie FPM neu:

Bestimmen Sie den Namen des fpm-Prozesses: - systemctl list-unit-files | grep fpm- Linux -brew services list | grep php - Mac

und starten Sie es dann neu mit:

  • sudo service <service-name> restart - Linux
  • brew services restart <service-name> - Mac
М.Б.
quelle
0

Vielleicht hilft diese Antwort:

Nginx-Fehler Verbindung zu php5-fpm.sock hergestellt fehlgeschlagen (13: Berechtigung verweigert)

Die Lösung bestand darin, www-data in /var/www/php/fpm/pool.d/www.conf durch nginx zu ersetzen

Ändern Sie jeweils die Socket-Anmeldeinformationen:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock
Alexander Gavriliuk
quelle
Dies ist die richtige Lösung, wenn ein Nginx-Fehler bei der Verbindung mit php5-fpm.sock fehlgeschlagen ist (13: Berechtigung verweigert)
Florin,