Назад | Перейти на главную страницу

Nginx + PHP5-FPM повторяющиеся вырезки 502

Я видел здесь несколько вопросов, в которых выделяются случайные 502 (Nginx + PHP-FPM = "Случайный" 502 Bad Gateway) и аналогичные тайм-ауты при использовании Nginx + PHP-FPM.

Даже со всеми вопросами я все еще не могу найти решение.

При использовании Ubuntu 10.10 + Nginx + PHP5-FPM + APC каждый 1 из 4 запросов заканчивается тайм-аутом и ошибкой. Это не проблема загрузки или большого трафика, это происходит даже в среде разработки с одним человеком.

Я делаю это на 3 машинах по 1 ГБ, каждая с одинаковыми конфигурациями и одинаковыми проблемами.

fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param  REDIRECT_STATUS    200;

/etc/php5/fpm/main.conf

; FPM Configuration ;

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

; Global Options ;

pid = /var/run/php5-fpm.pid

error_log = /var/log/php5-fpm.log

;log_level = notice

;emergency_restart_threshold = 0

;emergency_restart_interval = 0

;process_control_timeout = 0

;daemonize = yes

; Pool Definitions ; 

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

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

[www]
listen = 127.0.0.1:9000

;listen.backlog = -1
;listen.allowed_clients = 127.0.0.1
;listen.owner = www-data
;listen.group = www-data
;listen.mode = 0666

user = www-data
group = www-data

;pm.max_children = 50
pm.max_children = 15
;pm.start_servers = 20
pm.min_spare_servers = 5
;pm.max_spare_servers = 35
pm.max_spare_servers = 10
;pm.max_requests = 500
;pm.status_path = /status

;ping.path = /ping
;ping.response = pong

request_terminate_timeout = 30
;request_slowlog_timeout = 0

;slowlog = /var/log/php-fpm.log.slow

;rlimit_files = 1024
;rlimit_core = 0

;chroot = 

chdir = /var/www

;catch_workers_output = yes

Обычно это означает, что ваша конфигурация Fastcgi неправильно настроена для данных и заголовков, которые вы передаете.

Вам нужно будет поиграть со следующими настройками в файле fastcgi_parms:

fastcgi_connect_timeout 90;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 1024K;
fastcgi_buffers 8 512k;
fastcgi_busy_buffers_size 1024k;
fastcgi_temp_file_write_size 1024k;
fastcgi_intercept_errors on;
fastcgi_pass_header *;

Вышеуказанные настройки взяты с моего сервера разработки, и я использую FirePHP, когда информация заголовка слишком велика (то есть заполняет буферы), я всегда получаю ошибку 502. Следовательно, я сделал буферы действительно большими. Если вы знаете, что именно это и делает ваше приложение, то это хорошее место для начала.

Я бы никогда не использовал указанные выше настройки на производственном сервере, но вы обнаружите, что настройки connect_timeout, send_timeout, intercept_errors и pass_header обычно являются хорошим местом для начала решения 502, если проблема не связана с чрезмерным заголовком / данными.

Мои деньги виноваты в APC. Я видел нечто подобное с apc.include_once_override = On. Отключение этого (и apc.canonicalize = On) исправил это для меня.

Я согласен с Беном, что в этом может быть APC. Я обнаружил, что Xcache менее подвержен ошибкам, однако считается, что он старше и менее эффективен в отношении процессора. Тем не менее, поскольку ошибку 502 трудно отследить, я предлагаю вам 'apt-get --purge remove' все ваши пакеты php (в частности, APC и php5-fpm) и просто следовать инструкциям в Howtoforge это сработало для меня из коробки.