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

2021年11月22日01:51:44 发表评论 1,807 次浏览

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 nginx

COPY ./default.conf /etc/nginx/conf.d/default.conf

COPY ./backend-not-found.html /var/www/html/backend-not-found.html

COPY ./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.testexample2.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:443

networks:
example1:
external:
name: example1_default
example2:
external:
name: example2_default

在此文件中,你连接代理和外部网络(Web 服务example1example2)。此外,代理服务的 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.confssl.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 反向代理的信息,请查看如何设置和使用 NGINX 作为反向代理。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: