Вопрос или проблема
Я нашел ошибку ‘WARNING: [pool www] child 3715 said into stderr: “ERROR: Connection disallowed: IP address ‘x.x.x.x’ has been dropped.”‘ в журнале php-fpm, где ‘x.x.x.x’ – это публичный IP-адрес моего сервера.
Поскольку в php-fpm установлено “listen.allowed_clients = 127.0.0.1”, ошибка вполне разумна. Но мне интересно, почему nginx подключается к php-fpm с его публичным IP, если nginx и php-fpm находятся на одном сервере. Есть ли способ изменить поведение nginx в этом случае?
ОБНОВЛЕНИЕ: добавлены детализированные конфигурации.
в nginx.conf:
user nginx; worker_processes 4; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; index index.html index.htm; upstream php { server 127.0.0.1:9000; } }
в /etc/nginx/conf.d/test.conf:
server { listen 443 default_server ssl; ssl_certificate /usr/share/nginx/html/xxx.crt; ssl_certificate_key /usr/share/nginx/html/xxx/xxx.key; ## Имя вашего сайта здесь. server_name x.x.x; ## Ваш единственный путь. root /usr/share/nginx/html/xxx; ## Это должно быть в вашем http-блоке, и если это так, то здесь не нужно. include /etc/nginx/mime.types; index index.php; location ~ \.php$ { #ПРИМЕЧАНИЕ: У вас должно быть "cgi.fix_pathinfo = 0;" в php.ini include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php; } }
в fastcgi.conf:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 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 HTTPS $https if_not_empty; 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; # Только для PHP, требуется, если PHP был собран с --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
статус php-fpm:
[root@test-server ~]# netstat -tulnp | grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4134/php-fpm: maste
в журналах php-fpm:
[03-Aug-2015 09:55:02] WARNING: [pool www] child 4109 said into stderr: "ERROR: Connection disallowed: IP address '1.2.3.4' has been dropped."
На моем сервере: server_name ‘x.x.x’ действительно разрешился в ‘1.2.3.4’ через DNS, который я заменил своим реальным server_name и публичным IP на эти фиктивные. Если это вызывает путаницу, извините за это.
ВСЕ конфигурационные файлы, указанные выше, не изменялись долгое время. Все было в порядке, пока я не перезагрузил сервер. Я вспомнил, что добавил одну строку вида “1.2.3.4 x.x.x” в свой /etc/hosts, но удаление этого не помогло.
В настоящее время я изменил listen.allowed_clients в php-fpm, чтобы обойти эту проблему. Но мне интересно поведение nginx и php-fpm.
Чтобы явно установить исходный IP-адрес запроса, вам необходимо использовать одну из директив fastcgi_bind/proxy_bind вместе с соответствующей директивой *_pass.
Эта директива появилась в версии 0.8.22. Устанавливает исходящие соединения с сервером FastCGI так, чтобы они происходили с указанного локального IP-адреса с необязательным портом (1.11.2). Значение параметра может содержать переменные (1.3.12). Специальное значение off (1.3.12) отменяет эффект директивы fastcgi_bind, унаследованный от предыдущего уровня конфигурации, что позволяет системе автоматически назначать локальный IP-адрес и порт.
Ответ или решение
Для эффективного решения проблемы подключения Nginx к PHP-FPM с использованием адреса 127.0.0.1 вместо публичного IP сервера, важно рассмотреть несколько аспектов конфигурации и правильного взаимодействия этих компонентов. В этой статье мы подробно разберем шаги, которые помогут вам устранить описанную проблему.
1. Понимание проблемы
Ваша ошибка ERROR: Connection disallowed: IP address 'x.x.x.x' has been dropped
возникает из-за того, что PHP-FPM настроен на разрешение подключений только с 127.0.0.1
, в то время как Nginx пытается установить соединение с использованием публичного IP-адреса. Это в свою очередь может быть вызвано неправильной конфигурацией, а также недавними изменениями в настройках хоста или сервера.
2. Проверка конфигурации PHP-FPM
Вы уже настроили параметр listen.allowed_clients = 127.0.0.1
, и это правильный шаг. Убедитесь, что вы перезапустили PHP-FPM после изменения конфигурации:
sudo systemctl restart php-fpm
Также проверьте файл конфигурации пула (обычно находится в /etc/php-fpm.d/www.conf
или аналогичном) и убедитесь, что настройка listen
указана следующим образом:
listen = 127.0.0.1:9000
3. Конфигурация Nginx
Для того чтобы Nginx подключался к PHP-FPM по localhost, необходимо убедиться, что в конфигурации Nginx заданы правильные параметры для местоположения, обрабатывающего PHP-скрипты. В вашем случае уже использован upstream, что является хорошей практикой. Изменений в nginx.conf
вам не требуется, если правильно настроен fastcgi_pass
в блоке конфигурации сервера.
4. Параметр fastcgi_bind
Чтобы явно указать, что исходящие соединения к PHP-FPM должны идти с localhost, вы можете использовать директиву fastcgi_bind
. Добавьте следующую строку в блоке location
вашего конфигурационного файла Nginx:
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
fastcgi_bind 127.0.0.1; # Необходимо добавить
}
Это гарантирует, что Nginx использует адрес 127.0.0.1 для установления соединений с PHP-FPM.
5. Перезапуск Nginx
После внесения изменений не забудьте перезапустить Nginx, чтобы новые настройки вступили в силу:
sudo systemctl restart nginx
6. Проверка работоспособности
После перезапуска сервиса проверьте логи PHP-FPM на предмет ошибок и убедитесь, что запрашиваемые PHP-страницы обрабатываются корректно:
tail -f /var/log/php-fpm/www-error.log
tail -f /var/log/nginx/error.log
7. Общая диагностика
Если ошибка сохраняется, проверьте следующие аспекты:
- Работоспособность сетевого интерфейса (например, через
ip a
). - Конфигурацию вашего
/etc/hosts
, чтобы убедиться в отсутствии конфликтов. - Общие сетевые настройки, которые могут влиять на локальные соединения.
Заключение
Следуя этим шагам, вы сможете настроить правильное взаимодействие между Nginx и PHP-FPM с использованием адреса 127.0.0.1, что устранит проблему с разрешением IP-адреса. Если у вас остались вопросы или потребуются дополнительные пояснения, не стесняйтесь обращаться за помощью в профессиональные сообщества или к специалистам в области системного администрирования.