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-мыло - отключаемые-розетки --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 Ошибка подключения () (111: соединение отклонено) при подключении к восходящему каналу, клиент: 68.40.xxx.xxx, сервер: www.domain.com, запрос: "GET /favicon.ico HTTP/1.1", upstream: "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-запросов. Кто-нибудь знает, как это исправить?
РЕДАКТИРОВАТЬ / ОБНОВИТЬ: я использую supervisor для запуска php-fpm (не деамонизирован из-за этого).
2 ответа
Я думаю твой 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;
Разработал:
- Unix сокеты на 20% быстрее
- Вы не используете сокеты ожидания времени для каждого соединения