Распространённые ошибки веб-сервера 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 для детальных логов.
