2014-10-02 11 views
10

Ich fange an, PHP-FPM verachten! Es ist schrecklich bei der Handhabung von Fehlern!Fehler 502 in PHP-FPM ohne Details

Ich bekomme eine NetworkError: 502 Bad Gateway und obwohl ich weiß, wo der Fehler auftritt, weil ich Zeilen Zeile für Zeile manuell auskommentiert, bis ich die schlechte Zeile gefunden habe, weiß ich nicht, warum diese Zeile ein Problem verursacht.

Bevor Sie fragen, was die Zeile ist, die den Fehler verursacht, das ist nicht mein Problem, mein Problem ist, dass ich PHP nicht bekommen kann, um mir zu sagen, was der Fehler ist. Es reagiert nur mit einem 502-Fehler.

Hier ist meine Konfiguration

nginx Website

location ~ .+?\.php { 
    fastcgi_split_path_info ^(.+?\.php)/?(.*)$; 
    if (!-f $document_root$fastcgi_script_name) { 
     return 404; 
    } 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param LOG_PATH /var/www/sites/api/logs; 
    fastcgi_param ENVIRONMENT dev; 
    fastcgi_buffer_size 128k; 
    fastcgi_buffers 254 16k; 
    fastcgi_busy_buffers_size 256k; 
    fastcgi_temp_file_write_size 256k; 
    proxy_intercept_errors on; 
    fastcgi_intercept_errors on; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
} 

php.ini

[PHP] 
engine = On 
expose_php = Off 
max_execution_time = 30 
memory_limit = 128M 
default_socket_timeout = 5 
session.save_path = /var/www/session/ 
file_uploads = Off 
upload_tmp_dir = /tmp/php 
upload_max_filesize = 5M 
post_max_size = 5M 
max_file_uploads = 1 
date.timezone = 'UTC' 
disable_functions = phpinfo,exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source 
mail.add_x_header = Off 
sql.safe_mode = On 
cgi.force_redirect = 1 
allow_url_fopen = Off 
allow_url_include = Off 

error_reporting = E_ALL 
display_errors = On 
display_startup_errors = On 
html_errors = Off 
log_errors = On 
error_log = /var/log/php5-fpm.log 
log_errors_max_len = 1024 
ignore_repeated_errors = Off 
ignore_repeated_source = Off 
report_memleaks = On 
track_errors = On 

pool.d/www.conf

[www] 
listen = /var/run/php5-fpm.sock 
user = www-data 
group = www-data 
listen.owner = www-data 
listen.group = www-data 

pm = static 
pm.max_children = 600 
;pm.start_servers = 10 
;pm.min_spare_servers = 5 
;pm.max_spare_servers = 15 
pm.max_requests = 100 
;pm.status_path = /php_status 

;request_terminate_timeout = 5s 
;request_slowlog_timeout = 5s 
;slowlog = /var/log/php/fpm/domain.slowlog.log 

; Redirect worker stdout and stderr into main error log. If not set, stdout and 
; stderr will be redirected to /dev/null according to FastCGI specs. 
; Default Value: no 
catch_workers_output = yes 

php_flag[display_errors] = on 
php_flag[display_startup_errors] = on 
;php_flag[output_buffering] = off 

php_admin_value[error_log] = /var/log/php5-fpm.log 
php_admin_flag[log_errors] = on 

und alles, was ich bekommen in Die Protokolle sind die folgenden

Website Fehlerprotokoll

2014/10/02 14:34:50 [error] 25966#0: *9 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 109.70.40.213, server: www.example.com, request: "POST /v2/payments/payment/sale HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "www.example.cm", referrer: "http://boxshop.im/checkout" 

php error log

[02-Oct-2014 14:44:26.023450] DEBUG: pid 25216, fpm_event_loop(), line 419: event module triggered 2 events 
[02-Oct-2014 14:44:26.023927] DEBUG: pid 25216, fpm_got_signal(), line 76: received SIGCHLD 
[02-Oct-2014 14:44:26.024044] WARNING: pid 25216, fpm_children_bury(), line 252: [pool www] child 25251 exited on signal 11 (SIGSEGV) after 1441.610042 seconds from start 
[02-Oct-2014 14:44:26.025943] NOTICE: pid 25216, fpm_children_make(), line 421: [pool www] child 26039 started 
[02-Oct-2014 14:44:26.026192] DEBUG: pid 25216, fpm_event_loop(), line 419: event module triggered 1 events 

ein schönes, würde Parse Error on line 234 schön sein!

frustriert

+0

Haben Sie es jemals geschafft, dies zu lösen? –

+1

@JoelKoh Es könnte sein, dass der Prozess abstürzt, bevor ein Ausnahmefehler protokolliert werden kann. In diesem Fall kann nichts getan werden. –

+0

Ist das "nginx site" deine/etc/nginx/nginx.conf oder einer der Hosts in/etc/nginx/sites-available? Als ich versuchte, nginx mit dieser Konfiguration neu zu starten, beschwert es sich, dass die "location" Direktive dort nicht erlaubt ist – mickadoo

Antwort

7

Prozess beendet mit Singal 11 (Segmentierungsfehler). In der Regel bedeutet dies, dass der Prozess aufgrund eines Fehlers bei der Speicherauslastung unerwartet abgestürzt ist und php diesen Fehler in keiner Weise behandeln kann. Sie erhalten den gleichen Fehler mit Apache + Mod_php, Apache + Mod_fcgid oder einer anderen Konfiguration.

In meiner Praxis liefert segfault in allen Konfigurationen keine sinnvolle Fehlermeldung. Die einzige echte Möglichkeit, es zu debuggen ist strace. Einzeiler strace für alle PHP-Prozesse am Laufen befestigen:

strace -f -F -s1000 -t -T `ps aux | grep -E 'apache|php|httpd' | awk '{print "-p" $2}' | xargs` 

Wenn der Fehler nur schwer zu reproduzieren, Sie xdebug PHP-Modul verwenden können. Sie müssen es installieren wie folgt aus:

apt-get install php5-xdebug 

oder

yum install php-pecl-xdebug 

für CentOS. Für die automatische Verfolgung aller Prozesse Config hinzu:

xdebug.auto_trace=On 

Und Sie werden Spuren erhalten, Standardpfad ist:

xdebug.trace_output_dir => /tmp => /tmp 
xdebug.trace_output_name => trace.%c => trace.%c 

So wird Ihre Spur Namen /tmp/trace.$PID haben.xt

Dort sollten Sie in der Lage sein, die zuletzt aufgerufene Funktion vor dem Prozessabsturz zu sehen.

Verwandte Themen