Skip to main content

FAQ Error Nginx

6 min read
FAQ Error Nginx

Распространённые ошибки веб-сервера Nginx.

Unable to connect / Refused to Connect

Если при попытке получить доступ к сайту вы видите одну из ошибок:

Firefox can’t establish a connection to the server at www.example.com
www.example.com refused to connect
The site can't be reached, www.example.com unexpectedly closed the connection.

Возможные причины:

Nginx не запущен

Проверьте состояние и при необходимости запустите:

sudo systemctl status nginx
sudo systemctl start nginx

Если Nginx не удаётся запустить, проверьте конфигурацию и логи:

sudo nginx -t
sudo journalctl -eu nginx

Брандмауэр блокирует порты 80 и 443

UFW (Debian/Ubuntu):

sudo ufw allow 80,443/tcp

Firewalld (RHEL/CentOS/Rocky/AlmaLinux):

sudo firewall-cmd --permanent --add-service={http,https}
sudo systemctl reload firewalld

Fail2ban

Возможно, fail2ban запретил ваш IP:

sudo journalctl -eu fail2ban

Добавьте IP в ignoreip, чтобы он больше не банился.

Nginx не слушает нужный интерфейс

Например, Nginx не слушает публичный IP-адрес сервера.

The Connection Has Timed Out

Это может означать, что сервер offline или Nginx работает неправильно.

Однажды из‑за нехватки памяти Nginx не смог запустить worker-процессы. Если в /var/log/nginx/error.log есть:

fork() failed while spawning "worker process" (12: Cannot allocate memory)

серверу не хватает памяти.

404 Not Found

Nginx не может найти запрошенные ресурсы. Возможные причины:

  • Корневой каталог сайта не существует. В Nginx он задаётся директивой root, например:
root /usr/share/nginx/linuxbabe.com/;

Убедитесь, что HTML/CSS/JS/PHP лежат в правильном каталоге.

  • PHP-FPM не запущен:
# Debian/Ubuntu
sudo systemctl status php7.4-fpm

# RHEL-подобные
sudo systemctl status php-fpm
  • Нет директивы try_files для PHP:
try_files $uri /index.php$is_args$args;
  • На сервере закончилось место на диске. Утилита ncdu поможет найти тяжёлые каталоги:
sudo apt install ncdu   # Debian/Ubuntu
sudo dnf install ncdu   # RHEL-подобные

403 Forbidden

Доступ к ресурсу запрещён. Типичные сценарии:

  • Администратор ограничил доступ белым списком IP или другим методом.
  • Сработал WAF (например, ModSecurity) и заблокировал запрос.
  • Некоторые приложения показывают другое сообщение (например, «secure connection failed») при той же сути 403.

500 Internal Server Error

Ошибка в веб-приложении. Возможные причины:

  • Не работает БД:
sudo systemctl status mysql
sudo systemctl start mysql
sudo journalctl -eu mysql

Процесс MySQL/MariaDB мог упасть из‑за OOM.

  • Nginx не настроен на PHP-FPM и не умеет выполнять PHP.
  • Есть встроенный кэш приложения — попробуйте очистить его.
  • У приложения свой error log — смотрите его.
  • Включите debug-режим приложения для подробных сообщений. Пример для Modoboa: DEBUG = True в /srv/modoboa/instance/instance/settings.py.
  • PHP-FPM перегружен. Смотрите /var/log/php7.4-fpm.log. Если есть предупреждение [pool www] seems busy — увеличьте pm.start_servers / pm.min/max_spare_servers. Иногда помогает:
sudo systemctl reload php7.4-fpm

Nginx показывает страницу по умолчанию

При настройке virtual host и открытии домена видна дефолтная страница Nginx:

  • В server_name указано не реальное доменное имя.
  • Забыли перезагрузить Nginx.

504 Gateway time-out

Upstream (PHP-FPM / MySQL / MariaDB) не успевает обработать запрос.

Можно временно перезапустить PHP-FPM, но лучше настроить производительность.

Пример конфигурации InnoDB

Файл /etc/mysql/mariadb.conf.d/50-server.cnf:

innodb_buffer_pool_size = 1024M
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup  = ON
innodb_log_file_size = 512M
innodb_log_buffer_size = 8M
# Improving disk I/O performance
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_buffer_pool_instances = 3

Где:

  • InnoDB buffer pool size — не меньше половины RAM (на маленьком VPS лучше ~400M, иначе будет OOM).
  • InnoDB log file size — около 25% от buffer pool.
  • Потоки read/write I/O — до максимума (64).
  • Число innodb_buffer_pool_instances — по числу CPU-ядер.

После изменений:

sudo systemctl restart mariadb

Таймауты в Nginx

В блок server { ... } можно добавить:

proxy_connect_timeout  600;
proxy_send_timeout     600;
proxy_read_timeout     600;
send_timeout           600;

Для PHP-FPM увеличьте fastcgi_read_timeout (по умолчанию 60 с), например до 300:

location ~ \.php$ {
    try_files $uri /index.php$is_args$args;
    include snippets/fastcgi-php.conf;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_read_timeout 300;
}
sudo systemctl reload nginx

Таймаут PHP

sudo nano /etc/php/7.4/fpm/php.ini
max_execution_time = 300
sudo systemctl restart php7.4-fpm

Размер памяти исчерпан

В логе Nginx / PHP:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 57134520 bytes)

Это лимит PHP в 128 МБ. В php.ini (/etc/php/7.4/fpm/php.ini):

memory_limit = 512M
sudo systemctl restart php7.4-fpm

Если ошибка остаётся — скорее всего, плохой PHP-код, который ест много RAM.

PR_END_OF_FILE_ERROR

Типичные причины:

  • Nginx редиректит HTTP→HTTPS, но нет server блока для HTTPS.
  • Nginx не запущен: основной бинарник жив, а worker упал. Смотрите /var/log/nginx/error.log.

Resource temporarily unavailable

В error log Nginx:

connect() to unix:/run/php/php7.4-fpm.sock failed (11: Resource temporarily unavailable)

Обычно PHP-FPM не справляется с нагрузкой. Увеличьте число дочерних процессов в pool www.conf (путь зависит от дистрибутива), например:

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

По умолчанию:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Это значит: динамический пул, максимум 5 children, при старте 2, минимум 1 spare, максимум 3 spare.

Пример под нагрузку:

pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12

Убедитесь, что хватает RAM, затем:

sudo systemctl restart php7.4-fpm

Страница status PHP-FPM

В www.conf раскомментируйте:

pm.status_path = /status
sudo systemctl restart php7.4-fpm

В virtual host Nginx:

location ~ ^/(status|ping)$ {
    allow 127.0.0.1;
    allow your_other_IP_Address;
    deny all;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
sudo nginx -t
sudo systemctl reload nginx

Очередь ожидающих запросов задаётся listen.backlog (по умолчанию до 511):

listen.backlog = 511

На status-странице «пустая» очередь выглядит так:

listen queue:         0
max listen queue:     0

Если очередь = 511 — увеличьте children. Также может понадобиться net.core.somaxconn (до ядра 5.4 по умолчанию 128, с 5.4 — 4096):

sysctl net.core.somaxconn

Для высоконагруженного сайта в /etc/sysctl.conf:

sudo nano /etc/sysctl.conf
net.core.somaxconn = 20000
net.core.netdev_max_backlog = 65535
sudo sysctl -p

Примечание: при достаточном объёме RAM можно выделить фиксированное число children (pm = static).

Два файла virtual host для одного сайта

Если sudo nginx -t показывает:

nginx: [warn] conflicting server name "example.com" on [::]:443, ignored
nginx: [warn] conflicting server name "example.com" on 0.0.0.0:443, ignored

есть два конфига с одним и тем же server_name. Не создавайте два virtual host для одного сайта.

PHP-FPM Connection reset by peer

В error log Nginx:

recv() failed (104: Connection reset by peer) while reading response header from upstream

Часто бывает при перезапуске PHP-FPM. Если перезапуск был осознанным — можно игнорировать.

Утечки сокетов Nginx

В /var/log/nginx/error.log:

2021/09/28 13:27:41 [alert] 321#321: *120606 open socket #16 left in connection 163
2021/09/28 13:27:41 [alert] 321#321: *120629 open socket #34 left in connection 188
2021/09/28 13:27:41 [alert] 321#321: *120622 open socket #9 left in connection 213
2021/09/28 13:27:41 [alert] 321#321: *120628 open socket #25 left in connection 217
2021/09/28 13:27:41 [alert] 321#321: *120605 open socket #15 left in connection 244
2021/09/28 13:27:41 [alert] 321#321: *120614 open socket #41 left in connection 245
2021/09/28 13:27:41 [alert] 321#321: *120631 open socket #24 left in connection 255
2021/09/28 13:27:41 [alert] 321#321: *120616 open socket #23 left in connection 258
2021/09/28 13:27:41 [alert] 321#321: *120615 open socket #42 left in connection 269
2021/09/28 13:27:41 [alert] 321#321: aborting

Можно перезапустить ОС. Если не помогает — соберите debug-сборку Nginx для детальных логов.