简介

Nginx-ui是nginx的一个面板,通过这个面板可以对nginx进行设置,可以简化nginx的设置流程,这个面板是开源免费的

之前我做反向代理我都是直接使用的宝塔面板,宝塔面板虽然设置简单但是有点恶心人,一直在后台上传用户数据占用带宽就很烦,而且为了一个反向代理要牺牲性能去运行宝塔就感觉有点得不偿失。

这篇文章主要讲nginx-ui配置反向代理并且开启SSL,nginx-ui的安装有时间会出一篇文章的

第一步:填写基本信息

首先新建一个网站,在【网站管理】下面点击【添加站点】

1.png

填写“配置名称”以及“service_name”,这两个地方直接填写自己的域名即可,然后点击【下一步】

2.png

第二步:配置SSL(可选)

如果需要启用SSL则打开顶部的“启用SSL”开关,如果不需要则直接点击【下一步】,我这里是需要配置SSL的

3.png

这时候会弹出一个提示,直接点击【确定】

4.png

打开“用 Let's Encrypt 对网站进行加密”

5.png

在弹出来的提示点击【确定】

6.png

打开“撤销旧证书”,然后点击【下一步】,如果你的域名之前没有申请过证书或者是证书已经过期可以直接点击【下一步】,不用打开“撤销旧证书”

7.png

等待证书申请完成

8.png

证书申请完成,关闭证书申请窗口

9.png

点击【下一步】

10.png

第三步:配置反向代理

点击【修改配置文件】

11.png

点击【配置模板】

12.png

找到反向代理配置,然后点击【查看】

13.png

根据自己需要配置上传文件大小限制,主机和端口这些

14.png

例如我现在需要代理本机的2049端口,本机地址可以用127.0.0.1,填写完成后点击【添加】

15.png

最后点击【保存】,到此配置结束

16.png

另外一种反向代理情况

代理本机端口发送的域名改变

还有一种反向代理情况,就是代理的也是本机的地址和端口,但是需要发送的域名需要改变,不是现在访问的域名

例如我现在访问的域名是hk.ersansi.top,然后代理本机的2049端口,但是发送的域名是www.ersansi.top,就是访问的是hk.ersansi.top,但是实际上返回给用户的内容是www.ersansi.top

我们需要找到配置文件里面的 location模块,里面有一行

proxy_set_header Host $host;

需要修改为

proxy_set_header Host www.ersansi.top;

17.png

代理非本机服务

上面那个配置是两个域名都是解析到同一台服务器上的情况,如果我访问的是hk.ersansi.top,我需要返回的是www.baidu.com,这百度的域名总不能解析到我服务器上吧,那么只修改上面那个地方是没用的。

也是修改location模块,首先修改下面这行

proxy_pass http://127.0.0.1:2049/;

改为

proxy_pass https://www.baidu.com/;

然后修改上面我们说的

proxy_set_header Host $host;

改为

proxy_set_header Host www.baidu.com;

18.png

代理加后缀

例如我想访问hk.ersansi.top,但是我需要页面返回的是www.ersansi.too/index.php/321.html,那么只需要修改location模块的proxy_pass即可

proxy_pass http://127.0.0.1:2049/index.php/322.html/;

这样当你访问hk.ersansi.top的时候其实返回的页面是www.ersansi.top/index.php/321.html

19.png

配置文件模板

下面是我配置文件的模板,这个是使用nginx-ui里面的模板改的,优化了下面这些

此模板需要配置ssl证书,因为会强制把http重定向到https,如果没有证书会提示不安全,虽然可以强制访问,但是有的浏览器不行。

优化 原因 价值
注释清晰 看得懂、好维护 后续自己/同事方便
HTTP → HTTPS 强制加密 SEO + 安全
http2 更快 性能提升
Forwarded 头标准化 符合 RFC 7239 后端日志一致
acme-challenge 独立放行 证书能正常续签 自动化
proxy_pass 带 / 路径更干净 防止错误拼接
Host 验证 防御伪造 提升安全
proxy_redirect off 保留后端跳转 防止跳错
# -----------------------------------------------------------
# Nginx 高级反向代理模板
# 支持 WebSocket、IPv6、标准化 Forwarded 头、HTTP→HTTPS
# -----------------------------------------------------------

# 处理 WebSocket 升级:如果请求头有 Upgrade,则 Connection 设置为 upgrade,否则 close
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

# 生成符合 RFC 7239 的标准化 Forwarded 头
map $remote_addr $proxy_forwarded_elem {
    # IPv4: 直接使用
    ~^[0-9.]+$ "for=$remote_addr";
    # IPv6: 用 [] 括起来并加引号
    ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
    # Unix Socket: 无法表示,用 unknown
    default "for=unknown";
}

# 如果请求已带 Forwarded 头,追加;否则新增
map $http_forwarded $proxy_add_forwarded {
    "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=.*)?(;.*?)*([ \\t]*,.*?)*$" "$http_forwarded, $proxy_forwarded_elem";
    default "$proxy_forwarded_elem";
}

# -----------------------------------------------------------
# HTTP 服务器:监听 80,自动重定向到 HTTPS
# -----------------------------------------------------------
server {
    listen 80;
    listen [::]:80;
    server_name 你的域名;

    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }

    # Let's Encrypt 验证路径,需放行,不跳转
    location ~ /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:9180;    #这个地址是nginx-ui验证域名申请的,如果使用的不是nginx-ui修改为你所代理的地址和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
    }

    # 其他所有请求都重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

# -----------------------------------------------------------
# HTTPS 服务器:监听 443,反向代理到后端
# -----------------------------------------------------------
server {
    listen 443 ssl http2;                 # 开启 HTTP/2
    listen [::]:443 ssl http2;
    server_name 你的域名;

    # SSL 证书
    ssl_certificate /etc/nginx/ssl/<ssl_cert_path>;
    ssl_certificate_key /etc/nginx/ssl/<ssl_key_path>;
    # 启用 TLS 1.2 和 TLS 1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    # 使用推荐的加密套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    # 可选:指定支持的椭圆曲线(仅 TLS 1.3)
    ssl_ecdh_curve X25519:secp256r1:secp384r1;

    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }

    # Let's Encrypt 验证路径,同样需放行
    location ~ /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:9180;    #这个地址是nginx-ui验证域名申请的,如果使用的不是nginx-ui修改为你所代理的地址和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
    }

    # 主业务代理
    location / {
        proxy_pass http://127.0.0.1:2049/;               # 代理的服务,如果代理的不是本机上的服务则填写需要代理的域名和端口

        proxy_http_version 1.1;                          # 保证支持长连接和 WebSocket
        proxy_set_header Upgrade $http_upgrade;          # WebSocket 必需
        proxy_set_header Connection $connection_upgrade; # WebSocket 必需

        proxy_redirect off;                              # 禁止修改后端响应中的 Location

        # 常规头
        proxy_set_header Host $host;                     # 保留原始 Host,如果代理的是其他域名的服务,把$host改成其他服务的域名
        proxy_set_header X-Real-IP $remote_addr;         # 用户真实 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发链
        proxy_set_header X-Forwarded-Proto $scheme;      # 请求协议 http/https
        proxy_set_header Forwarded $proxy_add_forwarded; # 符合 RFC 7239 的标准头
    }
}


2025.9.14更新

nginx更新后,配置文件也有一点小改动,nginx版本大于等于1.25.1的,server模块的里面原本的

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

需要该成

    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

完整的配置为

# -----------------------------------------------------------
# Nginx 高级反向代理模板
# 支持 WebSocket、IPv6、标准化 Forwarded 头、HTTP→HTTPS
# -----------------------------------------------------------

# 处理 WebSocket 升级:如果请求头有 Upgrade,则 Connection 设置为 upgrade,否则 close
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

# 生成符合 RFC 7239 的标准化 Forwarded 头
map $remote_addr $proxy_forwarded_elem {
    # IPv4: 直接使用
    ~^[0-9.]+$ "for=$remote_addr";
    # IPv6: 用 [] 括起来并加引号
    ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
    # Unix Socket: 无法表示,用 unknown
    default "for=unknown";
}

# 如果请求已带 Forwarded 头,追加;否则新增
map $http_forwarded $proxy_add_forwarded {
    "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=.*)?(;.*?)*([ \\t]*,.*?)*$" "$http_forwarded, $proxy_forwarded_elem";
    default "$proxy_forwarded_elem";
}

# -----------------------------------------------------------
# HTTP 服务器:监听 80,自动重定向到 HTTPS
# -----------------------------------------------------------
server {
    listen 80;
    listen [::]:80;
    server_name 你的域名;

    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }

    # Let's Encrypt 验证路径,需放行,不跳转
    location ~ /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:9180;    #这个地址是nginx-ui验证域名申请的,如果使用的不是nginx-ui修改为你所代理的地址和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
    }

    # 其他所有请求都重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

# -----------------------------------------------------------
# HTTPS 服务器:监听 443,反向代理到后端
# -----------------------------------------------------------
server {
    listen 443 ssl;                 
    listen [::]:443 ssl;
    # 开启 HTTP/2
    http2 on;
    server_name 你的域名;

    # SSL 证书
    ssl_certificate /etc/nginx/ssl/<ssl_cert_path>;
    ssl_certificate_key /etc/nginx/ssl/<ssl_key_path>;
    # 启用 TLS 1.2 和 TLS 1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    # 使用推荐的加密套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    # 可选:指定支持的椭圆曲线(仅 TLS 1.3)
    ssl_ecdh_curve X25519:secp256r1:secp384r1;

    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }

    # Let's Encrypt 验证路径,同样需放行
    location ~ /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:9180;    #这个地址是nginx-ui验证域名申请的,如果使用的不是nginx-ui修改为你所代理的地址和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
    }

    # 主业务代理
    location / {
        proxy_pass http://127.0.0.1:2049/;               # 代理的服务,如果代理的不是本机上的服务则填写需要代理的域名和端口

        proxy_http_version 1.1;                          # 保证支持长连接和 WebSocket
        proxy_set_header Upgrade $http_upgrade;          # WebSocket 必需
        proxy_set_header Connection $connection_upgrade; # WebSocket 必需

        proxy_redirect off;                              # 禁止修改后端响应中的 Location

        # 常规头
        proxy_set_header Host $host;                     # 保留原始 Host,如果代理的是其他域名的服务,把$host改成其他服务的域名
        proxy_set_header X-Real-IP $remote_addr;         # 用户真实 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发链
        proxy_set_header X-Forwarded-Proto $scheme;      # 请求协议 http/https
        proxy_set_header Forwarded $proxy_add_forwarded; # 符合 RFC 7239 的标准头
    }
}


二维码

发表评论