2014-10-02 16 views
10

Zaczynam pogardzać PHP-FPM! to straszne w posługiwaniu się błędami!Błąd 502 w php-fpm bez żadnych szczegółów

Otrzymuję NetworkError: 502 Bad Gateway i chociaż wiem, gdzie wystąpił błąd, ponieważ ręcznie nie komentowałem linii po linii, dopóki nie znalazłem złej linii, nie wiem, dlaczego linia ta powoduje problem.

Zanim zapytasz, co jest przyczyną błędu, to nie jest mój problem, moim problemem jest to, że nie mogę sprawić, że PHP powie mi, jaki jest błąd. Po prostu reaguje błędem 502.

Oto moja konfiguracja

strona nginx

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 

i wszystko, co się w dzienniki są następujące

strona dziennika błędów

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 dziennika błędów

[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 

miły, Parse Error on line 234 byłoby miło!

sfrustrowany

+0

Czy zdołałeś kiedyś rozwiązać ten problem? –

+1

@JoelKoh Możliwe, że proces ten ulega awarii, zanim zostanie zarejestrowany błąd wyjątku. W tym przypadku nic nie można zrobić. –

+0

Czy to "witryna nginx" jest twoim '/ etc/nginx/nginx.conf' lub jednym z hostów w'/etc/nginx/sites-available '? Kiedy próbowałem ponownie uruchomić Nginxa z tą konfiguracją, skarży się, że dyrektywa "location" nie jest tam dozwolona – mickadoo

Odpowiedz

7

Proces zakończony singal 11 (błąd segmentacji). Zazwyczaj oznacza to, że proces nieoczekiwanie się zawiesił z powodu jakiegoś błędu w użyciu pamięci, a php po prostu nie może w żaden sposób poradzić sobie z tym błędem. Otrzymasz ten sam błąd przy użyciu apache + mod_php, apache + mod_fcgid lub jakiejkolwiek innej konfiguracji.

W mojej praktyce segfault nie dostarcza użytecznych komunikatów o błędach we wszystkich kombinacjach. Jedynym sposobem na jego debugowanie jest strace. One-liner dołączyć strace do wszystkich procesów php biegania:

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

Jeśli błąd jest trudny do odtworzenia, można użyć xdebug php-moduł. Musisz zainstalować go tak:

apt-get install php5-xdebug 

lub

yum install php-pecl-xdebug 

dla CentOS. Dla automatycznego śledzenia wszystkich procesów dodać do config:

xdebug.auto_trace=On 

a dostaniesz ślady, domyślna ścieżka to:

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

Więc twój ślad będzie miał nazwę /tmp/trace.$PID.xt

Tam powinieneś być w stanie zobaczyć ostatni zwany fuction przed awarią procesu.

Powiązane problemy