昨天花了大部分时间试图弄清楚为什么我的负载平衡和反向代理无法在 NGINX 中工作,结果发现是的,而且我遇到了完全不同的错误。
我正在为一个 CPU 密集型 REST API(内置于 Flask)提供服务,该 API 在由 Supervisord 生成的多个 Tornado 服务器后面运行。全部位于同一台虚拟机上。NGINX 在 80 上监听并重定向到 8080、8081、8082……
所有这些的目的是处理来自少数实际客户端的大量请求 - API 将被其他应用程序使用 - 所以我试图将处理从源传到新工作器的过程卸载。一个应用程序可能会对 API 进行大量调用,因为它们将为多个人类用户提供服务。
现在,如果我从不同的机器发送多个同时请求,它就会正常工作。每个工作进程/CPU 都处于活动状态,一切正常。
如果我从同一浏览器中的不同选项卡发送多个同时请求,NGINX 会将它们序列化并发送到同一 CPU。因此,如果我从 3 个选项卡(在 chrome 或 Firefox 中)发送 3 个请求,它会按应有的方式循环遍历上游(循环),但每次只能满足一个请求。
有没有办法告诉 NGINX 不论来源如何都平等对待所有请求?
提前致谢。
worker_processes 4;
## Number of file descriptors
worker_rlimit_nofile 8192;
worker_cpu_affinity 0001 0010 0100 1000;
user www-data;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections 4096;
use epoll;
multi_accept off;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
##
# Reverse Proxy Server
##
upstream tornado_flask {
least_conn;
server 127.0.0.1:8080 max_fails=1 fail_timeout=3s;
server 127.0.0.1:8081 max_fails=1 fail_timeout=3s;
server 127.0.0.1:8082 max_fails=1 fail_timeout=3s;
server 127.0.0.1:8083 max_fails=1 fail_timeout=3s;
}
##
# Start Inf API
##
server {
server_name inf.domain.com;
listen 192.168.1.70;
location / {
proxy_pass http://tornado_flask;
}
}
##
# End Inf API
##
}
答案1
我对此进行了排序。结果发现我看到的错误是由于使用同一个浏览器造成的。NGINX 不会将同一个浏览器中的多个选项卡视为同一个连接,因此会按顺序处理。如果我从同一台机器上的两个不同浏览器发送请求,它会正常工作。
将其归咎于测试方法的错误。