当我将反向代理设置为从其自己的端口 80 转发到其自己的端口 8080 时,我收到以下警告
2016/03/28 22:05:59 [alert] 4193#0: 512 worker_connections are not enough
这可能是无限循环的结果。
在接受的答案中Nginx 配置:前端反向代理到另一个端口,用户写道:“我假设 nginx 不是监听端口 5010 和 80 的服务器,对吗?”是因为反向代理无法转发到自身吗?还是说这个无限循环的发生还有其他原因,而那条评论只是转移注意力的借口?
下面是我的 nginx.conf。当我访问 router.example.com 时,我收到警告。当我删除 之间的内容时#### BEGIN BAD LINES ####
,它运行正常。
user root;
worker_processes 1;
worker_cpu_affinity 0101;
master_process off;
worker_priority 10;
error_log /tmp/var/log/nginx/error.log;
pid /tmp/var/run/nginx.pid;
worker_rlimit_nofile 8192;
events {
worker_connections 512;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Because end of http://nginx.org/en/docs/http/server_names.html
server_names_hash_bucket_size 64;
# From NixCraft
# http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html
# Host required
server {
listen 80 default_server;
server_name "";
return 444;
}
#### BEGIN BAD LINES ####
## Start router proxy ##
server {
listen 80;
server_name router.example.com
tomatopaste.example.com;
access_log /var/log/nginx/log/router.example.access.log main;
error_log /var/log/nginx/log/router.example.error.log;
## send request back to apache1 ##
location / {
proxy_pass http://192.168.1.1:8080/;
proxy_redirect default;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
## End ##
#### END BAD LINES ####
## Start primary proxy ##
server {
listen 80;
server_name jira.example.com
confluence.example.com
stash.example.com
cacti.example.com;
access_log /var/log/nginx/log/lamp.example.access.log main;
error_log /var/log/nginx/log/lamp.example.error.log;
## send request back to apache1 ##
location / {
proxy_pass http://192.168.1.99/;
proxy_redirect default;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
## End ##
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Websockets
server {
listen 8686;
server_name other.example.com;
location / {
proxy_pass http://192.168.1.99:8686;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
答案1
我认为问题不在于“为什么反向代理不能指向自身?”而是“为什么不应该反向代理指向自身吗?正如评论者指出的那样,、nginx
和httpd
其他代理软件能配置为将连接代理回自身;软件或配置中没有任何内容防止这。
但是,正如您所猜测的,问题变成了资源问题。配置为将请求代理回自身(直接或间接通过另一个代理,例如httpd
)的 HTTP 反向代理需要维护该请求的某些状态(以便将响应发送回调用者)。如果请求只是反复循环通过相同的代理(由于配置),最终会达到某些状态/资源限制,例如:
512 worker_connections are not enough
并且请求转发终止。因此,“为什么不应该反向代理指向自身?”的常见问题是:“最终,反向代理会耗尽资源,无法正确处理请求。”随着链中反向代理数量的增加,无意配置导致循环/周期的可能性也会增加,并且随着循环中的代理数量的增加,更难探测这样的循环正在发生。(也许像httpd
和这样的应用程序nginx
可以检查像这样的标头X-Forwarded-For
,假设标头值是可信的,以检测这样的循环,IE查看代理本身是否已经出现在该转发链中?)
在您的特定情况下,为了通过经验证明它确实是一个无限的转发循环,我们需要将httpd
日志条目与nginx
日志条目关联起来;我怀疑我们确实会通过这样做在反向代理图中看到循环。
希望这可以帮助!