Nginx 反向代理至 Tomcat

Nginx 反向代理至 Tomcat

我在 DigitalOcean 上设置了一个 Ubuntu 15.10 x64 服务器来测试几个 Java 应用程序。我安装了 Nginx 1.9.3 和 Tomcat8,并使用 Nginx 作为反向代理将所有请求转发到端口 8080 上的 Tomcat。

事情开始变得棘手了。我在 tomcat 安装上运行两个应用程序,/webapp1 和 /webapp2。我想将 subdomain.domain.com 指向 /webapp1,将 subdomain2.domain.com 指向 /webapp2。在 Apache 中,使用 mod_proxy 可以相当简单,但使用 Nginx 就有点神秘了。

到目前为止,这是我在 sites-enables/domain 文件中尝试过的内容。

第一轮

server{
   server_name subdomain1.domain.com;
   # ******************SSL configuration ************************
   listen 443 ssl default_server;
   ssl_certificate /etc/nginx/conf/ssl/domain.crt;
   ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
   #*********************************************************************

   #**********Proxy**********************
   location / {

   proxy_redirect off;
   proxy_set_header X-Forwarded-Host $host;
   proxy_set_header X-Forwarded-Server $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://subdomain1.domain.com:8080/webapp1/;
}

当我访问时请求有效https://subdomain1.domain.com但是我的应用程序中引用上下文路径(例如 /webapp1/)的任何链接都会导致 URL 包含两个上下文路径,例如https://subdomain1.domain.com/webapp1/webapp1/。这导致各种引用损坏等。

第二轮 我发现了一个讨论类似问题的帖子,解决方法是使用重写从 url 中删除多余的上下文路径。

server{
       server_name subdomain1.domain.com;
       # ******************SSL configuration ************************
       listen 443 ssl default_server;
       ssl_certificate /etc/nginx/conf/ssl/domain.crt;
       ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
       #*********************************************************************

       #**********Proxy**********************
       location / {

       proxy_redirect off;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://subdomain1.domain.com:8080/webapp1/;
       rewrite ^/webapp1/(.*)$ /$1 last;
    }

这解决了我的 URL 中存在双重上下文路径的问题,目前可以正常工作,但我想知道是否有更优雅的解决方案,这样就不需要重写了。从服务器资源的角度来看,我怀疑重写的成本很高,但我不喜欢其中的某些方面。

提前感谢您的时间。

答案1

更新

从那时起,我读到了有关位置配置的内容。这是另一个配置,它解析 URL 中的双重上下文路径,并避免使用重写。基本上,nginx 使用两种位置配置,因此当 uri 具有双重上下文路径时,例如https://subomdain1.domain.com/webapp1/webapp1/,它会在我的第二个位置块中拾取它,并将其转发到我的 tomcat 服务器,但没有第一个上下文路径。我不确定这个或重写解决方案是否更优雅。

     server{
           server_name subdomain1.domain.com;
           # ******************SSL configuration ************************
           listen 443 ssl default_server;
           ssl_certificate /etc/nginx/conf/ssl/domain.crt;
           ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
           #*********************************************************************

           #**********Proxy**********************
           location / {

           proxy_redirect off;
           proxy_set_header X-Forwarded-Host $host;
           proxy_set_header X-Forwarded-Server $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_pass http://subdomain1.domain.com:8080/webapp1/;
           #rewrite ^/webapp1/(.*)$ /$1 last;
        }
           location /webapp1/ {

           proxy_redirect off;
           proxy_set_header X-Forwarded-Host $host;
           proxy_set_header X-Forwarded-Server $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_pass http://subdomain1.domain.com:8080/webapp1/;
        }
    }

相关内容