Skip to content

nginx 反代入门

作者:Lee 等
最后更新:

概述

本教程基于 debian,使用 nginx 反代到正在运行的 docker 容器举例。

为什么要反代?

以下是网上搜的:

反向代理是一种服务器,它接受客户端的请求,将请求转发给网络服务器,然后将结果返回给客户端,就像代理服务器处理了请求一样。

反向代理代理的是服务器,是和网络服务器站在一方的。其真实服务器对于客户端不可见。这就是它叫 “反向” 的原因。

反向代理可用于:

保护服务器,隐藏服务器真实 IP。 负载均衡,根据访问流量和服务器负载情况,将请求分发到不同服务器上。 缓存静态内容以及部分短时间的大量动态请求。 作为应用层防火墙提供防护。 加密 / 解密 SSL 通信。

举个例子

例如 我们要在服务器上运行 a b c 三个网站,这三个网站均需要使用 443 端口,但我们的服务器只有一个 ip,没办法分出来三个 443.

这个时候:反代出现了,由 nginx 统一接管 443 端口,将通过 a.leetfs.com 访问的用户转到站点 a,将通过 b.leetfs.com 访问的用户转到网站 b,c 也同理。

安装

  1. 更新系统索引 sudo apt update
  2. 安装 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 端口上。

yaml
services:
  weblate:
    ports:
      - 443:4443
    environment:
# ...后面略

我们先将 443 这个标准 https 端口改为服务器没有被占用的其它端口,例如 - 4443:4443 ,修改后重载容器,应用更改。

切换到网站配置目录: /etc/nginx/sites-available/ ,新建一个配置文件,这里我取名叫 weblate

配置文件内容参考以下代码:

nginx
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 换成你自己的文件名)

bash
sudo ln -s /etc/nginx/sites-available/weblate /etc/nginx/sites-enabled/
  • 测试配置文件是否正确: sudo nginx -t
  • 重新加载 Nginx 配置: sudo systemctl reload nginx

禁用站点配置

如果想禁用某个站点的设置,仅需删除符号链接,而无需移除文件本体,便于以后复用。

bash
sudo rm /etc/nginx/sites-enabled/文件名

搞定后记得重载 Nginx 配置: sudo systemctl reload nginx

页面历史