Nginx 作為 Docker 包含的 Tomcat 的反向代理
考慮下圖:
我有一個來自 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.com
都example.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-For
和X-Forwarded-Proto
標頭對Tomcat沒有影響,除非您添加:<Valve className="org.apache.catalina.valves.RemoteIpValve" />
到Tomcat
<Host>
配置。