我在 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/;
}
}