Ubuntu 20.04 的 Docker 中部署 NGINX 反向代理

当我们需要公开多个端口以访问应用程序的不同模块时,代理在开发环境中非常有用。 我们可以使用反向代理通过同一个 URL 访问应用程序的不同模块。 它还将帮助我们使用单个域名访问后端、前端和其他服务。

在这篇文章中,我们将在两个 Docker 容器中设置两个网站,然后设置一个 Nginx 反向代理来访问这两个网站。

先决条件

  • 云平台上的全新 Ubuntu 20.04 服务器
  • 在我们的服务器上配置的 root 密码

出于本教程的目的,我们将使用以下目录结构:

├── proxy
│   ├── backend-not-found.html
│   ├── default.conf
│   ├── docker-compose.yml
│   ├── Dockerfile
│   ├── includes
│   │   ├── proxy.conf
│   │   └── ssl.conf
│   └── ssl
│       ├── website1.crt
│       ├── website1.key
│       ├── website2.crt
│       └── website2.key
├── website1
│   ├── docker-compose.yml
│   └── index.html
└── website2
    ├── docker-compose.yml
    └── index.html

第 1 步 – 创建 云服务器

首先,登录到我们的 云服务器。 创建一个新服务器,选择 Ubuntu 20.04 作为至少 4GB RAM 的操作系统。 通过 SSH 连接到我们的云服务器并使用页面顶部突出显示的凭据登录。

登录到 Ubuntu 20.04 服务器后,运行以下命令以使用最新的可用软件包更新基本系统。

apt-get update -y

第 2 步 – 设置主机文件

首先,我们需要编辑 /etc/hosts 文件并将两个网站域与 IP 地址绑定:

nano /etc/hosts

添加以下行:

wer-server-ip   website1.test
wer-server-ip   website2.test

完成后保存并关闭文件。

第 3 步 – 安装 Docker 和 Docker Compose

首先,我们需要在服务器上安装一些必需的依赖项。 我们可以使用以下命令安装它们:

apt-get install git apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

安装完所有这些后,使用以下命令添加 Docker 存储库:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

添加存储库后,使用以下命令安装 Docker 和 Docker Compose:

apt-get install docker-ce docker-compose -y

安装这两个软件包后,我们可以继续下一步。

第 4 步 – 创建第一个网站容器

首先,创建一个目录来托管我们的第一个网站容器。

mkdir website1

接下来,将目录更改为 website1 并创建一个 docker-compose.yml 文件:

cd website1
nano docker-compose.yml

添加以下行:

version: '2'
services:
 app:
  image: nginx
  volumes:
   - .:/usr/share/nginx/html
  ports:
   - "80"

完成后保存并关闭文件。

接下来,为我们的网站创建一个索引页面。

nano index.html

添加以下行:




First Website


Hello! This is my first website.

保存并关闭文件,然后使用以下命令启动我们的 website1 容器:

docker-compose build
docker-compose up -d

这将下载一个 Nginx 镜像,启动一个容器,并在端口 80 上公开它。

Creating network "website1_default" with the default driver
Pulling app (nginx:)...
latest: Pulling from library/nginx
69692152171a: Already exists
30afc0b18f67: Pull complete
596b1d696923: Pull complete
febe5bd23e98: Pull complete
8283eee92e2f: Pull complete
351ad75a6cfa: Pull complete
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for nginx:latest
Creating website1_app_1 ... done

第 5 步 – 创建第二个网站容器

首先,创建一个目录来托管我们的第二个网站容器。

cd
mkdir website2

接下来,将目录更改为 website2 并创建一个 docker-compose.yml 文件:

cd website2
nano docker-compose.yml

添加以下行:

version: '2'
services:
 app:
  image: nginx
  volumes:
   - .:/usr/share/nginx/html
  ports:
   - "80"

保存并关闭文件,然后为第二个网站创建一个索引页面。

nano index.html

添加以下行:




Second Website


Hello! This is my second website.

保存并关闭文件,然后使用以下命令启动我们的 website2 容器:

docker-compose build
docker-compose up -d

我们应该看到以下输出:

Creating network "website2_default" with the default driver
Creating website2_app_1 ... done

我们现在可以使用以下命令验证两个网站容器:

docker ps

我们应该得到以下输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                     NAMES
01e83ba3a3dd   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:49154->80/tcp, :::49154->80/tcp   website2_app_1
75207f53411c   nginx     "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        0.0.0.0:49153->80/tcp, :::49153->80/tcp   website1_app_1

第 6 步 – 设置反向代理容器

首先,使用以下命令创建一个新的代理目录:

cd
mkdir proxy

接下来,将目录更改为代理并为新的自定义映像创建 Dockerfile:

cd proxy
nano Dockerfile

添加以下行:

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/

保存并关闭文件,然后为未找到的响应创建一个后端索引文件。

nano backend-not-found.html

添加以下行:


Proxy Backend Not Found

Proxy Backend Not Found

保存并关闭文件,然后创建一个 Nginx 默认配置文件:

nano default.conf

添加以下行:

server {
listen 80;
listen 443 ssl http2;
server_name website1.test;

# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/website1.crt;
ssl_certificate_key /etc/ssl/certs/nginx/website1.key;
include /etc/nginx/includes/ssl.conf;

location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://website1_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 website2.test;

# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/website2.crt;
ssl_certificate_key /etc/ssl/certs/nginx/website2.key;
include /etc/nginx/includes/ssl.conf;

location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://website2_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;
}

完成后保存并关闭文件。

接下来,创建一个 docker-compose.yml 文件来启动一个代理容器:

nano docker-compose.yml

添加以下行:

version: '2'
services:
 proxy:
  build: ./
  networks:
   - website1
   - website2
  ports:
   - 80:80
   - 443:443

networks:
 website1:
  external:
   name: website1_default
 website2:
  external:
   name: website2_default

完成后保存并关闭文件。

接下来,我们需要为这两个网站生成 SSL 证书和密钥。

首先,在我们的代理目录中创建一个 SSL 目录:

mkdir ssl

接下来,将目录更改为 ssl 并使用以下命令生成 ssl 证书和密钥:

cd ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -kewet website1.key -out website1.crt
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -kewet website2.key -out website2.crt

接下来,回到我们的代理目录并创建一个包含目录:

cd ..
mkdir includes

接下来,将目录更改为包含并创建代理配置文件:

cd includes
nano proxy.conf

添加以下行:

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;

保存并关闭文件,然后创建一个 ssl.conf 文件:

nano ssl.conf

添加以下行:

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;

完成后保存并关闭文件。

接下来,回到代理目录并使用以下命令构建代理容器:

cd ..
docker-compose build

我们应该看到以下输出:

Building proxy
Step 1/5 : FROM nginx
 ---> d1a364dc548d
Step 2/5 : COPY ./default.conf /etc/nginx/conf.d/default.conf
 ---> d70a72d6011f
Step 3/5 : COPY ./backend-not-found.html /var/www/html/backend-not-found.html
 ---> 1cb5af66233f
Step 4/5 : COPY ./includes/ /etc/nginx/includes/
 ---> 7c18f2753b1e
Step 5/5 : COPY ./ssl/ /etc/ssl/certs/nginx/
 ---> ebb0447a1317
Successfully built ebb0447a1317
Successfully tagged proxy_proxy:latest

接下来,使用以下命令启动代理容器:

docker-compose up -d

输出:

Creating proxy_proxy_1 ... done

我们现在可以使用以下命令验证所有容器:

docker ps -a

我们应该得到以下输出:

CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS                      PORTS                                                                      NAMES
c413da7e85ba   proxy_proxy   "/docker-entrypoint.…"   16 seconds ago      Up 15 seconds               0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   proxy_proxy_1
01e83ba3a3dd   nginx         "/docker-entrypoint.…"   52 minutes ago      Up 52 minutes               0.0.0.0:49154->80/tcp, :::49154->80/tcp                                    website2_app_1
75207f53411c   nginx         "/docker-entrypoint.…"   53 minutes ago      Up 53 minutes               0.0.0.0:49153->80/tcp, :::49153->80/tcp                                    website1_app_1

第 7 步 – 检查 Nginx 反向代理

至此,网站和代理容器都启动成功。 现在,是时候测试它了。

首先,我们的第一个网站使用以下命令:

curl website1.test

如果一切正常,我们应该会看到我们的第一个网站页面:




First Website


Hello! This is my first website.

现在,使用以下命令测试我们的第二个网站:

curl website2.test

如果一切正常,我们应该会看到我们的第二个网站页面:




Second Website


Hello! This is my second website.

在上面的指南中,我们学习了 Docker 容器中为两个网站设置 Nginx 反向代理容器。 这应该可以帮助我们在开发环境中部署应用程序; 在来自 的专用服务器上试一试。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论