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

Nginx + PHP-FPM = «Случайный» 502 Bad Gateway

Я запускаю Nginx и проксирую запросы php через FastCGI в PHP-FPM для обработки. Я буду случайным образом получать 502 страницы с ошибками Bad Gateway - я могу воспроизвести эту проблему, очень быстро щелкая по моим веб-сайтам PHP / обновляя страницу в течение минуты или двух. Когда я получаю страницу ошибки 502, все, что мне нужно сделать, это обновить браузер, и страница обновится должным образом.

Вот моя установка:

nginx / 0.7.64 PHP 5.3.2 (fpm-fcgi) (построено: 1 апреля 2010, 06:42:04) Ubuntu 9.10 (последняя версия 2.6 Paravirt)

Я скомпилировал PHP-FPM, используя эту директиву ./configure

./configure --enable-fpm --sysconfdir = / etc / php5 / conf.d --with-config-file-path = / etc / php5 / conf.d / php.ini --with-zlib --with -openssl --enable-zip --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-soap --enable-sockets --disable-cgi --with-curl --with -curlwrappers --with-gd --with-mcrypt --enable-memcache --with-mhash --with-jpeg-dir = / usr / local / lib --with-mysql = / usr / bin / mysql - with-mysqli = / usr / bin / mysql_config --enable-pdo --with-pdo-mysql = / usr / bin / mysql --with-pdo-sqlite --with-pspell --with-snmp --with- sqlite --with-tidy --with-xmlrpc --with-xsl

Мой php-fpm.conf выглядит так (соответствующие части):

 ...   
<value name="pm">
     <value name="max_children">3</value>
     ...
     <value name="request_terminate_timeout">60s</value>
       <value name="request_slowlog_timeout">30s</value>
       <value name="slowlog">/var/log/php-fpm.log.slow</value>
       <value name="rlimit_files">1024</value>
       <value name="rlimit_core">0</value>
       <value name="chroot"></value>
       <value name="chdir"></value>
       <value name="catch_workers_output">yes</value>
       <value name="max_requests">500</value>
...

Я пробовал увеличить max_children до 10, и это не имеет значения. Я также пробовал установить его на «динамический» и установить max_children на 50 и start_server на «5» без каких-либо различий.

Я пробовал использовать как 1, так и 5 рабочих процессов nginx.

Моя конфигурация fastcgi_params выглядит так:

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

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;

Nginx регистрирует ошибку как:

[ошибка] 3947 # 0: * 10530 connect () не удалось (111: соединение отклонено) при подключении к восходящему потоку, клиент: 68.40.xxx.xxx, сервер: www.domain.com, запрос: «GET /favicon.ico HTTP / 1.1 ", восходящий поток:" fastcgi: //127.0.0.1: 9000 ", хост:" www.domain.com "

PHP-FPM регистрирует следующее во время ошибки:

[NOTICE] pid 17161, fpm_unix_init_main(), line 255: getrlimit(nofile): max:1024, cur:1024 
[NOTICE] pid 17161, fpm_event_init_main(), line 93: libevent: using epoll 
[NOTICE] pid 17161, fpm_init(), line 50: fpm is    running, pid 17161 
[DEBUG] pid 17161, fpm_children_make(), line 403: [pool default] child 17162 started 
[DEBUG] pid 17161, fpm_children_make(), line   403: [pool default] child 17163    started 
[DEBUG] pid 17161,  fpm_children_make(), line 403: [pool default] child 17164 started 
[NOTICE] pid 17161, fpm_event_loop(), line 111: ready to handle connections

Когда я воссоздаю проблему, моя загрузка ЦП достигает 10-15%. Моя бесплатная память (free -m) составляет> 130 МБ

У меня была эта периодическая проблема с 502 Bad Gateway, когда я также использовал php5-cgi для обслуживания моих запросов php. Кто-нибудь знает, как это исправить?

РЕДАКТИРОВАТЬ / ОБНОВЛЕНИЕ: я использую супервизор для запуска php-fpm (из-за этого не деамонизирован).

Я думаю твой max_children слишком низко

<value name="max_children">3</value>

Также вы можете попробовать переключиться с TCP-порта на unix-сокет для php-fpm:

php-fpm.conf

<value name="listen_address">/tmp/php.sock</value>

nginx.conf

fastcgi_pass unix:/tmp/php.sock;

Разработано:

  1. Сокеты Unix на ~ 20% быстрее
  2. Вы не используете сокеты с ожиданием времени для каждого подключения