Nginx 的反向代理设置(一)

本文演示 Nginx 的反向代理基础设置。 在演示中,使用在了在 在Docker中使用 Nginx 服务器 中构建好的 Nginx 镜像作为反向代理服务和 将 Web 应用部署到运行在 Docker 中的 Tomcat 构建好的 Java web 应用镜像作为后端服务,应用 docker 和 docker-compose 简化了环境的搭建。

在本次演示中,我们先演示一个最简单的反向代理环境: 一台运行在 Tomcat 中的 Java Web 应用作为后端服务,因为我们使用了 docker 运行,所以该服务会运行在 Docker 的虚拟网络中,不具备外网地址,如果我们不配置端口映射,该服务也服务通过宿主机镜进行访问,这样就模拟了后端服务不能从外部进行访问的情况;然后再用一台运行 Nginx 的服务作为反向代理服务器,通过配置将所有的访问路由到后端的 Java Web 服务中。

Nginx 配置文件

在我们使用的 Nginx 镜像中,默认的站点配置文件放置在镜像的 /etc/nginx/conf.d/default.conf 中,因此构建一个名为 default.conf 的文件,内容如下:

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
listen [::]:80 default_server;

location / {
proxy_pass http://app1:8080;
}
}

可以看到,我们使用 proxy_pass 指令将对默认”/“的访问全部路由到了后端服务的 8080 端口。

Docker-Compose 文件

在 default.conf 文件所在的目录中在新建一个名为: docker-compose.yml 文件。内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '2'

services:
proxy:
image: my-nginx:1.0
container_name: Proxy-Srv
hostname: proxy
ports:
- "80:80"
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
links:
- app1
depends_on:
- app1
app1:
image: hello-servlet:1.0
container_name: App1-Srv
hostname: app1

可以看到:

  1. 我们将后端服务运行的容器名为为 app1, 然后使用 docker 虚拟网络的 dns 进行解析,这样在 proxy_pass 指令中就可以直接使用 app1 作为后端服务的主机名。
  2. 为了使 proxy 能被外访问,我们映射了 80 端口
  3. 为了使 proxy 容器与 app1 能相互访问,我们使用了 links 指令连接两个容器
  4. 因为 proxy_pass 指令解析时需要访问 app1, 因此 app1 容器必须在 proxy 容器之前启动发,我们使用 depends_on 指令来解决这个问题。

运行演示

以上文件都准备好以后,可以在同目录(docker-compose.yml 所在目录)中执行

1
docker-compose up -d

已启动两个关联的容器。

启动成功后,就可以在浏览器中访问:

1
http://localhost:8080/hello-servelt-1.0

查看返回的结果了。

本文标题:Nginx 的反向代理设置(一)

文章作者:Morning Star

发布时间:2020年12月16日 - 10:12

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/nginx/nginx-setup-proxy-01/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。