如何在Docker上部署NGINX反向代理(分步指南)

Docker部署NGINX反向代理教程介绍反向代理拦截传入的请求并将它们定向到适当的服务器。这不仅可以提高性能,还可以增强服务器的安全性。
设置和管理反向代理的最简单方法是使用 Nginx 和 Docker。本指南在 Docker 容器内设置了两个示例 Web 服务,并为这些服务设置了 Nginx 反向代理。
如何在Docker上部署NGINX反向代理?在本教程中,你将学习如何在 Docker 上为两个示例 Web 服务器设置反向代理。
先决条件

  • 具有sudo  权限的用户帐户 
  • 命令行/终端窗口 (  Ctrl-Alt-T  )
  • Docker 安装在你的系统上
  • Docker Compose 安装在你的系统上
  • 一个注册的域名,并带有与之关联的 SSL 证书
为什么需要反向代理?标准代理服务器保护客户端,而反向代理保护服务器。
反向代理是一种设置在专用网络防火墙后面的代理。它的主要作用是拦截流量并将请求定向到后端的适当服务器。
使用反向代理的主要原因是为了提高安全性和性能。如果你的服务在多个 Pod 上运行,你可以重定向进入网络的所有请求,以通过多个指定端口。
此外,反向代理还可以处理 SSL 加密、缓存和压缩数据。
步骤 1:创建示例 Web 服务1. Docker如何部署NGINX反向代理?首先为第一个示例 Web 服务创建一个新目录。在本教程中,我们创建了一个目录example1,但你可以使用你选择的名称。
mkdir example1

2. 进入该目录:
cd example1

3.为第一个容器创建一个docker-compose  YAML配置文件来定义服务。使用你选择的文本编辑器(在本例中,我们使用 Nano)。
sudo nano docker-compose.yml

4.然后,在.yaml文件中添加以下内容:
version: '2' services: app: image: nginx volumes: - .:/usr/share/nginx/html ports: - "80"

docker-compose 文件指定这是一个使用nginx映像的应用服务。它将example1的根从 Docker 主机挂载到/usr/share/nginx/html/。最后,配置在端口80上公开服务。
该泊坞窗,compose.yml文件取决于你要运行该服务。上面的配置特定于我们为本教程创建的 Web 服务。
注意:由于这是一个示例服务,我们没有包含 nginx 镜像的版本号。但是,在生产环境中,请确保也指定版本。
4. 保存并退出文件。
5. 在同一个example1目录中,为 Web 服务创建一个索引文件:
sudo nano index.html

6. 添加几行简单的行出现在示例网页上:
< !DOCTYPE html> < html> < head> < title>Website 1< /title> < /head> < body> < h1>Hello! This is the first sample website.< /h1> < /body> < /html>

7. 保存并关闭文件。
8. 使用以下docker-compose命令构建新创建的服务:
sudo docker-compose build

如果你使用的是预构建的图像,如本例所示,输出响应为app uses an image,跳过.
如何在Docker上部署NGINX反向代理(分步指南)

文章图片
9. 接下来,启动容器:
sudo docker-compose up -d

如何在Docker上部署NGINX反向代理(分步指南)

文章图片
步骤 2:创建第二个示例 Web 服务如何在Docker上部署NGINX反向代理?按照相同的过程创建第二个示例 Web 服务。
如果你仍在example1 中,请确保返回主目录。为此,请cd在终端窗口中运行。
1. 创建一个新目录,你将在其中存储第二个网站的 docker-compose 和索引文件。我们将此目录命名为example2。
mkdir example2

2.通过运行进入example2:
cd example2

3. 创建一个 docker-compose 文件:
sudo nano docker-compose.yml

4. 使用与步骤 1 中相同的规范定义服务。将以下内容添加到文件中:
version: '2' services: app: image: nginx volumes: - .:/usr/share/nginx/html ports: - "80"

5. 保存并退出文件。
6. 然后,通过运行为第二个 Web 服务创建索引文件:
sudo nano index.html

7. 在文件中添加内容:
< !DOCTYPE html> < html> < head> < title>Website 2< /title> < /head> < body> < h1>Hello! This is the second sample website.< /h1> < /body> < /html>

8. 保存更改并退出文件。
9. 构建第二个服务并通过运行以下命令启动容器:
sudo docker-compose build

sudo docker-compose up -d

如何在Docker上部署NGINX反向代理(分步指南)

文章图片
第 3 步:列出容器要验证两个服务的容器是否已启动并正在运行,请使用以下命令列出所有容器:
docker ps -a

你应该会看到输出中列出的两个 Web 服务的容器。
如何在Docker上部署NGINX反向代理(分步指南)

文章图片
第 4 步:设置反向代理如何在Docker上部署NGINX反向代理?接下来,你需要设置和配置一个反向代理容器。这需要创建多个文件和子目录,这些文件和子目录都应该存储在代理目录中。
因此,第一步是创建并导航到代理目录。为此,请运行以下命令:
mkdir proxy

cd proxy

Docker部署NGINX反向代理教程:配置 Dockerfile
1. 进入代理目录后,为新的自定义镜像创建一个Dockerfile:
sudo nano Dockerfile

2. 该文件应包含以下内容:
FROM nginxCOPY ./default.conf /etc/nginx/conf.d/default.confCOPY ./backend-not-found.html /var/www/html/backend-not-found.htmlCOPY ./includes/ /etc/nginx/includes/COPY ./ssl/ /etc/ssl/certs/nginx/

Dockerfile 基于 nginx 镜像。它还从本地机器复制一些文件:
  • 代理服务的默认配置
  • HTML 错误响应
  • 代理和 SSL 配置和证书
3. 保存并退出 Dockerfile。
配置后端未找到的文件
为未找到的响应创建一个索引文件:
sudo nano backend-not-found.html

添加内容:
< html> < head>< title>Proxy Backend Not Found< /title>< /head> < body> < h2>Proxy Backend Not Found< /h2> < /body> < /html>

3. 保存更改并关闭文件。
配置default.conf文件
1.在proxy目录下创建default.conf文件:
sudo nano default.conf

2.添加内容:
# web service1 config. server { listen 80; listen 443 ssl http2; server_name example1.test; # Path for SSL config/key/certificate ssl_certificate /etc/ssl/certs/nginx/example1.crt; ssl_certificate_key /etc/ssl/certs/nginx/example1.key; include /etc/nginx/includes/ssl.conf; location / { include /etc/nginx/includes/proxy.conf; proxy_pass http://example_app_1; }access_log off; error_log /var/log/nginx/error.log error; }# web service2 config. server { listen 80; listen 443 ssl http2; server_name example2.test; # Path for SSL config/key/certificate ssl_certificate /etc/ssl/certs/nginx/example2.crt; ssl_certificate_key /etc/ssl/certs/nginx/example2.key; include /etc/nginx/includes/ssl.conf; location / { include /etc/nginx/includes/proxy.conf; proxy_pass http://example2_app_1; }access_log off; error_log /var/log/nginx/error.log error; }# Default server { listen 80 default_server; server_name _; root /var/www/html; charset UTF-8; error_page 404 /backend-not-found.html; location = /backend-not-found.html { allow all; } location / { return 404; }access_log off; log_not_found off; error_log /var/log/nginx/error.log error; }

该配置由两个 Web 服务组成 –  example1.test和example2.test。两个服务器组件都侦听端口 80 并将 Nginx 定向到相应的SSL 证书。
Docker部署NGINX反向代理教程:配置 docker-compose.yml 文件
1.为代理服务创建一个新的 docker-compose.yml文件:
sudo nano docker-compose.yml

2. 将以下内容复制粘贴到文件中:
version: '2' services: proxy: build: ./ networks: - example1 - example2 ports: - 80:80 - 443:443networks: example1: external: name: example1_default example2: external: name: example2_default

在此文件中,你连接代理和外部网络(Web 服务example1和example2)。此外,代理服务的 80/443 端口绑定到 Docker 主机的 80/443 端口。
Docker如何部署NGINX反向代理:生成密钥和证书
1. 首先在代理文件夹中创建一个子目录 (  ssl  )  :
mkdir ssl

2. 使用以下命令导航到ssl子目录:
cd ssl

3. 接下来,运行下面列出的每个命令以创建所需的文件:
touch example1.crt

touch example1.key

touch example2.crt

touch example2.key

4. 然后,使用 OpenSSL为你的 Web 服务生成密钥和证书。对于第一个 Web 服务 (  example1  ),运行以下命令:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example1.key -out example1.crt

该命令生成一个 2048 位的 RSA 私钥并将其存储到example1.key文件中。
如何在Docker上部署NGINX反向代理(分步指南)

文章图片
你还将被要求提供一些包含在证书请求中的信息。你可以将某些字段留空。
5. 重复该过程为第二个 Web 服务(example2)生成密钥和证书。在终端窗口中输入以下命令:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example2.key -out example2.crt

这将为example2生成一个 2048 位的 RSA 私钥并将其保存在example2.key文件中。
如何在Docker上部署NGINX反向代理:编辑代理和 SSL 配置
1. 退出ssl子目录并返回到proxy。为此,请使用以下命令:
cd ..

2.然后,在名称下创建一个新的子目录包括:
mkdir includes

3. 导航到包含并创建文件proxy.conf和ssl.conf:
cd includes

touch proxy.conf

touch ssl.conf

4.接下来,打开proxy.conf文件:
sudo nano proxy.conf

5、添加如下配置:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_request_buffering off; proxy_http_version 1.1; proxy_intercept_errors on;

6. 保存并退出proxy.conf。
7. 打开 ssl.conf 文件:
sudo nano ssl.conf

8. 在文件中粘贴以下几行:
ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE- ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM- SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256- GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA- AES128-SHAECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256- SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256: DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA- DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256: AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES- CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on;

编辑主机文件
1.返回代理目录:
cd

2. 打开/etc/hosts文件:
sudo nano etc/hosts

3. 添加以下几行以将 Web 服务的主机名映射到 Docker 主机的私有 IP 地址:
10.0.2.15 example1.test 10.0.2.15 example2.test

4. 保存更改并关闭文件。
注意:如果你不知道主机的 IP 地址,请参阅如何在 Linux 中查找或检查你的 IP 地址。
第 5 步:启动反向代理1. 配置文件到位后,使用 docker-compose 命令构建容器:
sudo docker-compose build

如何在Docker上部署NGINX反向代理(分步指南)

文章图片
2. 然后,运行容器:
sudo docker-compose up -d

如何在Docker上部署NGINX反向代理(分步指南)

文章图片
3. 确认你知道有三个容器——两个 Web 服务和一个反向代理容器:
sudo docker ps -a

如何在Docker上部署NGINX反向代理(分步指南)

文章图片
步骤 6:检查反向代理是否正常工作Docker如何部署NGINX反向代理?使用该curl命令检查Web服务和反向代理是否正常工作。每个域都应以适当的输出进行响应。
1. 运行以下命令检查第一个web服务:
sudo curl example1.test

输出响应为example1.test创建的 HTML  。
2. 然后,验证第二个 Web 服务是否与反向代理一起使用:
sudo curl example2.test

输出响应example2.test  HTML。
Docker部署NGINX反向代理教程结论如何在Docker上部署NGINX反向代理?本教程向你展示了如何使用 Docker 为它们设置两个示例 Web 服务和一个 Nginx 反向代理。
【如何在Docker上部署NGINX反向代理(分步指南)】如果你想在 Docker 环境之外了解更多关于 Nginx 反向代理的信息,请查看如何设置和使用 NGINX 作为反向代理。

    推荐阅读