
从零开始搭起一台能用的服务器我如何用 1Panel 完成多站点部署服务器到手之后最让人头疼的不是硬件也不是网络而是那满屏幕的命令行。我用了好几年宝塔后来又折腾过纯 Nginx 手写配置直到换成 1Panel 运维管理面板才发现容器化运维面板可以把这么多繁琐的事收敛到一个清爽的界面里。这篇文章我会从安装说起一路聊到反向代理、绑定多个域名、虚拟主机功能这些高频需求全是实战里验证过的步骤和习惯。文章适合两类人一类是刚买云服务器、想用面板省事的新手另一类是已经在用或者准备迁移到 1Panel 的老运维。我不会只告诉你点哪个按钮我会把按钮背后的逻辑、Nginx 配置怎么生成、容器网络怎么打通、证书怎么自动续都解释清楚这样就算界面改版你也能快速适应。1. 为什么是 1Panel容器化运维的核心思路1.1 和传统面板相比它的底层逻辑完全不一样1Panel 是飞致云开源的项目用 Go 语言开发整体面向 Docker 容器体系设计。它不像传统面板那样把所有环境直接装在宿主机上而是让面板管理容器业务运行在容器里。你通过面板创建的 Nginx、MySQL、Redis本质上都是一个个容器。这种设计最大的好处就是隔离。我在同一台服务器上跑过两个版本的项目一个依赖 Python 3.8一个依赖 Python 3.11如果是传统面板这就是一场噩梦。但在 1Panel 里两个项目各用各的容器镜像完全不会互相污染。升级应用的时候只需要拉一个新镜像旧版本瞬间就能替换不用手动卸载和重装。另一个直观的优势是资源占用。面板本身、数据库、Web 服务都跑在容器中启动和销毁都很轻量。同一台低配机器传统面板装了十几个组件之后明显卡顿容器方案却能保持稳定。我现在常用的 2 核 4G 服务器上同时运行面板、Nginx、MySQL、Redis 和两个应用容器内存还能剩下一半多。1.2 1Panel 能解决哪些常见痛点我总结下来1Panel 解决的痛点非常明确环境管理混乱Docker 容器让部署过程标准化、可复现。手动配置 Nginx 容易出错面板自动生成站点配置并支持在线修改。数据库管理不直观MySQL、Redis 等都能在界面上查看状态、执行备份。安全配置分散防火墙、SSH 设置、面板隔离入口都集成在一个模块里。证书申请和续期麻烦内置 ACME 客户端一键签发免费证书并自动续期。这些痛点几乎是每个服务器运维者都会遇到的。尤其对 DevOps 经验不多的人来说1Panel 的图形界面大幅降低了上手门槛。而从老手视角看它也能把重复性劳动压缩掉让你把时间投入到真正重要的业务逻辑上。2. 安装流程全拆解从空服务器到面板可用2.1 安装前的系统检查与依赖判断在正式执行安装之前我强烈建议你先检查三件事。第一系统版本要在支持范围之内。1Panel 官方支持 Debian 10、Ubuntu 20.04、CentOS 7.9、RockyLinux 等主流发行版。理论上其他 Linux 发行版也可以跑但容器兼容性、内核模块可能会有小坑没必要在装面板这一步挑战极限。第二磁盘和内存要达标。最低配置建议 2GB 内存、20GB 磁盘实际使用中 4GB 内存体验会好很多因为你不可能只装一个面板不跑业务。磁盘方面Docker 镜像、容器日志、数据库备份都会持续占空间建议保守起见留出 50GB。第三确认服务器上没有残留的其他面板或 Web 服务。如果之前装过宝塔、LNMP 之类的东西最好先卸载干净否则可能会出现端口抢占、默认文件覆盖的问题。嫌清理麻烦的话重装系统是最快最省心的方案。具体检查命令这样的话直接写进代码块# 查看系统版本与内核 cat /etc/os-release uname -m # 查看内存与磁盘 free -h df -h命令输出里重点看Mem那一行的available以及根分区挂载点的Avail字段。如果内存还剩不到 1GB磁盘剩余不到 10GB我建议先扩容或者清理旧数据再继续。2.2 一键脚本背后的执行过程1Panel 官网提供的安装脚本非常简洁核心就一行命令curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh sudo bash quick_start.sh脚本执行时会做几件事检查系统环境、安装 Docker 和 Docker Compose如果之前没装、拉取 1Panel 的容器镜像、生成初始配置、启动面板服务。期间它会要求你设置安装目录、面板监听端口、用户名和密码。这里有几个经验要点我用下来之后觉得非常关键。安装目录建议保持默认/opt/1panel路径固定之后找备份文件、看容器数据都会方便。面板端口不要用常见端口比如 8080 或者 8888很容易被扫描器盯上换成28963这种随机端口更安全。初始生成的安全入口路径务必保存好那是访问面板的凭证之一丢失之后找回比较麻烦。如果脚本检测到 Docker 未安装会让你选择自动安装建议同意因为这省去了很多手动配置的麻烦。安装完成后终端会打印访问地址类似于http://IP:端口/安全入口。因为面板数据还没初始化首次访问时需要输入安装时设置的账号密码然后就可以进入主界面了。2.3 首次登录后的基础设置清单我每次拿到新面板不会急着去创建网站而是先做一轮基础固本工作。第一步是检查时区。因为容器的时区默认可能是 UTC你看到的日志时间会比北京时间晚 8 个小时排查问题的时候会晕头转向。在面板的「设置-系统设置-时间设置」里把时区改成Asia/Shanghai同时顺手打开系统时间自动同步。第二步是修改 SSH 配置。虽然 1Panel 面板有 Web 终端但 SSH 依然是最高频的入口。建议在「设置-SSH」中修改默认端口并关闭密码登录仅保留密钥登录。如果你还没生成过密钥对可以用ssh-keygen -t ed25519生成然后把公钥内容填到面板的授权密钥列表里。第三步是设置防火墙。1Panel 自带防火墙管理直接在里面放行你需要的端口即可不需要再用云平台的安全组和系统 iptables 两头配置容易乱。放行 80、443 是基础另外放行你自定义的面板端口和 SSH 端口。如果漏放了 SSH 端口可能会导致连不上服务器这个操作一定认真检查。基础设置做完之后就可以放心地开始用面板管理你的服务器和部署应用了。3. 网站部署实战虚拟主机功能与第一个站点3.1 用真实案例理解虚拟主机功能“虚拟主机”这四个字听起来像是古早时期的空间商术语但在 1Panel 里它代表的是一台服务器通过 Nginx 根据域名来区分多个网站的核心能力。你不需要为每个网站单独买服务器也不需要为每个网站单独分配 IP只要服务器性能扛得住就可以在同一个 IP 上跑几十个网站每个网站用不同的域名指向。虚拟主机功能的底层原理是 HTTP Host 头。当用户访问site1.com时浏览器会在请求头里带上Host: site1.com访问site2.com时带上的是Host: site2.com。Nginx 收到请求后遍历所有 server 配置块把请求转发到server_name匹配的那一段。这个机制是反向代理、域名绑定、多站点的共同基础。我在一台云服务器上用 1Panel 同时部署了三个不同性质的站点一个是由 Vue 打包后的纯静态前端一个是给 App 提供接口的 Java 后端还有一个是给内部伙伴使用的文档服务。这三个站点分别绑定不同域名日志互不干扰流量互不影响服务器的资源却共享。这就是虚拟主机功能在现实场景下的价值。3.2 创建第一个站点从空目录到首页在 1Panel 面板里创建站点很直接。进入「网站」模块点击“创建网站”看到三种类型静态网站、反向代理、WordPress。我第一次建议你从静态网站开练因为流程最清晰。创建静态网站时需要填写域名、站点目录、PHP 版本如果不需要可以忽略、备注等。面板会自动生成 Nginx 配置并把站点根目录映射到宿主机上的某个文件夹。你之后只需要把静态文件传到这个目录站点就能通过域名访问。举个例子我把一个前端项目的dist目录打包后通过面板自带的文件管理器上传到站点根目录然后解压。几分钟后域名就能打开页面了。整个过程不需要碰任何命令行代码对新手非常友好。注意一个小坑创建站点时建议把域名先解析到服务器再在面板里绑定。有些云解析生效时间比较慢立刻绑定可能会因为解析不通过导致证书申请失败或者访问测试报错。3.3 静态站点与反向代理站点的区别很多人分不清什么时候选静态网站、什么时候选反向代理我拿具体场景说清楚。如果你有一个纯前端的项目打包后只有 HTML、CSS、JavaScript 文件不需要后端逻辑选静态网站就够了。Nginx 直接把文件返回给浏览器速度最快配置最简单。如果你有一个后端服务比如用 Flask、Django、Spring Boot 写的接口它监听在某个本地端口如 8000 或 8080你需要让外部用户通过域名来访问这时候就选反向代理。1Panel 会自动生成一段 Nginx 配置把对公网域名的请求转发到对应的后端端口。本质上反向代理就是一层网关。用户只认识你的域名和标准端口实际上请求被悄悄转发给了容器内的服务。这样之后你对外只需要暴露 80 和 443 端口内部服务端口全部隐藏极大的减少了攻击面。4. 反向代理与域名绑定的进阶玩法4.1 反向代理的核心配置与常见报错处理在 1Panel 里创建反向代理站点时需要填写目标地址。例如我有个 Spring Boot 服务运行在127.0.0.1:8080我创建一个反向代理站点域名填api.example.com目标地址填http://127.0.0.1:8080。面板自动生成的配置核心内容类似如下server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; 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; } }看到这段配置你可能会问为什么这些 header 要一个一个设置因为后端服务如果不知道用户的真实 IP就会把所有请求来源都看成 Nginx 的地址导致日志失真、IP 限制失效。Host头保留真实域名是为了让后端框架生成绝对链接时不会跳错。X-Forwarded-Proto表示原始请求是 HTTP 还是 HTTPS很多 OAuth 回调或页面跳转依赖这个字段。如果配置完之后访问出现 502 Bad Gateway我的排查顺序是固定的。先在宿主机上尝试curl http://127.0.0.1:8080看看后端服务是否真的在监听。如果命令卡住或拒绝连接说明服务没启动或者端口不对。如果后端能通但是面板反向代理还是 502那问题多半出在 Docker 网络模式上需要检查容器是否连接在同一网络或者改用 host 网络模式。这条路径我把常见原因整理成了速查表放在文章后面你可以直接对照排查。4.2 绑定多个域名给一个网站加别名还是给多个网站分流“绑定多个域名”这个需求要分两种情况看。第一种是同一个网站需要绑定多个域名。比如用户既可能访问example.com也可能访问www.example.com甚至还要加上example.cn。这种情况下在站点的「域名」设置里直接添加即可。1Panel 会把所有域名合并到同一个server_name后用户访问其中任何一个域名都能打开同一套业务证书也能一次覆盖多个域名。第二种是多个域名分别指向不同的业务站点。比如a.com指向前端静态站b.com指向 Java 后端c.com指向 Python 工具站。这时候你需要创建三个不同的站点分别绑定不同的域名。每个站点使用不同的目录、不同的后端地址、不同的证书、不同的日志文件逻辑上完全隔离。这种方式是我重点推荐的因为它让配置清晰可维护。这里有一个很多人犯过的错图方便把多个域名写进同一个站点的 server_name 里但实际后端服务是多个不同的应用。结果就是 Nginx 不知道应该把请求转发到哪个后端所有域名都跑到了同一个应用里。排查半天才发现域名绑定和反向代理的对应关系搞乱了。4.3 结合 Docker 容器设置虚拟主机如果你在 1Panel 的应用商店里部署了多个应用每个应用本身就是一个容器。这些容器默认会监听各自的端口比如有的监听 8081有的监听 8082。你可以给每个应用创建一个反向代理站点各自绑定对应的域名这样外部通过域名访问时就会自动分流到各个容器。实际操作中我推荐把容器应用放入同一个自定义 Docker 网络这样反向代理站点里的目标地址可以直接写容器名例如http://my-wordpress:80而不必用容易变化的 IP 地址。Docker 内部 DNS 会自动解析这个容器名哪怕容器重启换了 IP连接依然稳定。这一点在你管理多个容器时非常节省时间。有一点需要提醒如果你的反向代理目标是运行在宿主机上的服务而不是容器那么使用http://127.0.0.1:端口没有问题。但如果代理目标是另一个容器你需要确保代理容器和业务容器在同一个 Docker 网络里否则会连接失败。5. 从开发测试到正式上线的完整流程5.1 开发环境与生产环境差异处理开发阶段你可能用的是本地环境代码放在自己电脑上数据库也在本地。到了上线阶段代码要部署到服务器数据库要迁移到生产库环境变量要更新。这个迁移过程如果手工操作很容易踩坑。我现在建议的工作流是先在 1Panel 里部署一套与正式环境等价的容器栈把代码通过 Git 拉取到服务器再用面板的文件管理或命令行工具完成依赖安装与构建。整个过程中数据库只需要在本地导出 SQL再在面板的数据库模块中导入即可。面板的数据库管理界面能直接执行 SQL 导入不用敲一大堆 mysql 命令。上线之前的配置核对我把它做成了固定清单检查代码中的数据库连接地址是否指向生产库密码是否使用了环境变量或配置文件。检查静态资源路径是否使用相对路径或完整域名避免出现资源 404。检查后端服务监听地址是否为0.0.0.0而不是127.0.0.1否则容器外部无法访问。检查是否设置了 UTC 与业务时区时间错乱会导致数据统计异常。检查站点目录的文件权限确保 Web 服务用户有可读权限。这些问题表面上不起眼实际上一一踩下来非常耗时尤其是第一个很多人上线后发现页面打开但接口全挂根因就在数据库连接串不对。5.2 HTTPS 证书配置与自动续期现在的 Web 生态里没有 HTTPS 的站点基本无法正常上线。1Panel 内置了证书管理功能支持通过 ACME 协议自动申请 Let’s Encrypt 免费证书也可以手动上传已有证书。自动申请的步骤很简明在站点的 HTTPS 设置中选择“申请免费证书”填入域名并选择验证方式。1Panel 默认使用 HTTP 验证也就是在站点根目录放一个临时校验文件证书机构通过访问http://你的域名/.well-known/acme-challenge/xxxx来验证你对域名的控制权。这里必须保证 80 端口可以从外网访问且/.well-known/路径没有被重定向或者拦截。只要校验成功证书便会签发1Panel 会自动把证书文件分配给你创建的站点。之后你可以在证书模块里看到证书的有效期快到期的前 30 天左右它会自动发起续期。开启 HTTPS 之后我建议在站点设置里顺便开启强制 HTTPS让所有 HTTP 请求自动重定向到 HTTPS避免用户访问旧链接时出现不安全警告页。同时打开 HTTP/2虽然这在现代的默认面板配置中通常是开启的但值得检查一下因为它能显著提升并发请求加载速度。5.3 反向代理场景下的安全加固策略上线不是终点安全工艺要长期加固。我常用的做法有下面几条都是在 1Panel 上直接做的。第一更新 Web 服务的默认配置。虽然面板自动生成的 Nginx 配置已经比较安全但我还会额外做两件事禁用不必要的 server tokens防止返回 Nginx 版本号在server块中添加基本的安全响应头比如X-Content-Type-Options和X-Frame-Options。第二控制管理端口暴露范围。面板管理页面本身不要直接对全网开放。理想情况是只允许管理员 IP 访问可以通过防火墙模块设置来源 IP 白名单。如果走的是云服务器也请在安全组里限制面板端口的来源。第三定期检查运行容器和镜像版本。1Panel 的容器管理页面能直观看到每个容器的状态、映射端口、挂载目录。我每周看一次容器列表把长期不用的容器删除把版本过老有已知漏洞的镜像重新拉取更新。容器日志我会每两周轮转一遍避免单日增长上 GB 的日志塞满硬盘。第四启用计划任务与备份。这一点更重要我在下一节展开。5.4 站点备份与计划任务设置数据备份这件事大多数新手是出事之后才想起来要做。而在 1Panel 里备份任务可以一键编排。我通常会在「计划任务」模块里创建两个任务。第一个是数据库备份每天凌晨 3 点执行保留最近 7 份备份。第二个是网站目录备份每周日凌晨执行保留最近 4 份备份。备份目标可以配置为本地目录也可以配置为远端存储或对象存储服务。任务创建好之后不用再手动干预。万一哪天真把网站文件改坏了或者误删了表数据进入文件管理和数据库管理界面找到对应的备份文件执行恢复即可。恢复过程也是图形化的比在命令行里手敲 tar 备份还原要稳妥得多。我还额外建议重要的备份文件定期下载到本地电脑或异地存储避免服务器整个挂了时数据全丢。备份最好遵循“3-2-1 原则”至少三份拷贝两种不同介质一份放在异地。6. 常见问题排查与独家避坑经验6.1 Docker 容器网络与反向代理联调问题这是多站点场景下最容易翻车的地方。我在给一个项目配置反向代理的时候目标地址填的是http://localhost:8080结果一直 502。检查之后才发现因为反向代理容器和业务容器不在同一网络容器内的localhost指向的是代理容器自身自然无法访问到宿主机上的业务端口。正确做法是如果代理目标是宿主机服务目标地址用宿主机 IP或者在面板的容器网络设置中把反向代理容器和业务容器放入同一个自定义网络如果代理目标是另一个容器目标地址直接写容器名。在 1Panel 中创建站点时选择反向代理填入容器的访问地址即可它会自动解析。这个问题的排查思路我给你一套口诀先看服务是否在跑再看端口是否可通接着看容器网络是否一致最后才考虑配置内容问题。按这个顺序来10 次里能解决 8 次。6.2 常见错误码表502、504、404、403我把线上常见的错误码和触发原因整理成一张表方便速查。错误码触发场景处理思路502 Bad Gateway后端服务不可达或崩溃检查后端容器状态测试目标端口连通性504 Gateway Timeout后端响应超时调大 Nginx 的 proxy_read_timeout 参数检查后端慢查询404 Not Found路由或目录不存在检查 Nginx server 块里的 root 配置和 location 路由403 Forbidden权限不足或拒绝访问检查网站目录权限和 Nginx 用户权限设置遇到过 403 的时候多数情况是网站目录的属主和权限不对。比如我把站点目录设置在了某个普通用户的目录下Nginx 进程没有读取权限就会 403。解决方式是调整目录属主为www用户或者用面板的权限设置功能修改目录权限为 755 或 750。还有一个较隐蔽的 404 场景后端服务本身有前缀路由。如果你的后端服务期望路径是/api/login但反向代理配置里proxy_pass末尾加了一个斜杠请求路径的拼接方式就会变化轻则 404重则跳错。我建议在没有十分把握的情况下不要在proxy_pass的 URL 末尾添加多余斜杠。6.3 服务器资源告警与日志分析服务器资源使用率是一个需要持续关注的数据。1Panel 的概览页面会展示 CPU、内存、磁盘、网络等信息还支持查看历史监控曲线这对我判断服务器压力峰值很有帮助。有一回我的站点响应突然变慢开始以为是程序问题后来监控曲线里看到磁盘 I/O 在凌晨某时刻有持续高峰排查发现是数据库备份任务正好跑了将近半小时期间磁盘读写压力上升导致整体卡顿。我把备份时间调整到业务压力最小的凌晨 4 点同时把备份压缩级别调低问题就解决了。日志分析也是运维日常的一部分。1Panel 的日志功能可以看到面板自身的登录日志、操作日志也可以直接查看你创建的各站点的访问日志和错误日志。我每天会花两分钟扫一眼 error 日志看看有没有异常刷屏。如果某个接口的访问日志突然暴增我会警觉地检查是否被刷量及早干预。另一个容易被忽略的是容器日志。长时间运行的容器日志如果不清理会持续膨胀。我在计划任务中添加了一个每两天执行一次的清理脚本把超过 200MB 的容器日志文件进行截断这样就不用手动去执行truncate -s 0了。6.4 证书续期失败和端口矛盾的解决办法证书自动续期是很多人依赖的功能但它也需要一定的前提条件。如果续期失败我建议按这些步骤排查。首先确保 DNS 解析能指向当前服务器并且外部可通过 80 端口访问你的站点。验证方法是在只有 80 端口开放的临时环境下用手机上流量访问http://你的域名/.well-known/acme-challenge/试试看看是否能返回校验文件内容。如果访问不了就要检查云平台安全组或面板防火墙是否放行了 80 端口。另外要注意某些 CDN 会缓存 HTTP 校验路径导致证书机构访问到的不是服务器实时生成的校验文件。这时候临时跳过 CDN或者在验证期间把站点切回到源站直连也能解决。端口矛盾是另一个常见场景。如果你的应用商店里有个服务监听在 8080同时你又在服务器上手动部署了另一个服务占用 8080面板显示的状态会是“端口冲突”。我建议所有应用部署都统一使用容器方式让 1Panel 管理端口分配。如果是临时用法占用了端口进「容器」模块找到对应容器修改它的端口映射配置即可一般不建议直接改容器内部监听的端口。7. 后续还能怎么扩展更多 1Panel 玩法到这里从零安装到多站点上线、反向代理配置、域名绑定、安全加固和问题排查这些核心环节我都已经聊完了。最后再分享几个可以继续扩展的方向方便你后续深入使用。1Panel 的应用商店里有很多一键部署的工具比如评论系统、博客引擎、对象存储、消息队列等。部署任何一个都非常迅速基本就是填几个参数点击确认。你可以基于这套体系快速搭建一个完整的个人项目栈。还有一个很实用的扩展是使用 Web 终端和文件管理功能做日常维护。Web 终端本质上是一个在线的 SSH 会话不需要本地终端即可管理服务器。文件管理器支持在线编辑文件、压缩解压、批量重命名这些能力虽然不起眼但在远程维护时能省不少事。如果你有开发能力可以看看 1Panel Provider 的 API。它提供了很多面向开发者的接口允许你通过 API 管理备份、创建站点、启动容器等。这意味着你可以把面板能力集成到自己的 CI/CD 流水线中实现更自动化发布流程。而在实际使用过程中我个人体会最深的一点是工具永远是辅助清晰的业务逻辑和极致的细节把控才是一台服务器长期稳定运行的关键。1Panel 帮我消除了大量重复劳动但也让我更加关心底层原理。遇到问题别急着骂面板先看日志再看网络最后看配置这条路几乎不会走偏。