部署 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 三者各司其职,缺一不可。