Nginx

Nginx 反向代理到 Tomcat

  • January 30, 2020

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

引用自:https://serverfault.com/questions/763259