it-swarm.com.de

PHP-FPM und Nginx: 502 Bad Gateway

Konfiguration

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

Bevor ich etwas anderes schreibe, möchte ich sagen, dass ich sowohl Nginx 502 Bad Gateway als auch Nginx + PHP-FPM 502 Bad Gateway Threads überprüft habe, die leider Ports haben hat mir in dieser hinsicht nicht geholfen.

Das Problem scheint ziemlich häufig zu sein: Eine falsche Konfiguration von nginx oder php-fpm kann zu einem 502 Bad Gateway-Fehler führen, den ich nicht loswerden 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, offenem Port 80 usw.

Die Frage ist insbesondere, wie ich diesen bösen Fehler beseitigen kann. Oder, noch besser, wie kann ich php5-fpm dazu bringen, dass tatsächlich funktioniert .

Was ich bisher versucht habe

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

i. 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

Anschließend habe ich versucht, meine Konfigurationsdateien einzuschließen:

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

Das hat mich nur noch weiter geschraubt.

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

Um ehrlich zu sein, 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. Periode.).

Das Problem liegt in erster Linie in der Tatsache, dass etwas schrecklich, schrecklich falsch ist. Und jetzt, wenn ich versuche, einen service php5-fpm restart zu machen, hängt es in einer Endlosschleife oder so etwas, was ich nicht einmal kann CTRL-C aus.

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;
    }
}
76
zeboidlund

Wenn jemand diese Seite mit dem gleichen Problem wie ich findet, habe ich die Antwort hier gefunden: http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support -lemp-on-ubuntu-12.04-lts

Für diejenigen von euch, die sich nicht die Mühe machen müssen, sie anzuklicken und für sich selbst herauszufinden ...;)

Die Bedingung:

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

Die Reparatur:

Öffnen Sie /etc/php5/fpm/pool.d/www.conf und notieren Sie sich den Parameter 'listen' (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 fastcgi_pass-Variable in Ihrem vhost durch den Ort, den Sie gerade notiert haben.

Also dieses Beispiel für eine symfony2-Konfiguration (hier entnommen: http://wiki.nginx.org/Symfony ):

  # 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;
  }

Dann starte 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 erspart jemandem ein bisschen Zeit :)

Bearbeiten

Natürlich können Sie listen = /var/run/php5-fpm.sock in listen = 127.0.0.1:9000 in /etc/php5/fpm/pool.d/www.conf ändern und dann php5-fpm neu starten (was Sie nicht an vhosts ändern muss), aber Sie müssen davon ausgehen, dass sie php5-fpm geändert haben, anstatt über Port zu hören 9000 für einen Grund.

Edit2

Wenn Sie immer noch einen 502-Fehler feststellen, finden Sie diese Antwort: nginx-Fehler Verbindung mit php5-fpm.sock fehlgeschlagen (13: Berechtigung verweigert)

152
nealio82

Versuchen Sie, diese Werte einzustellen, um das Problem in fast-cgi zu lösen

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
28
ananthan

Ich habe all diese ähnlichen Verbesserungen vorgenommen, aber ab und zu wurden 501/502 Fehler (täglich) angezeigt.

Dies sind meine Einstellungen auf /etc/php5/fpm/pool.d/www.conf , um 501- und 502-Nginx-Fehler zu vermeiden ..... Der Server hat 16 GB RAM. Diese Konfiguration ist für einen 8-GB-Server RAM, also…

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
10
PJunior

Wenn Sie nach dem Upgrade von php-fpm wie mir auf das Problem gestoßen sind, versuchen Sie Folgendes: Öffnen Sie /etc/php5/fpm/pool.d/www.confuncomment die folgenden Zeilen:

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

starten Sie dann PHP-Fpm erneut.

4
yang

Vergessen Sie nicht, dass php-fpm ein Dienst ist. Stellen Sie nach der Installation sicher, dass Sie es starten:

# service php-fpm start
# chkconfig php-fpm on
3
Jake Wilson

Für alle anderen, die Schwierigkeiten haben, dem auf den Grund zu gehen, versuchte ich, die Zeitüberschreitungen wie vorgeschlagen anzupassen, da ich nicht aufhören wollte, Unix-Sockel zu verwenden ... Nach vielen Fehlerbehebungen und nicht viel weiterem Nachdenken stellte ich fest, dass dieses Problem verursacht wurde durch die APC-Erweiterung, die ich vor ein paar Monaten in PHP-Fpm aktiviert hatte. Durch das Deaktivieren dieser Erweiterung wurden die intermittierenden 502-Fehler behoben. Die einfachste Möglichkeit war, die folgende Zeile zu kommentieren:

;extension = apc.so

Das hat mir geholfen!

2

In 5.4 wurde der Port auf 9001 geändert. Der Port wurde in der nginx-Konfiguration von 9000 auf 9001 geändert, und die Konfiguration von php-fpm hat für mich funktioniert.

1
Aaron Judd

Hoffe, dieser Tipp wird das Leben eines anderen retten. In meinem Fall bestand das Problem darin, dass mir das Gedächtnis aufgebraucht war, aber nur geringfügig, schwer darüber nachzudenken. 3h verschwendet. Ich empfehle zu laufen:

Sudo htop

oder

Sudo free -m

... zusammen mit dem Ausführen problematischer Anforderungen auf dem Server, um festzustellen, ob der Speicher nicht ausreicht. Und wenn es in meinem Fall gefällt, müssen Sie eine Auslagerungsdatei erstellen (sofern Sie nicht bereits eine haben).

Ich bin diesem Tutorial gefolgt, um eine Swap-Datei auf Ubuntu Server 14.04 zu erstellen, und es hat gut funktioniert: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

1
Rav

Bevor Sie sich mit der Nginx-Konfiguration beschäftigen, deaktivieren Sie zunächst ChromePHP.

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

2 - Kommentiere diese Zeilen:

chromephp:
    type:   chromephp
    level:  info

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

0

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

0
humanity

Stellen Sie in Ihrer NGINX-vhost-Datei im Standortblock, 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 nicht, Fpm und Nginx neu zu starten. 


Zusätzlich:  

NGINX vhost pfade

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

NGINX neu starten: 

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

FPM neu starten: 

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

und dann neu starten mit: 

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

Nachdem ich jede Lösung im Web ausprobiert hatte, stellte ich fest, dass ich das Problem mit einer sehr einfachen Methode herausgefunden hatte. Zuerst überprüfte ich PHP-Fpm-Fehlerprotokoll 

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 Einstellungen für PHP-fpm-Pools 

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

Ich habe diese Linie geschnappt 

pm.max_children = 5

Zu neuem Wert 

pm.max_children = 10

Übrigens verwende ich Low-End-VPS mit 128 MB RAM. Wie alle anderen, die ich gedacht habe, denke ich, dass pm.max_children meinen Server schneller laufen lässt, weniger Speicher benötigt, aber die Einstellung, die wir verwenden, war zu niedrig, als dass sogar der PHP-fpm-Prozess gestartet wurde Dies hilft anderen, da ich dies nach 24-stündigem Testen und Scheitern gefunden habe. Mein Webhost-Support konnte das Problem nicht lösen.

0
Salem

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

0
Lionel Morrison

Das Fehlerprotokoll sollte angezeigt werden Standardmäßig befindet sich der Speicherort in /var/log/nginx/error.log

In meinem Fall bekommen 502 den Weg, weil:

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 diese Fehler einfach den Puffer:

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