我使用 nginx 作为 tomcat 上 Java spring boot + Angular 应用程序的负载均衡器和反向代理。我总共有 3 台服务器,其中 1 台有 nginx,另外 2 台托管应用程序。
我在 nginx 上配置了 HTTPS 和 SSL,以便用户可以通过 HTTPS 进行通信。通过以下配置,我可以通过 https 访问应用程序的登录页面,但当我单击登录按钮时,控制台中出现错误
混合内容:页面“https://example/app/login”通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点“http://172.16.1.70:8081/app/api/login”。此请求已被阻止;内容必须通过 HTTPS 提供。
这是我的 Nginx 配置
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
access_log logs/access.log;
# Load Balancer Setup
upstream tomcat {
server 172.168.1.10:8443;
server 172.168.1.15:8443;
ip_hash;
}
server {
listen 80 ;
listen 443 ssl http2;
server_name localhost;
ssl_certificate C:/ssl/sslcert.pem;
ssl_certificate_key C:/ssl/sslcert-key.pem;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
location /app {
proxy_read_timeout 120;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cookie_path ~*^/.* /;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat;
}
# Auto redirect to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
# Auto redirect to localhost/app
location / {
return 307 /app;
}
}
}
这是我的 tomcat server.xml 配置
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8443" protocol="HTTP/1.1"
connectionTimeout="20000"
proxyPort="443"
scheme="https" secure="true"
/>
我尝试通过检查网络选项卡进行调试,它以某种方式将登录页面重定向到http://172.168.1.10:8081/app/api/login代替http://172.168.1.10:8443/app/api/login。
我该如何解决这个问题?任何帮助都将不胜感激。
答案1
配置后端服务器以提供指向反向代理的 URL。使用 Tomcat 时,这通常通过连接器处的proxyName
和proxyPort
属性来完成。您缺少前者。
根据在 Tomcat 上运行的应用程序的构建方式,可能还需要在某些特定于应用程序的配置中对其进行配置。