我目前使用 nginx 代理回 gunicorn,有 8 个工作线程。我使用的是具有 4 个虚拟核心的 amazon 超大实例。当我直接连接到 gunicorn 时,我每秒收到大约 10K 个请求。当我从 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;
}
}
答案1
确保将该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;
}
}