Вопрос или проблема
У меня есть проблема: я использую nginx на виртуальной машине Ubuntu для размещения очень простого веб-сайта. Этот веб-сайт настолько прост, что на нем буквально размещена только одна фотография и одна кнопка.
Каждый раз, когда я sudo systemctl restart nginx
, это, похоже, “исправляет” проблему на некоторое время. Но когда я повторно тестирую веб-сайт на своих телефонах и настольном компьютере с несколькими обновлениями для имитации легкого и нормального использования, в конечном итоге страницы загружаются очень долго, и возникают ошибки “не удается подключиться к серверу”.
Вот мой конфигурационный файл: я разработал этот конфигурационный файл после многих часов поиска в Интернете и сбора советов. У меня есть ощущение, что это очень простая проблема, которую я упускаю, потому что, согласно данным в Интернете, nginx должен обрабатывать тысячи подключений одновременно без проблем. Я запускаю сервер с 4 ГБ ОЗУ и 3 ядрами на i7 10750. Пожалуйста, помогите. Пожалуйста, посмотрите конфигурационный файл, чтобы увидеть мою попытку решить проблему, но, как я уже говорил, с течением времени или после определенного числа новых соединений и обновлений он становится невыносимо медленным и больше не может подключиться к серверу после определенного момента.
ИСПРАВЛЕНИЕ: просмотр файла журнала ошибок не выдает никаких ошибок, а другой файл журнала в конечном итоге при загрузке веб-сайта просто выводит ожидаемый результат.
user www-data;
worker_processes auto;
worker_rlimit_nofile 10000;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
##
# Основные настройки
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
keepalive_requests 100;
types_hash_max_size 2048;
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Настройки SSL
##
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
##
# Настройки журналирования
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
##
# Настройки Gzip
##
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Оптимизация клиента
##
client_max_body_size 30M;
client_body_buffer_size 256k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
output_buffers 4 64k;
postpone_output 1460;
##
# Таймауты
##
send_timeout 86400s;
client_body_timeout 60s;
client_header_timeout 60s;
##
# Буферизация соединений
##
proxy_buffering off;
proxy_buffers 16 16k;
proxy_buffer_size 32k;
##
# Настройки кэширования прокси
## (Удалено из других файлов для предотвращения конфликтов)
#proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=100m;
#proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
##
# Ограничения соединений
##
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 100;
##
# Блок сервера
##
server {
listen 80;
server_name directinghomesolutions.com www.directinghomesolutions.com;
root /var/www/html;
# Блокировка запросов к .asp файлам
location ~* \.asp$ {
return 403;
}
# Блокировка определенных подозрительных путей
location ~* /(cgi-bin|boaform|login\.asp) {
return 403;
}
# Заголовки Cache-Control
location / {
add_header Cache-Control "public, max-age=300, must-revalidate";
try_files $uri $uri/ =404;
}
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Ответ или решение
Проблема, с которой вы сталкиваетесь, связана с производительностью вашего Nginx-сервера, который не справляется с определенным количеством новых подключений или обновлений страниц, несмотря на его характерную способность обрабатывать множество соединений. Давайте проанализируем вашу конфигурацию и выявим возможные причины, а затем предложим решения для улучшения работы сервера.
Анализ конфигурации Nginx
-
Обработка соединений:
В вашем конфигурационном файле указано, чтоworker_connections
равно 4096. Это максимальное количество соединений на рабочий процесс, что должно быть достаточно для большинства случаев. Однако максимальное количество соединений, которые ваш сервер может обрабатывать, определяется также количеством рабочих процессов. Вы используетеworker_processes auto
, что значит, что Nginx автоматически определяет количество процессов на основании количества ваших ядер. Можно вручную установить это значение в соответствии с вашими требованиями, чтобы убедиться, что каждый процесс может обрабатывать достаточное количество соединений. -
Ограничение на соединения:
У вас включено ограничение соединений с помощьюlimit_conn
. Это может быть полезно для защиты от DDoS-атак, но в случае вашего веб-сервера может превышать установленный лимит в 100 одновременно открытых соединений, что приводит к ошибкам подключения. Рассмотрите возможность увеличения значенияlimit_conn
или временного отключения этой опции для тестирования. -
Настройки тайм-аутов и буферов:
Ваша настройкаkeepalive_timeout
на 30 секунд иclient_body_timeout
на 60 секунд вполне уместна, но раз вы испытываете длительное время ожидания, у вас могут возникнуть проблемы с сетью или конфигурацией на клиентской стороне. -
Логи:
Вы упомянули, что в логах отсутствуют ошибки, что может указывать на то, что проблема кроется не в конфигурации Nginx. Попробуйте увеличить уровень логирования для более детальной информации, добавив в разделhttp
:log_format detailed '$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_detailed.log detailed;
Решения и рекомендации
-
Тестирование нагрузки:
Проведите нагрузочное тестирование на сервере, используя инструмент таких какApache Benchmark (ab)
илиSiege
, чтобы увидеть, как сервер справляется с определенным количеством запросов. Это поможет вам определить, где возникает проблема. -
Увеличение ресурсов:
Если ваши тесты указывают на то, что сервер испытывает высокую нагрузку, возможно, стоит рассмотреть возможность увеличения выделенных ресурсов (RAM, CPU) на вашей виртуальной машине. -
Настройка кеширования:
Убедитесь, что настройка кеширования (включаяproxy_cache
) правильно настроена и работает. Кеширование может значительно уменьшить нагрузку на сервер, особенно если вы ожидаете много одинаковых запросов к изображению. -
Оптимизация вашего приложения:
Поскольку ваш сайт хостит только одно изображение и кнопку, размер изображения и его формат могут негативно влиять на время загрузки. Убедитесь, что изображение оптимизировано для веба. -
Мониторинг производительности:
Настройте мониторинг для наблюдения за состоянием ресурсов вашего сервера с помощью таких инструментов, какhtop
,netstat
или специализированных сервисов, чтобы увидеть, что происходит во время высокой нагрузки.
Заключение
Согласно вашему описанию, определить точную причину неполадок можно не только на основе конфигурации, но и через тестирование и мониторинг сервера в реальном времени. Следуя вышеперечисленным рекомендациям, вы сможете более точно настроить Nginx и улучшить его производительность, чтобы обработка запросов проходила без задержек.