Nginx 作为 Docker 容器中的 Tomcat 的反向代理

Nginx 作为 Docker 容器中的 Tomcat 的反向代理

请考虑下图:

基础设施图

我有一个来自 Digital Ocean 的 Debian droplet,我需要在运行 Tomcat 实例的单个 Docker 容器内部署 N Java 应用程序。

每个镜像都有以下 Dockerfile 配置:

FROM tomcat:jdk8-openjdk
LABEL maintainer="[email protected]"
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 新手。请帮忙。

答案1

在 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>配置。

相关内容