配置 nginx 以与 Tomcat 和 SSL 一起使用

Jan*_*mer 6 ssl tomcat nginx

我在谷歌上搜索并查看了各种示例 SSL 配置,看起来我已经设置好了,但是有两个问题:

  1. 当我加载https://mysite.com 时,应该出现在浏览器窗口右上角的锁没有出现。
  2. 幕后的 Java 应用程序使用 httpUtil.GetRequestURL() 来获取当前请求,它是http://mysite.com

我尝试将主机标头设置为 $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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ell 7

我们在我的工作中有类似的配置;nginx 终止 SSL 并将原始 HTTP 传递回 tomcat。我们的应用程序使用多个域名。

我们发现将这些行添加到 就足够了server.xml

    scheme="https"
    proxyPort="443"
Run Code Online (Sandbox Code Playgroud)

proxyName 不是必需的,也不需要任何其他更改,无论是 tomcat 还是 nginx。


小智 6

已经超过六个月了,但我会试一试。我认为您缺少 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;
        }
Run Code Online (Sandbox Code Playgroud)

在某些情况下,例如上面的 JIRA,您需要告诉 Tomcat 它在代理之后:

   <Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443"
           scheme="https"
           proxyName="jira.site.com"
           proxyPort="443"/>
Run Code Online (Sandbox Code Playgroud)

这样你最终可能会为每个应用程序使用多个端口,但它工作得很好。

至于 troyengel,我为什么要为“Nginx + Tomcat”而烦恼?嗯,nginx 速度更快,而且几乎不占用内存和 CPU。这样就会浪费更多资源,例如在 Tomcat 上。:/

最后,我不会再将 Apache-AJP13-Tomcat 称为适当的集成。启用 Tomcat APR 侦听器后:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
Run Code Online (Sandbox Code Playgroud)

和 sendfile(带有tcnative库),整个过程就这么顺利。然后你只需直接从 nginx 提供静态内容,你仍然有足够的能力通过代理到 php-fpm 来运行每个人最喜欢的 php 站点。

嗯,这只是我的经验,不过 ymmv。