当使用 gunicorn 应用程序服务器设置 nginx 作为反向代理(后端应用程序服务器和 nginx 之间典型的一对一映射)时,我进行了如下配置:
upstream my_server {
server unix:/home/user/folder/app/app.sock fail_timeout=0;
}
location @https_proxy_to_app {
proxy_set_header X-Forwarded-Proto https;
include proxy_params;
proxy_redirect off;
proxy_pass http://my_server;
}
很多与此相关的文献都提到了这一点。虽然这种方法有效,但我还是有几个问题。
首先(也是很简单的),为什么需要包括http://
在内proxy_pass http://my_server;
?
其次(也是最重要的),我需要设置resolver
为这种设置设置指令吗?我没有使用 AWS 的 Elastic Load Balancer,而且很多处方 大约该resolver
指令恰好围绕 AWS ELB 展开。有人能用通俗易懂的语言解释一下我为什么需要设置它以及如何设置它吗?我是偶然的服务器管理员,所以需要专家意见。
请注意,我还使用了 OSCP 装订。
答案1
resolver
当您的上游服务器使用 DNS 名称定义时,应该使用该指令。
nginx 启动时会评估上游服务器的 IP 地址。
需要注意的是,如果 IP 地址更改为 DNS 名称,nginx 将不会意识到这一点,直到重新启动。
该resolver
指令负责解决这个问题,当定义的缓存(valid=time
)过期时,通过“透明地”更新上游服务器的 IP 地址。
在您的情况下,如果您使用 Unix Socket 而不是 DNS 名称,则该指令将毫无用处。
为什么要指定http
Unix Socket?我承认我不是 100% 确定原因是什么。
肯定主要是因为该proxy_pass
指令要求为代理服务器定义协议和地址,并且 nginx 只允许http
和https
协议。
代理密码网址;
设置代理服务器的协议和地址以及位置应映射到的可选 URI。作为协议,可以指定“http”或“https”。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass