请考虑下图:
我有一个来自 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.com
都example.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-For
和X-Forwarded-Proto
标头对 Tomcat 没有影响,除非您添加:
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
Tomcat<Host>
配置。