1panel 和 nginx 反向代理

作者:Administrator 发布时间: 2026-06-03 阅读量:2 评论数:0

部署 1Panel 并通过 Nginx 反向代理绑定子域名

核心目的:在腾讯云服务器上安装 1Panel 服务器管理面板,通过 Nginx 反向代理 + 子域名实现安全、优雅的访问方式。
讲人话:装好 1Panel 之后,不用带端口号,直接用 https://panel.bearguin.cn 就能访问管理面板。

背景与目标

1Panel 是一款现代化的 Linux 服务器管理面板,提供文件管理、应用商店、容器管理、计划任务等功能,适合用来管理个人 VPS 或云服务器。

1Panel 默认运行在一个随机高位端口(如 15847),直接通过 IP:端口 访问有几个问题:

  • 端口暴露在公网,安全风险更高
  • URL 不好记,还需要带上安全入口路径
  • 无法使用 HTTPS,数据传输不加密

通过 Nginx 反向代理 + 子域名的方式,可以将访问地址变成 https://panel.bearguin.cn,同时让 15847 端口只对内网可见。

环境与前提

  • 腾讯云 Ubuntu 服务器,已有公网 IP
  • 已有域名(本文以 bearguin.cn 为例),并在腾讯云 DNS 控制台管理
  • 服务器已安装 Nginx
  • 腾讯云安全组已放行 80、443 端口

安装 1Panel

参考 1Panel 官方文档,执行一键安装脚本。安装完成后,终端会输出面板的访问信息,格式如下:

面板地址: http://$LOCAL_IP:15847/5b3a9bf4b4
面板用户: c32c158484
面板密码: 07bb8f60b3

⚠️ $LOCAL_IP 是占位符,把它替换成服务器的真实公网 IP 再访问。末尾的 /5b3a9bf4b4安全入口路径,是随机生成的,直接访问 IP:15847 不带这个路径会提示 Access Temporarily Unavailable。

如果忘记了访问信息,执行以下命令重新查看:

1pctl user-info

修改用户名和密码

安装后默认的用户名和密码是随机生成的字符串,建议及时修改:

# 修改密码
1pctl update password

# 修改用户名
1pctl update username

关闭安全入口路径

安全入口路径的存在会让后续的子域名访问变得麻烦(需要在 URL 后面加一段随机字符串)。可以在登录面板后在「设置 → 安全」中关闭,也可以直接操作数据库:

sudo sqlite3 /opt/1panel/db/core.db "UPDATE settings SET value='' WHERE key='SecurityEntrance';"

然后重启服务生效:

sudo systemctl restart 1panel-core

关闭后,直接访问域名根路径即可到达登录页,不需要再带随机路径。

为什么不推荐用 bearguin.cn/1panel 子路径访问

直觉上把 1Panel 挂在博客域名的子路径下(bearguin.cn/1panel)看起来很方便,但实际上行不通。

1Panel 是一个 SPA(Single Page Application),它的前端静态资源(JS、CSS)在编译时使用的是根路径,例如:

/assets/index-Bdw1YaLZ.js
/assets/style-beT9Ywp0.css

当 Nginx 把 /1panel/ 的请求转发给 1Panel 后,浏览器拿到 HTML,接着去加载 /assets/index-xxx.js——注意这个路径是从根路径开始的,不带 /1panel/ 前缀。此时请求被 Halo 博客的 location / 接管,返回 404,页面自然无法正常渲染。

除非对 Nginx 做复杂的 sub_filter 路径重写,否则子路径方式不可行。使用独立子域名是最简单可靠的解决方案。

添加 DNS 记录

前往腾讯云 DNS 解析控制台,给 bearguin.cn 添加一条 A 记录:

记录类型 主机记录 记录值
A panel 服务器公网 IP

保存后等待 1-2 分钟 DNS 生效。

⚠️ DNS 解析只是让 panel.bearguin.cn 指向服务器 IP,此时访问还需要带端口号(panel.bearguin.cn:15847)。Nginx 反向代理的作用是把 80/443 标准端口的流量转发给 15847,才能实现不带端口号的访问。

配置 Nginx 反向代理

新建一个 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/panel

写入以下内容:

server {
    listen 80;
    server_name panel.bearguin.cn;

    location / {
        proxy_pass http://127.0.0.1:15847/;
        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;

        # WebSocket 支持(1Panel 终端功能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

创建软链接启用配置,然后重载 Nginx:

sudo ln -s /etc/nginx/sites-available/panel /etc/nginx/sites-enabled/
sudo nginx -t
sudo nginx -s reload

申请 SSL 证书并启用 HTTPS

用 Certbot 自动申请证书并修改 Nginx 配置:

sudo certbot --nginx -d panel.bearguin.cn

Certbot 会自动完成以下操作:

  • 申请 Let’s Encrypt 证书
  • 在 Nginx 配置中加入 listen 443 ssl 和证书路径
  • 添加 HTTP → HTTPS 的 301 强制跳转

完成后 /etc/nginx/sites-available/panel 的内容大致如下,两个 server 块各司其职:

# 第一个 server 块:处理 HTTPS 请求
server {
    listen 443 ssl;
    server_name panel.bearguin.cn;

    ssl_certificate /etc/letsencrypt/live/panel.bearguin.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/panel.bearguin.cn/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://127.0.0.1:15847/;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# 第二个 server 块:HTTP 强制跳转 HTTPS
server {
    listen 80;
    server_name panel.bearguin.cn;

    if ($host = panel.bearguin.cn) {
        return 301 https://$host$request_uri;
    }
    return 404;
}

listen 443 ssl 中的 ssl 关键字让 Nginx 对该端口的连接启用 TLS 握手,用配置的证书解密 HTTPS 流量后再转发给后端的 1Panel。两个 server 块协作:访问 http:// 被第二个块 301 重定向到 https://,再由第一个块处理并转发给 15847。

绑定域名到 1Panel

登录面板后,在「设置 → 面板设置 → 域名绑定」填入 panel.bearguin.cn

设置后,1Panel 只允许通过该域名访问,直接用 IP:15847 会被拒绝,进一步收窄攻击面。

常见问题

安装后访问 IP:15847 提示 Access Temporarily Unavailable?

这是 1Panel 安全入口机制,需要带上完整的安全路径访问,格式为 http://IP:15847/安全路径。执行 1pctl user-info 可以查看完整地址。

执行 1pctl user-info 提示 no such table: settings

这是 1pctl 命令查询数据库时找错了表,不影响服务本身运行。输出里的 $LOCAL_IP 替换成实际公网 IP 即可正常访问。

面板能打开但登录后提示"请求失败"?

检查 /opt/1panel/tmp/.secret 文件是否存在:

ls -la /opt/1panel/tmp/

如果缺失,手动生成:

sudo mkdir -p /opt/1panel/tmp
sudo openssl rand -hex 32 | sudo tee /opt/1panel/tmp/.secret
sudo systemctl restart 1panel-core

配置了 Nginx 子路径反代但 JS/CSS 加载 404?

这是 SPA 应用子路径反代的固有问题,见上文「为什么不推荐用子路径访问」章节。改用子域名方式解决。

总结

1Panel 的部署本身很简单,核心要处理好两件事:一是用子域名 + Nginx 反代替代裸端口访问,避免 SPA 子路径的资源加载问题,同时获得 HTTPS;二是理解 Nginx 两个 server 块的分工——一个负责 SSL 终止和流量转发,一个负责 HTTP 强制跳转。DNS、Nginx、Certbot 三者各司其职,缺一不可。

评论