[英]Empty REMOTE_ADDR value in Django application, when using nginx as reverse proxy with gunicorn
[英]Performance Decrease When Using Nginx as Reverse Proxy for Sanic + Gunicorn
由于它的快速基准测试,我才刚刚开始学习Sanic框架。 我制作了一个简单的hello world API,然后将其与Gunicorn连接。 性能相当不错,但是当我将其与Nginx结合使用时,它的性能就变得非常差。 我发现使用Nginx的Gunicorn进程被限制为每个进程1%-4%的CPU资源。 没有Nginx,Gunicorn的每个过程最多可以达到10%。 我以为是因为Nginx配置错误。 谁能给我一些建议?
服务器信息:
OS: Ubuntu 18.04
Python version: 3.7.2
Sanic version: 18.12.0
Processor: i3-4130
Sanic + Gunicorn性能:
wrk -t8 -c1000 -d60s --timeout 2s http://127.0.0.1:8080/
Running 1m test @ http://127.0.0.1:8080/
8 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 29.54ms 15.13ms 175.77ms 71.23%
Req/Sec 4.32k 1.29k 19.46k 64.77%
2060010 requests in 1.00m, 249.50MB read
Requests/sec: 34281.64
Transfer/sec: 4.15MB
Sanic + Gunicorn + Nginx性能:
wrk -t8 -c1000 -d60s --timeout 2s http://127.0.0.1:8081/
Running 1m test @ http://127.0.0.1:8081/
8 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 364.78ms 271.20ms 1.39s 67.53%
Req/Sec 370.88 251.66 3.52k 87.12%
177223 requests in 1.00m, 30.42MB read
Requests/sec: 2948.79
Transfer/sec: 518.25KB
Sanic应用程序:
from sanic import Sanic
from sanic.response import json
app = Sanic()
app.config.ACCESS_LOG = False
@app.route("/")
async def test(request):
return json({"hello": "world"})
Gunicorn命令:
gunicorn --bind 127.0.0.1:8080 --workers 8 --threads 4 app:app --worker-class sanic.worker.GunicornWorker --name SanicHelloWorld
全局Nginx配置:
worker_processes 8;
worker_rlimit_nofile 400000;
thread_pool sanic_thread_pool threads=32 max_queue=65536;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
multi_accept on;
worker_connections 25000;
use epoll;
accept_mutex off;
}
http {
access_log off;
sendfile on;
sendfile_max_chunk 512k;
tcp_nopush on;
tcp_nodelay on;
server_names_hash_bucket_size 64;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream sanic-test {
server 127.0.0.1:8080;
}
}
Sanic + Gunicorn的Nginx配置:
server {
listen 8081;
listen [::]:8081;
server_name sanic-test.com www.sanic-test.com;
location / {
aio threads=sanic_thread_pool;
proxy_pass http://127.0.0.1:8080;
}
}
这可能是因为http://nginx.org/r/proxy_buffering默认设置为on
,例如,当您使用http://nginx.org/r/proxy_pass时 。
通常,nginx应该控制后端的背压 ,因此,缓冲非常有意义,因为您不希望真实的后端受到Slowloris攻击向量的影响。 同样,您应该进行缓存并限制与nginx后面的真实后端的连接数,因此,将所有内容都设置为最大但无法禁用缓冲的测试在现实世界中只是不现实的情况,因此您获得的指标非常差。
如果您只是想查看仅通过向HTTP堆栈中添加另一层而对性能产生的影响,则应将proxy_buffering off;
设置proxy_buffering off;
使用proxy_pass
。 否则,测试应该更加现实:不应认为实际的后端每秒能够处理的请求数量比http://nginx.org/r/proxy_temp_path指定的存储设备的IO参数更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.