我已经通过 Google 搜索并查看了各种示例 SSL 配置,并且似乎我已经正确设置了一切,但是存在两个问题:
- 当我加载时https://mysite.com,浏览器窗口右上角应该出现的锁并没有出现。
- 后台的 Java 应用程序使用 httpUtil.GetRequestURL() 获取当前请求,并且http://mysite.com。
我尝试将 Host 标头设置为 $host 而不是 $http_host,并且尝试设置 proxy_redirect 以将 URL 设置为 https,但都没有任何效果。
我的 SSL 配置如下。有人能告诉我我做错了什么吗?
server {
listen 443;
server_name dev.mysite.com;
access_log /var/log/nginx/dev_mysite_access.log;
error_log /var/log/nginx/dev_mysite_error.log;
ssl on;
ssl_certificate /export/nginx/certs/mysite.com.crt;
ssl_certificate_key /export/nginx/certs/mysite.com.key;
location / {
# give site more time to respond
proxy_read_timeout 120;
# needed to forward user's IP address
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_max_temp_file_size 0;
proxy_pass http://localhost:8081;
}
}
答案1
我的工作中也有类似的配置;nginx 终止 SSL 并将原始 HTTP 传递回 tomcat。我们的应用程序使用多个域名。
我们发现添加以下几行就足够了server.xml
:
scheme="https"
proxyPort="443"
proxyName 不是必需的,也不需要任何其他更改,无论是对 tomcat 还是 nginx。
答案2
已经过去六个多月了,但我会尝试一下。我认为您缺少 X-Forwarded-Proto 标头。nginx 上的相关虚拟主机配置:
server jira.site.com;
...
location /jira {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/jira;
}
在某些情况下,例如上面的 JIRA,您需要告诉 Tomcat 它位于代理后面:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443"
scheme="https"
proxyName="jira.site.com"
proxyPort="443"/>
这样,您可能最终会为每个应用程序获得多个端口,但它可以正常工作。
至于 troyengel,我为什么要费心使用“Nginx + Tomcat”?好吧,nginx 速度更快,而且几乎不占用任何内存和 CPU。这样一来,就可以浪费更多资源,例如在 Tomcat 上。:/
最后,我不会再将 Apache-AJP13-Tomcat 称为合适的集成。启用 Tomcat APR Listener 后:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
和 sendfile (使用方案如果您没有使用 php-fpm 库,那么整个事情就会变得非常顺利。然后,您只需直接从 nginx 提供静态内容,并且仍然有足够的能力通过代理到 php-fpm 来运行每个人最喜欢的 php 网站。
嗯,这只是我的经验,但具体情况因人而异。