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,跳过.
9. 接下来,启动容器:
sudo docker-compose up -d
步骤 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
第 3 步:列出容器
要验证两个服务的容器是否已启动并正在运行,请使用以下命令列出所有容器:
docker ps -a
你应该会看到输出中列出的两个 Web 服务的容器。
第 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.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:443
networks:
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文件中。
你还将被要求提供一些包含在证书请求中的信息。你可以将某些字段留空。
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
2. 然后,运行容器:
sudo docker-compose up -d
3. 确认你知道有三个容器——两个 Web 服务和一个反向代理容器:
sudo docker ps -a
步骤 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 作为反向代理。