Nginx

Nginx 作為 Docker 包含的 Tomcat 的反向代理

  • March 29, 2021

考慮下圖:

基礎架構圖

我有一個來自 Digital Ocean 的 Debian droplet,我需要在執行 Tomcat 實例的單個 Docker 容器中部署 N 個 Java 應用程序。

每個鏡像都有以下 Dockerfile 配置:

FROM tomcat:jdk8-openjdk
LABEL maintainer="admin@mail.com"
ADD webapp1.war /usr/local/tomcat/webapps/ #webapp1, webapp2,... webappN
EXPOSE 8080
CMD ["catalina.sh", "run"]

並內置:

docker build -t webapp1 .
docker build -t webapp2 .
...

每個容器都使用以下命令啟動:

docker run -it -d -p 8081:8080 webapp1
docker run -it -d -p 8082:8080 webapp2
...

每個應用程序都可以正常工作,並且可以通過 Droplet IP 地址、埠和應用程序名稱訪問:

http://123.123.123.123:8081/webapp1
http://123.123.123.123:8082/webapp2
...

但我需要使用域名(暫時沒有 SSL):

http://example.com/webapp1
http://example.com/webapp2
...

所以我使用 Nginx 作為反向代理來實現這一點。以下是sites-available我正在使用的文件夾中的 Nginx 配置:

預設文件:

# Default server configuration
#
server {
   listen 80 default_server;
   listen [::]:80 default_server;

   root /var/www/html;

   # Add index.php to the list if you are using PHP
   index index.html index.htm index.nginx-debian.html;

   server_name _;

   location / {
       try_files $uri $uri/ =404;
   }
}

webapp1 文件:

# webapp1 configuration
#
server {
 listen 80;

 server_name example.com;
 access_log /var/log/nginx/tomcat-access.log;
 error_log /var/log/nginx/tomcat-error.log;

 location / {
       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://123.123.123.123:8081/;
 }
}

webapp2 文件:

# webapp2 configuration
#
server {
 listen 80;

 server_name example.com;
 access_log /var/log/nginx/tomcat-access.log;
 error_log /var/log/nginx/tomcat-error.log;

 location / {
       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://123.123.123.123:8082/;
 }
}

這就是問題所在,當我部署第一個應用程序並使其可通過域名 ( example.com/webapp1) 訪問時,它工作正常,但當我嘗試訪問example.com(我的登錄頁面)時出現 404 錯誤。我決定稍後解決這個問題,最好嘗試部署第二個應用程序。它起作用了,webapp2 已成功部署並且可以通過example.com/webapp2但現在兩者example.comexample.com/webapp1給出了 404 錯誤。

我是 Nginx 和 Docker 新手。請幫忙。

在 Nginx 中,server配置塊定義了一個命名的虛擬主機。如果您server為同一個域定義多個塊,日誌中應該會有警告server,但會選擇單個塊,其他塊將被忽略。

您需要的是多個location塊。所以你需要一個像這樣的單一sites-available/example.com配置(從符號連結sites-enabled/example.com):

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   root /var/www/html;

   server_name example.com;

   location / {
       try_files $uri $uri/ =404;
   }

   # For each web application
   location /webapp1/ {
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://192.0.2.1:8081;
   }
}

備註X-Forwarded-ForX-Forwarded-Proto標頭對Tomcat沒有影響,除非您添加:

   <Valve className="org.apache.catalina.valves.RemoteIpValve" />

到Tomcat<Host>配置。

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