坑边闲话:反向代理作为应用部署过程中极为关键的一环,在现代互联网应用中发挥了巨大的作用。

1. 反向代理简介·

反向代理是一个非常有用的网络服务工具,它可以作为一个中介站在客户端和服务器之间,接收客户端的请求并将这些请求转发给后端的服务器。当后端服务器返回响应时,反向代理会再次作为中介,将响应传回给客户端。这种设置有多种用途,以下是一些关键点,你可以在博客中使用:

  • 负载均衡:反向代理可以将来自客户端的请求分发到多个服务器,确保每个服务器的负载都保持在一个合理的水平,从而提高整体的服务性能和可靠性。
  • 缓存:反向代理可以缓存后端服务器的响应。当多个客户端请求相同的内容时,反向代理可以直接从缓存中提供响应,而不必每次都从后端服务器获取,从而加快响应速度。
  • 安全和匿名性:反向代理可以隐藏后端服务器的真实 IP 地址和身份,为后端服务器提供一个额外的保护层。此外,它还可以作为一个应用层防火墙,阻止恶意请求。
  • SSL 终端:反向代理可以处理 SSL/TLS 握手,释放后端服务器的负担,使其专注于处理应用逻辑。
  • 内容压缩:反向代理可以压缩从后端服务器返回的内容,从而减少传输的数据量,加快传输速度。
  • 全球内容分发:在全球范围内部署的反向代理可以根据客户端的地理位置将请求路由到最近的服务器,从而提供更快的响应时间。

总之,反向代理是一个强大的工具,可以提高网站的性能、安全性和可靠性。

2. NginxProxyManager·

NginxProxyManager (名字有点长且中间没有空格)具有以下特性:

  1. 在 WebUI 完成几乎一切的操作
  2. 对内网中部署的 HTTP 服务自动添加 TLS 证书,对外提供 HTTPS 服务
  3. 使用 Let’s Encrypt 的自动化脚本,完成证书申请、证书有效期续期

2.1 容器部署·

容器作为新一代云原生服务部署的底层技术,本身就支持完善的存储、网络、计算:

  • 通过 volume 字段声明,可以将 Linux host 目录的文件、目录映射给容器;由于 Linux 一切皆文件,因此也可以通过这种方式将硬件设备直接暴露给容器,只需在容器里安装对应驱动即可使用硬件。
  • 通过指定 network,可以将容器接入 Linux 网桥。此外,容器还支持更多种类型的网络。
  • 通过 cgroup,宿主机操作系统可以对 CPU、GPU 等资源进行精细化限制。

因为以上优势,这里给出容器部署方案所需的 docker-compose 脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Author: Peng Liu
# Email: [email protected]
# Created: 2023. Jan. 30
# Updated: 2023. Jan. 30
# Official Release: https://hub.docker.com/r/jlesage/nginx-proxy-manager


version: '3.9'
services:
nginxproxymanager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: 'nginxproxymanager'
hostname: nginx-proxy-manager
restart: unless-stopped
networks:
- reverse_proxy
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /home/newton/epyc-truenas-app_data/NginxProxyManager/data:/data
- /home/newton/epyc-truenas-app_data/NginxProxyManager/letsencrypt:/etc/letsencrypt
networks:
reverse_proxy:
name: reverse_proxy
external: true

2.2 最佳实践·

NginxProxyManager 能实现流量到服务的精准控制。

2.2.1 创建前后端分离的虚拟交换机(网桥)·

  • 前端交换机指的是控制对外服务的,只有一个上行链路,即 NginxProxyManager,在该网桥里的其他容器,均不设置任何端口映射。如此一来,该网桥内的设备,只能通过 NginxProxyManager 访问,从而保证最小权限。

  • 后端交换机指的是对每个 compose 服务而言,需要建立一个后端网桥,实现 redismariadbservice 等服务之间的交互。

基于以上部署思路,我们在部署新的服务时,需要对 compose 文件的网络部分进行特意的定制:

  • 接入合适的前端网络
  • 接入合适的后端网络
  • 不映射任何端口

举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Author: Peng Liu
# Email: [email protected]
# Created: 2023. Feb. 9
# Updated: 2023. Mar. 17
# Official Release: https://hub.docker.com/r/ixsystems/truecommand/


version: "3"
services:
texlive:
image: texlive/texlive:latest-full-doc-src
container_name: texlive
hostname: texlive
stdin_open: true
tty: true
# ports:
# - "3380:3380"
restart: unless-stopped
networks:
- nginxproxymanager
environment:
TZ: Asia/Shanghai
WORKON_HOME: /data/projects
volumes:
- "/home/newton/epyc-truenas-app_data/texlive/data:/data"

networks:
nginxproxymanager:
name: nginxproxymanager_default
external: true

2.3 疑难解决·

虽然 NginxProxyManager 已经比较好用,但是对于以下的服务依然存在局限性,反应为不能打开、不能代理、代理缓慢等。

todo:

  • Dell idrac 服务
  • Windows Admin Center 服务
  • 超微 BMC

3. Nginx 直接部署·

todo

总结·

Nginx 的性能非常好,通过配置合适的网络结构,可以让容器单机部署变得非常舒适。