如何创build一个非高速caching的nginx反向代理?

Nginx应该很快 – 至less有人这样说。

我无法快速获得nginx。 对于基准testing,我使用多个configuration来模拟高负载。 所以我试图负载平衡单个服务器(我知道负载平衡单个服务器是无用的,但testing负载平衡器本身是有效的)。 我已经build立了一个已经优化的Apache反向代理作为参考。 我通过nginx获得80tps左右,当我尝试从同一个后端服务器得到相同的 – 没有caching的文件时,使用apache约350tps。 当然硬件/操作系统是一样的(目前的双核CPU,2G内存,Ubuntu服务器16.04)。

我尝试过更改工作人员,最大连接数,轮询方法,代理缓冲区大小,等待时间和客户端缓冲区。 我可以看到系统负载很低,一个nginx使用大约1%的CPU,连接等待5到6秒左右。 由于我想测量反向代理的性能,我不想在此testing中caching任何内容。

所以问题是:如何优化nginx作为非caching逆向代理的性能?

示例siege-command: siege -c 100 -b -r 100 -v <loadbalancer>/favicon.ico

更新:根据要求提供一些configuration。 为了保持serverfault的一致性,请回答一些关于参数的有用信息。

 user www-data; worker_processes 2; pid /run/nginx.pid; #thread_pool default threads=1500 max_queue=65536; worker_rlimit_nofile 40000; events { worker_connections 768; #multi_accept on; #use epoll; } http { #aio threads=default; #proxy_buffers 32 4m; #proxy_busy_buffers_size 25m; #proxy_buffer_size 512k; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log combined buffer=1k; error_log /var/log/nginx/error.log; gzip off; # gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # 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; upstream kronos-backend { server kronos.example.com; } server { listen 80; listen [::]:80; ssl_certificate /etc/ssl/certs/snakeoil.crt; ssl_certificate_key /etc/ssl/private/snakeoil.key; listen 443 ssl; listen [::]:443 ssl; keepalive_timeout 60; root /var/www/vhosts/default; index index.html; server_name <name>; server_tokens off; # Don't show that nginx is bringing out the website. location / { proxy_set_header Host <name>; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://kronos-backend; client_body_buffer_size 1M; # Lets keep all client-sent bodies in memory if less than 1 Megabyte. (Default for amd64: 16K) client_max_body_size 10M; # Maximum accepted body is 10M (Default is 1M). } } } 

这个configuration不是很干净,我知道。 但它显示或多或less我已经尝试过。 它来源于Ubuntu中nginx-package的默认configuration。

连接采取以下方式:

  +--- apache2 ---+ | | siege -+ +--> some webserver (not of interest) | | +--- nginx -----+ 

所以通过nginx或者apache2传输的数据并不重要,只要没有涉及caching,并且使用相同的url(在这种情况下是一个静态文件)进行testing。 caching机制没有被任何networking服务器故意激活。

在Apache的configuration使用mpm_worker。

 ThreadLimit 600 StartServers 4 ServerLimit 11 MinSpareThreads 50 MaxSpareThreads 100 ThreadsPerChild 200 MaxClients 1000 MaxRequestsPerChild 20000 

上面的攻城命令的输出示例如下:

 $ siege -c 100 -b -r 10 <nginx>/wrapper_2_bg.png ** SIEGE 3.0.5 ** Preparing 100 concurrent users for battle. The server is now under siege.. done. Transactions: 1000 hits Availability: 100.00 % Elapsed time: 11.01 secs Data transferred: 0.12 MB Response time: 0.84 secs Transaction rate: 90.83 trans/sec Throughput: 0.01 MB/sec Concurrency: 76.24 Successful transactions: 1000 Failed transactions: 0 Longest transaction: 6.67 Shortest transaction: 0.03 $ siege -c 100 -b -r 10 <apache>/wrapper_2_bg.png ** SIEGE 3.0.5 ** Preparing 100 concurrent users for battle. The server is now under siege.. done. Transactions: 1000 hits Availability: 100.00 % Elapsed time: 3.16 secs Data transferred: 0.12 MB Response time: 0.22 secs Transaction rate: 316.46 trans/sec Throughput: 0.04 MB/sec Concurrency: 68.95 Successful transactions: 1000 Failed transactions: 0 Longest transaction: 3.06 Shortest transaction: 0.05 

数据包丢失是问题的根源。 在负载平衡器和后端Web服务器之间是一个路由器。 路由器似乎不够快,因为在testing时负载会达到100%。 结果数据包丢失了。

我不知道为什么Apache似乎处理得更好。 将负载均衡器移动到交付networking服务器所在的同一networking,性能几乎相同,而且要高得多。