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 中,這有點神秘。
到目前為止,這是我在我的站點啟用/域文件中嘗試的內容。
第一輪
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/)的任何連結都會生成一個包含兩個上下文路徑(例如https://subdomain1.domain)的 url。 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 中的雙重上下文路徑的問題,並且現在可以工作,但我想知道是否有更優雅的解決方案,這樣就不需要重寫。從伺服器資源的角度來看,我懷疑重寫成本很高,但我不喜歡它。
提前感謝您的寶貴時間。
更新
從那以後,我已經閱讀了有關位置配置的資訊。這是解決 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/; } }