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

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

我已经通过 Google 搜索并查看了各种示例 SSL 配置,并且似乎我已经正确设置了一切,但是存在两个问题:

  1. 当我加载时https://mysite.com,浏览器窗口右上角应该出现的锁并没有出现。
  2. 后台的 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 网站。

嗯,这只是我的经验,但具体情况因人而异。

相关内容