首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx作为含码头Tomcat的反向代理

Nginx作为含码头Tomcat的反向代理
EN

Server Fault用户
提问于 2021-03-29 03:41:45
回答 1查看 2.7K关注 0票数 1

请考虑以下图表:

我有一个来自数字海洋的Debian液滴,我需要在运行Tomcat实例的单个Docker容器中部署N个Java应用程序。

每个映像具有以下Dockerfile配置:

代码语言:javascript
复制
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"]

它的建造有:

代码语言:javascript
复制
docker build -t webapp1 .
docker build -t webapp2 .
...

每个容器都使用以下命令启动:

代码语言:javascript
复制
docker run -it -d -p 8081:8080 webapp1
docker run -it -d -p 8082:8080 webapp2
...

每个应用程序工作正常,可通过液滴IP地址、端口和应用程序名称访问:

代码语言:javascript
复制
http://123.123.123.123:8081/webapp1
http://123.123.123.123:8082/webapp2
...

但是我需要使用一个域名(目前没有SSL ):

代码语言:javascript
复制
http://example.com/webapp1
http://example.com/webapp2
...

因此,我使用Nginx作为反向代理来实现这一点。下面是我使用的sites-available文件夹中的Nginx配置:

default文件:

代码语言:javascript
复制
# 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文件:

代码语言:javascript
复制
# 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文件:

代码语言:javascript
复制
# 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新手。拜托救救我。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2021-03-29 05:06:44

在Nginx中,server配置块定义单个名为虚拟主机。如果您为同一个域定义了多个server块,那么日志中应该有一个警告,但是将选择一个server块,其他块将被忽略。

您需要的是多个location块。所以您需要一个sites-available/example.com配置(从sites-enabled/example.com符号链接),如下所示:

代码语言:javascript
复制
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没有影响,除非添加:

代码语言:javascript
复制

到Tomcat 配置。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1058651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档