nginx 反向代理使我的吞吐量降低了一半

nginx 反向代理使我的吞吐量降低了一半

我目前使用 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;
  }
}

相关内容