最近我们在 varnish 前面添加了 nginx,用于 ssl 卸载。我们原本打算将所有 http 请求重写为 https。但后来我们发现,即使是 http 调用,如果由 nginx 提供服务,响应时间也会显著增加。而如果由 varnish 提供服务,而没有使用 nginx,响应时间会快很多。
我调整了代理缓冲区(2048 4k),这样响应就不会存储在文件中,并且还关闭了代理缓冲。但这两种方法都没有帮助。所以我克隆了 nginx 服务器(虚拟机),并对克隆的服务器发出了相同的请求。响应时间与 varnish 相当。
因此,当 nginx 上有负载(大约 700 个请求/秒)时,响应时间似乎会增加。
有人能告诉我我是否遗漏了一些显而易见的东西吗?
这是我的 nginx 配置
#nginx.conf
worker_processes auto;
worker_rlimit_nofile 90000;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log error;
events {
worker_connections 40000;
multi_accept on;
use epoll;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
client_body_buffer_size 128k;
server_tokens off;
keepalive_requests 1000;
reset_timedout_connection on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL common settings
##
include /etc/nginx/include.d/ssl-common;
##
# Logging Settings
##
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_length $request_time '
'$upstream_response_length $upstream_response_time '
'$upstream_status';
log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $status / upstream $upstream_status $request upstream_response_time $upstream_response_time msec $msec request_time $request_time body: $request_body';
log_format timed_combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$upstream_connect_time $upstream_header_time '
'$request_time $upstream_response_time $pipe';
access_log off;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
#Proxy config
proxy_buffering on;
proxy_buffers 56 4k;
proxy_busy_buffers_size 8k;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#For a specific request I've increased the proxy buffer size
proxy_buffers 2048 4k;
proxy_buffer_size 4k;
proxy_busy_buffers_size 8k;
#Upstream setting
keepalive 2000;
我甚至优化了 sysctl.config 中的 tcp 设置,但这也无济于事。这是我的 sysctl.config
#sysctl.config
fs.file-max = 100000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.min_free_kbytes = 65536
这是磁盘 IO 的图表。 注意:我最近才添加了 Tcp 连接统计信息,因此没有太多信息。
答案1
错误日志里有什么内容吗?
最近遇到了一个问题,系统文件句柄用完了,因为它缓冲了每个请求,并且上游保持活动未启用。不过,我没想到这些设置会导致这些问题。
不知道您的硬件情况如何,但每秒 700 个 SSL 请求/sa 相当繁重,是否有任何 iowait?cpu 是否已满?对于该级别的流量,“keepalive_timeout 65”看起来也很高,您可能耗尽了 tcp 连接。我发现 ~300 req/s 的最佳结果非常短,大约 1-3 秒,但这取决于您的负载。