我用主机名运行了几个 docker 容器:
web1.local web2.local web3.local
由 nginx 根据主机名路由到这些。我在此设置(在连接到互联网的不同机器上)前面有一个代理,我将上游定义为:
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
Run Code Online (Sandbox Code Playgroud)
和实际的虚拟主机描述:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,因为容器接收主机名“main”而不是“web1.local”,它们不能正确响应请求。
问题:如何在代理请求时告诉 nginx 在 Host: 标头中传递上游服务器的名称而不是上游服务器组的名称?
这是我的第一个 Web 应用程序部署,并且遇到了各种问题。
我目前正在为 Django 应用程序寻找 nginx + gunicorn 实现,但这个问题主要与 nginx 配置有关。对于某些情况 - nginx 将接收到 gunicorn 本地服务器的连接和代理。
在 nginx 配置中,它说server_name
我必须提供一个吗?我不打算使用任何类型的域名,只是通过我网络的外部 ip(它是静态的)和要监听的端口号。
我的愿望是当我访问类似的东西时,http://xxx.xxx.xxx.xxx:9050
我将能够获得该网站。
以下是我将基于配置的示例代码以供参考。
server {
listen 80;
server_name WHAT TO PUT HERE?;
root /path/to/test/hello;
location /media/ {
# if asset versioning is used
if ($query_string) {
expires max;
}
}
location /admin/media/ {
# this changes depending on your python version
root /path/to/test/lib/python2.6/site-packages/django/contrib;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP …
Run Code Online (Sandbox Code Playgroud) 我在 nginx 上有一个反向代理,它代理了很多站点。我最近为所有启用 SSL 的网站启用了 HTTP Strict Transport Security。我现在有一个不想启用此功能的站点。
我想我会做一个简单的检查,如果我的上游已经给我发送了一个Strict-Transport-Security
-header,如果没有,就添加一个。这样,我的上游可以发送包含max-age=0
避免代理启用 HSTS的 STS 标头。
我以为我只需按如下方式更改我的配置:
location / {
proxy_pass http://webservers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto "https";
if ($upstream_http_strict_transport_security = "") {
add_header Strict-Transport-Security "max-age=15552000";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,可能是因为if 是 evil,这不起作用。我尝试了很多不同的方法来确保变量确实存在(就是这种情况),但似乎没有任何帮助。
我怎么能让这个工作?