我们的设置如下:多个子域名指向同一个服务器,该服务器运行 nginx 作为每个子域名的代理。所有子域名目前都用于测试开发中的功能,因此其内容大致相同。
每个 nginx 站点配置文件大致如下
server {
listen 80;
server_name full.web.address;
location / {
proxy_pass http://devhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_cache global;
proxy_cache_valid 200 302 600m;
proxy_cache_valid 404 1m;
}
location /robots.txt {
alias /var/www/default/robots.txt;
}
}
server {
listen 443;
server_name full.web.address;
location / {
proxy_pass http://devhost:8080/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_cache global;
proxy_cache_valid 200 302 600m;
proxy_cache_valid 404 1m;
}
location /robots.txt {
alias /var/www/default/robots.txt;
}
ssl on;
ssl_certificate /etc/nginx/combined.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
}
devhost 或任何其他主机名,在重启时由脚本在 /etc/hosts 中设置。我们现在有三台 Tomcat 7 服务器正在运行,在它们的所有 web.xml 文件中,我们都有以下内容:
<security-constraint>
<web-resource-collection>
<web-resource-name>Confidential resources</web-resource-name>
<url-pattern>/manager/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>
CONFIDENTIAL
</transport-guarantee>
</user-data-constraint>
</security-constraint>
每个 server.xml 都有相同的内容:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8" />
<Engine name="Catalina" defaultHost="full.web.address">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="full.web.address" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
它们也使用相同的 WAR 文件。我实际上复制了所有内容,只是更改了名称和 IP 地址。问题是,在其中一个文件中,https://full.web.address/manager/没有问题,但在其他情况下,它会进入无限重定向循环。设置和内容完全相同。
答案1
新的一天,新的想法。我查看了 Tomcat 的 Valve 文档,它提供了答案https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html在内部代理中:
默认情况下,允许 10/8、192.168/16、169.254/16 和 127/8;172.16/12 默认未启用,因为用正则表达式描述比较复杂
无法正常工作的服务器位于 172.16/12 子组中,因为它位于 Docker 容器中。由于外部无法访问它,并且其端口未被转发,因此可以安全地设置 internalProxies=".*"
答案2
“172.16/12 默认未启用,因为用正则表达式描述起来很复杂”这句话让我第一次读到时感到很尴尬。无论如何,你可以直接复制粘贴正则表达式RemoteIpValve 的 Tomcat 8 文档.以下是完整示例:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}| 169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}| 172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}| 172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}"
protocolHeader="X-Forwarded-Proto" />
也许您可以将其纳入您的答案中?