В настоящее время я использую nginx для прокси-сервера в Gunicorn с 8 рабочими. Я использую очень большой экземпляр Amazon с 4 виртуальными ядрами. Когда я подключаюсь к Gunicorn напрямую, я получаю около 10 тысяч запросов в секунду. Когда я обслуживаю статический файл из nginx, я получаю около 25 запросов в секунду.
Но когда я размещаю Gunicorn за nginx на том же физическом сервере, я получаю около 5K запросов в секунду. Я понимаю, что у nginx будет некоторая задержка, но я думаю, что может быть проблема, так как она падает на 50%. Кто-нибудь слышал о подобном? любая помощь была бы замечательной!
Вот соответствующая конфигурация nginx:
worker_processes 4;
worker_rlimit_nofile 30000;
events {
worker_connections 5120;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
}
сайты включены / по умолчанию:
upstream backend {
server 127.0.0.1:8000;
}
server {
server_name api.domain.com ;
location / {
proxy_pass http://backend;
proxy_buffering off;
}
}
Обязательно добавьте multi_accept on;
директива к вашему блоку событий. Это гарантирует, что каждый работник принимает как можно больше соединений.
Не используй tcp_nodelay on;
если вы не обслуживаете огромные данные / потоки. Даже если вы есть, вам нужно активировать его только в соответствующем блоке локации.
Не проксируйте все на свой сервер, а только на то, что действительно должно обслуживаться вашим сервером. Вы также можете создать кеш прокси, чтобы ускорить все еще больше. Ниже приведен пример конфигурации, которую я создал в соответствии с конфигурацией, которую вы разместили выше.
# /etc/nginx/nginx.conf
worker_processes 4;
worker_rlimit_nofile 20480; # worker_connections * 4
events {
multi_accept on;
worker_connections 5120;
use epoll;
}
http {
charset utf-8;
client_body_timeout 65;
client_header_timeout 65;
client_max_body_size 10m;
default_type application/octet-stream;
keepalive_timeout 20;
reset_timedout_connection on;
send_timeout 65;
server_tokens off;
sendfile on;
server_names_hash_bucket_size 64;
tcp_nodelay off;
tcp_nopush on;
include sites-enabled/*.conf;
}
И виртуальный хост.
# /etc/nginx/sites-available/default.conf
upstream backend {
server 127.0.0.1:8000;
}
server {
server_name api.domain.com;
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_buffering off;
proxy_pass http://backend;
}
}