概述
本教程基于 debian,使用 nginx 反代到正在运行的 docker 容器举例。
为什么要反代?
以下是网上搜的:
反向代理是一种服务器,它接受客户端的请求,将请求转发给网络服务器,然后将结果返回给客户端,就像代理服务器处理了请求一样。
反向代理代理的是服务器,是和网络服务器站在一方的。其真实服务器对于客户端不可见。这就是它叫 “反向” 的原因。
反向代理可用于:
保护服务器,隐藏服务器真实 IP。 负载均衡,根据访问流量和服务器负载情况,将请求分发到不同服务器上。 缓存静态内容以及部分短时间的大量动态请求。 作为应用层防火墙提供防护。 加密 / 解密 SSL 通信。
举个例子
例如 我们要在服务器上运行 a b c 三个网站,这三个网站均需要使用 443 端口,但我们的服务器只有一个 ip,没办法分出来三个 443.
这个时候:反代出现了,由 nginx 统一接管 443 端口,将通过 a.leetfs.com 访问的用户转到站点 a,将通过 b.leetfs.com 访问的用户转到网站 b,c 也同理。
安装
- 更新系统索引
sudo apt update
- 安装 nginx
sudo apt install nginx
安装完成后,Nginx 会自动启动并设置为开机自启,可通过 sudo systemctl status nginx
检查 nginx 的状态。
配置 nginx
- 默认配置文件:
/etc/nginx/nginx.conf
- 网站配置目录:
/etc/nginx/sites-available/
- 用于存放实际启用的配置文件:
etc/nginx/sites-enabled/
接下来,我们将通过修改 /etc/nginx/sites-available/
目录来配置 nginx。
反代到 docker
我们的主机上通过 docker 运行了 weblate 服务,该容器默认直接接管服务器 443 端口太不优雅,会导致这台服务器的 443 端口只能跑这一个服务。
阅读此章节需要您略微了解 docker。
配置 dockerfile
让我们观测这个容器的 dockerfile,ports 下方的 - 443:4443
代表监听服务器的 443 端口,并将收到的请求转发到这个 docker 容器所使用的 4443 端口上。
services:
weblate:
ports:
- 443:4443
environment:
# ...后面略
我们先将 443 这个标准 https 端口改为服务器没有被占用的其它端口,例如 - 4443:4443
,修改后重载容器,应用更改。
切换到网站配置目录: /etc/nginx/sites-available/
,新建一个配置文件,这里我取名叫 weblate
配置文件内容参考以下代码:
server {
listen 443 ssl; # ssl代表使用ssl加密
listen [::]:443 ssl;
server_name weblate.leetfs.com; # 需要反代的域名
ssl_certificate /var/lib/docker/volumes/weblate-docker_weblate-data/_data/ssl/fullchain.pem; # ssl证书
ssl_certificate_key /var/lib/docker/volumes/weblate-docker_weblate-data/_data/ssl/privkey.pem; # ssl私钥
ssl_protocols TLSv1.2 TLSv1.3; # 启用 TLSv1.2 和 TLSv1.3,禁用 SSLv3 和过时的协议
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; # 推荐的加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_pass https://127.0.0.1:4443; # 需要反代到的位置,因为我们上文将容器转发端口配置为了4443,故这里使用4443。127.0.0.1代表服务器自己。
# 增强代理安全性
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_set_header X-XSS-Protection "1; mode=block";
proxy_set_header X-Content-Type-Options nosniff;
}
}
修改配置文件后创建一个符号链接,将该配置文件启用(记得把 weblate 换成你自己的文件名)
sudo ln -s /etc/nginx/sites-available/weblate /etc/nginx/sites-enabled/
- 测试配置文件是否正确:
sudo nginx -t
- 重新加载 Nginx 配置:
sudo systemctl reload nginx
禁用站点配置
如果想禁用某个站点的设置,仅需删除符号链接,而无需移除文件本体,便于以后复用。
sudo rm /etc/nginx/sites-enabled/文件名
搞定后记得重载 Nginx 配置: sudo systemctl reload nginx