一台阿里云ECS,一个开源面板,一套从零开始的部署记录。这篇文章不是官方文档的翻译,是我自己从下单服务器到跑通多个网站、配好HTTPS、管好数据库的真实过程。中途踩了不少坑,有些坑官方文档根本没写,有些坑是因为两台服务器配置不一样导致的。如果你也打算在阿里云上用1Panel部署网站,或者已经装好了但不知道怎么配置反向代理、怎么搞SSL证书,这篇文章你应该能直接用上。
先说结论:1Panel这个面板,靠谱。它的核心思路是容器化,应用商店里的环境、数据库、中间件都以Docker方式运行,面板本身也只做管理调度。相比传统面板,它更干净、更可移植,也更符合现在"一台服务器跑多个服务"的实际需求。下面我按部署顺序完整写一遍,包括选型逻辑、环境准备、安装步骤、反向代理多站点、HTTPS证书、数据库备份,以及最后几个让我印象深刻的坑。
1. 为什么我从宝塔搬到了1Panel:面板选型的真实教训
1.1 面板不是越熟越好,顺手和可控更重要
以前我一直用的宝塔。宝塔胜在插件多、用户基数大,有问题网上基本都能搜到答案。但用了两年多,逐渐有几个点让我不太舒服:强制绑定账号、登录态经常失效、部分插件开始商业化闭源,而且宝塔的文件管理、计划任务、SSL证书这些模块越做越重,一个面板进程占的内存比我想象中多。
真正让我决定换的是有一次给客户做服务器迁移。宝塔的迁移功能看着很方便,实际执行时因为面板版本不一致、PHP扩展差异、伪静态配置残留,折腾了整整一个下午。那次之后我开始关注1Panel。它的定位完全不同:开源、免费、无强制绑定,官方文档写得很清楚,UI设计也现代得多。最让我舒服的是,1Panel的应用商店里无论装什么,都是按Docker容器跑的,面板和业务环境互相隔离。出了问题,把容器删了重建就行,不会像传统面板那样留下改了一半的配置文件。
1.2 1Panel的容器化思路到底好在哪
举个具体例子。以前宝塔装MySQL,直接把二进制、数据目录、配置文件全铺在系统盘上。想升级版本,要么覆盖安装赌运气,要么先导数据再重装。1Panel里装MySQL,本质是拉一个官方MySQL镜像,数据目录挂载到宿主机。想换版本,新建一个容器,旧数据目录一挂,端口一换,几分钟搞定。卸载也一样,容器和镜像删干净,不会在系统里残留一堆乱七八糟的库和配置文件。
这种思路的好处不只是干净。因为每个服务都是独立容器,PHP可以同时跑8.1和8.2两个版本,MySQL和MariaDB也能共存,互不干扰。这对要维护多个项目的场景非常实用。
1.3 什么人不适合1Panel
1Panel也不是完美的。如果你重度依赖宝塔那种"一键部署Java项目"、"一键对接宝塔WAF"之类的插件生态,换到1Panel会有落差,因为它的应用商店现在主要还是开源软件和经典中间件,很多商业化一键插件没有。再比如你只是临时需要一个建站工具,不想理解容器和挂载,那还是用宝塔更省心。但如果你愿意接受"面板只做管理、业务尽量容器化"这种思路,1Panel的长期可维护性明显更好。
2. 阿里云ECS的准备细节:镜像、安全组和域名一个都不能漏
2.1 服务器配置怎么选
1Panel本身很轻,安装完面板进程占用大概一两百MB内存。真正的开销在于你跑了多少容器。我一开始用的是阿里云2核2G的ECS,也就是很多人买来练手的那种配置,"练手包"之前99块钱一年,后来续费涨了但价格仍然能接受。装1Panel没问题,但同时跑Nginx、MySQL、PHP、Redis四个容器就有点吃力了,实际用下来内存长期在85%以上,偶尔还会触发OOM Killer。所以如果你打算正经放几个网站,建议至少2核4G起步,磁盘40GB以上。数据盘可以按需加,1Panel的数据目录默认在/opt/1panel,后续跑容器数据也是往系统盘里写,提前规划好空间比较省事。
2.2 系统镜像选择:为什么我更推荐Debian系
1Panel官方支持的Linux发行版挺多的,Debian、Ubuntu、CentOS Stream、Rocky Linux都在列表里。但我的建议很直接:如果是从零开始新装系统,优先选Debian 12或Ubuntu 22.04/24.04 LTS。原因一是apt源在国内有阿里云镜像,装依赖速度稳定;二是Debian系的systemd、网络配置这些基础组件更简洁,很少出现那种"命令执行成功但服务起不来"的玄学问题。CentOS Stream 9我也试过一次,能用,但总感觉文档示例和社区方案都是优先适配Debian系,碰到问题排查时会多绕一点路。我目前主力服务器就是阿里云ECS安装Debian 12。
2.3 安全组放行:容易漏的地方
阿里云ECS有两个层面的防线,一个是控制台里的安全组,一个是ECS系统自带的防火墙。安全组相当于是云上的一层闸门,在服务器外面挡流量。很多新手第一次装1Panel,SSH登录后怎么都访问不到面板页面,十有八九是安全组没放行面板端口。
我的建议是最小化放行原则,默认只放四个:SSH的22、HTTP的80、HTTPS的443,以及1Panel面板端口。如果你的办公IP是固定的,22端口和面板端口都填上IP白名单,只允许你自己的IP访问,能挡掉绝大多数的扫描攻击。具体在阿里云控制台找到实例 -> 安全组 -> 入方向规则,加这几条就够了:
| 端口范围 | 协议 | 授权对象 | 用途说明 |
|---|---|---|---|
| 22 | TCP | 你的公网IP/32,或者0.0.0.0/0 | SSH登录 |
| 80 | TCP | 0.0.0.0/0 | HTTP访问 |
| 443 | TCP | 0.0.0.0/0 | HTTPS访问 |
| 面板端口 | TCP | 你的公网IP/32 | 1Panel管理入口 |
2.4 域名解析与后续关联
1Panel很讲究"域名驱动",装好面板之后你很快会发现,建网站、申请证书,所有动作都以域名为主线。所以提前把域名解析到ECS公网IP很有必要。在阿里云DNS控制台加一条A记录,主机记录可以是www或者@,记录值填服务器公网IP。解析生效一般几分钟,但如果你之前改过TTL,可能需要等更久。域名解析这一步不提前做,后面配置HTTPS证书时只能手填IP,很多自动验证方式都用不了。
3. 1Panel安装与首次登录:命令就一行,配置别偷懒
3.1 安装命令与实际执行过程
SSH连上服务器后,安装1Panel就一条命令:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh这个脚本会自动检测系统版本、检查依赖、安装Docker(如果没装的话),然后拉取1Panel镜像并启动面板服务。整个安装过程中我建议你盯着终端输出看,主要关注三样东西:一是是否提示Docker安装成功,二是脚本最后输出的面板访问地址,三是随机生成的用户名、密码和安全入口。很多人装完直接关终端,回头找密码找半天。1Panel的默认端口不是固定的8080,而是安装时随机生成的一个高位端口,这个设计能避免被扫描工具直接命中默认端口,是好事,但你要牢记这个端口。
安装完成后,面板服务由systemd托管,日常管理可以这样用:
systemctl status 1panel # 查看面板状态 sudo systemctl restart 1panel # 重启面板3.2 首次登录后的三件事
第一次打开面板地址,输入随机密码登录后,建议立刻做三件事。
第一,在"账户安全"里修改面板密码,换成你自己记得住、但别人猜不到的强密码。第二,如果一个人管理多台服务器,强烈建议绑定两步验证,也就是TOTP动态验证码。1Panel面板默认支持,扫码绑定就好,每次登录都需要手机验证码,等于给面板加了一道真正的保险。第三,记下"安全入口"这个URL路径。1Panel从某个版本开始默认开启安全入口,访问面板时必须在地址后面加上一串指定路径,相当于一个隐藏的门牌号。如果忘了,登录页都打不开,但别慌,SSH连上去执行1pctl命令可以查看:
1pctl info3.3 几个安装时常见的坑
我在两台服务器上装过1Panel,一次顺利,一次栽了跟头。第二次是Ubuntu 22.04,执行安装脚本到一半卡住了,报错内容是Timeout,仔细看是Docker从Docker官方源拉取镜像超时。解决办法是提前给Docker配置国内镜像加速器,或者直接换成阿里云的Docker镜像源。在容器/镜像加速器里填上阿里云的加速地址,再重跑安装脚本就顺了。
还有一次是在已经装了宝塔的服务器上强行装1Panel,结果Docker和宝塔的iptables规则冲突,导致网站端口访问异常。我的建议很明确:新服务器第一时间装1Panel,不要和宝塔同机共存。如果你已经有宝塔又不想迁移,那就别在同一台机器上碰两个面板了。
4. 网站部署与反向代理:一台服务器挂多个网站的正确姿势
4.1 为什么反向代理是刚需
服务器上就一个公网IP,80和443端口也各只有一个,但你的业务可能不止一个:博客、API服务、管理后台、前端项目,每个都希望用独立域名访问。反向代理就是解决这个问题的核心机制。它本质上是一个流量中转站:Nginx监听80/443,根据请求里的Host域名判断要转发到哪个后端服务,再把这个请求转到服务器内部不同的端口上。
打个比方,就像一栋办公楼只有一个前台大门,楼下前台根据访客要找的公司名,把人带到不同的楼层。反向代理的"楼层",就是服务器上各种服务监听的内部端口。1Panel做反向代理的方式非常直观,不需要你手动去写Nginx配置,填一个表单就能生成。
4.2 用1Panel创建反向代理网站
具体步骤在面板左侧点"网站",然后点"创建网站",类型选择"反向代理"。这里需要填两个关键信息:域名和后端服务地址。假设我有一个Node.js服务跑在服务器的3000端口,我填的主域名是api.example.com,代理地址填http://127.0.0.1:3000。提交之后,1Panel会自动生成对应的Nginx站点配置,让你什么都不用改就能通过api.example.com访问这个服务。
面板里每个网站都是一套独立配置,包括Nginx配置、HTTP/HTTPS设置、伪静态规则、防盗链,全部可视化编辑。对不熟悉Nginx写法的人非常友好,对熟悉的人也不用再去手动vhost配置文件。
4.3 多个网站的目录和管理
我现在的生产服务器上,同时跑着三个类型完全不同的站点:一个WordPress博客,一个纯前端单页应用,一个Java后端API。1Panel里三个网站并列显示,每个网站都独立管理日志和证书。静态站和前端项目更简单,创建网站时选"静态网站",直接指定网站目录,把构建好的HTML文件传上去就行。WordPress这类PHP动态站也可以选"创建网站"后绑定PHP运行环境,1Panel会自动把Nginx和PHP-FPM串起来。
日志独立这一点特别重要。以前一个Nginx里塞一堆server块,日志全混在一起,出问题想定位某个站点的访问量都费劲。1Panel每个网站的日志在站点详情里单独查看,排查问题效率高很多。我还习惯开"访问日志"并把日志保留周期改成30天,方便追溯异常请求。
4.4 反向代理到Docker容器的连接细节
这里有个细节值得专门说。假设你在1Panel应用商店里装了一个服务,它通过Docker映射到了宿主机的9000端口。你在1Panel建反向代理网站时,"代理地址"填http://127.0.0.1:9000是肯定没问题的。但如果你希望更安全,不想服务直接暴露在9000端口上被外部扫描,可以调整Docker容器的端口映射,让它只监听127.0.0.1:9000,然后反向代理仍然指向127.0.0.1:9000。这样外部流量根本摸不到这个服务,只能从Nginx的443端口进来。具体在1Panel应用商店部署容器时,如果支持自定义端口映射,把宿主IP填成127.0.0.1就行。
4.5 我踩过的一个坑:日志里的IP全是CDN节点
有段时间我开了CDN加速,然后发现网站日志里所有访客IP都变成了CDN节点的IP,真实访客一个都看不到。这是因为CDN回源时没有把客户端IP透传给我们。Nginx拿到的是CDN节点的地址。解决办法是在Nginx配置里加上日志格式,读取X-Forwarded-For头。1Panel里可以编辑网站的Nginx配置文件,加一段类似这样的配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main;改完重载Nginx,日志里的$http_x_forwarded_for就会显示真实IP。这个配置看起来不起眼,做访问统计和安全分析时救了我大命。
5. HTTPS证书:申请、自动续期和多域名管理的完整链路
5.1 证书从哪来:阿里云免费证书与Let's Encrypt
现在网站不上HTTPS基本等于裸奔,搜索引擎收录也会受影响。1Panel里配HTTPS证书有两种常见来源:一是阿里云数字证书管理服务里的免费证书,二是1Panel内置的Let's Encrypt自动签发入口。
两种方式各有适用场景:
| 证书来源 | 适用场景 | 自动续期 | 备注 |
|---|---|---|---|
| 阿里云免费证书 | 企业网站、需要单域名证书 | 手动续期申请 | 一年有限张数 |
| Let's Encrypt | 个人站点、多个域名、自动续期优先 | 支持自动续期 | 有效期90天 |
如果你只是个人博客或几个小项目,我强烈推荐直接在1Panel里申请Let's Encrypt证书,90天有效期,配合自动续期任务,基本可以做到证书永久有效、彻底不用管。阿里云免费证书也可以,但每年要手动申请、下载、上传,麻烦不少。
5.2 在1Panel里申请证书并配置自动续期
1Panel的证书功能在"网站 -> 证书"里。点击"创建证书",签发方式选"Let's Encrypt",验证方式选"DNS验证"。如果是阿里云域名,DNS服务商选阿里云,然后填入AccessKey ID和AccessKey Secret。1Panel会调用阿里云DNS API自动添加一条TXT记录来完成域名所有权验证,全程不需要你手动去解析控制台操作。
这里有个非常重要的安全提醒:填进去的AccessKey一定要用RAM子账户的密钥,并且只授权DNS管理权限,不要用主账号AccessKey。这样即使密钥泄露,黑客也只能操作你的DNS解析,拿不到ECS控制权。配置完成后,在网站详情页找到HTTPS设置,选择刚创建的证书,打开"强制HTTPS",浏览器访问http时就会自动跳转到https。1Panel会生成一个自动续期任务,到期前会自动调用Let's Encrypt续期,续期成功后自动重载Nginx。
5.3 证书续期失败排查
Let's Encrypt自动续期也不是100%稳,我遇到过两次失败。一次是AccessKey过期,因为RAM子账户密钥我设了定期轮换,换了之后忘了在1Panel里更新,续期任务一直报鉴权失败。另一次是域名解析改了CDN,DNS验证时读不到TXT记录。排查思路很简单:先看1Panel计划任务里的执行日志,错误信息一般会明确说"DNS record not found"还是"unauthorized"。前者查解析配置,后者查AccessKey权限和状态。手动在证书列表点"续期"按钮,等十几秒基本就能定位问题。
5.4 多域名证书和泛域名证书
1Panel也支持同一张证书绑定多个域名和泛域名。申请证书时域名列表里填*.example.com和example.com,签下来的就是泛域名证书,以后example.com下面的子域名都能用。我之前有几个临时项目,各自是不同的二级域名,就统一签了一张泛域名证书,然后多个网站的HTTPS证书都选同一张,省得每个站点单独申请。泛域名证书只建议在服务器只属于你自己一个人管理时用,如果服务器要给不同客户跑独立站点,还是各签各的更清晰。
6. 数据库与运行环境的容器化:MySQL、PHP、Redis不只是点一下安装
6.1 用1Panel创建MySQL实例
1Panel把数据库单独放在"数据库"菜单里,创建MySQL时可以设置数据库名、用户名、密码、端口。特别注意一个选项是"允许外部访问"还是"仅本地访问"。如果你只是给本机网站用,一定选仅本地访问,MySQL不要暴露到公网。数据库安全事故里相当高比例都是因为数据库端口裸露、密码太弱被爆破。
MySQL容器跑起来后,内存参数要留意。默认配置下MySQL会按照宿主机内存比例分配buffer pool,2G内存的机器你装完MySQL再装PHP,可能还没建站内存就快满了。所以小内存服务器建议进去微调一下,打开数据库容器的配置,把innodb_buffer_pool_size调低,比如128M,把性能优先改成稳定性优先。
6.2 PHP运行环境:版本与扩展选择
创建PHP站点时,1Panel会让你选PHP版本,应用商店里能看到多个PHP版本,比如PHP 8.1、8.2。WordPress建议直接上PHP 8.2,性能比7.x有明显的提升。如果你的网站用的是老程序,也要记得装对应的PHP扩展,比如fileinfo、opcache、redis。1Panel里PHP扩展的安装是在"运行环境 -> PHP -> 配置 -> 扩展"里勾选并保存,它会自动重新构建PHP容器,不用你自己去编译源码。
6.3 Redis做缓存
只要不是纯静态站,我建议都装一个Redis,让WordPress的缓存插件把对象缓存怼到Redis上。1Panel应用商店里装Redis一样是点几下的事,装完记住密码,在WordPress后台安装一个Redis Object Cache插件填上配置。这个操作对页面响应速度的提升非常明显,尤其评论区复杂、访客多的站点,数据库查询次数能少一半。
6.4 备份的重要性:容器删除数据不丢的机制
不了解容器的人可能会担心:容器反正说删就删,数据会不会跟着一起没了?答案是不会,前提是你理解了数据持久化。1Panel里每个数据库和应用的容器都做了数据卷挂载,数据存放在宿主机/opt/1panel的某个目录下。删除容器,数据目录还在原处,重新创建容器时挂载同一个数据卷,数据就回来了。
但数据卷也不是万能的,服务器磁盘故障、误删目录都可能造成不可逆损失。所以1Panel的"计划任务"里一定要配置自动备份。我现在的配置是每天凌晨3点,网站和数据库分别备份一次,备份保留最近7份,同时把备份上传到阿里云OSS存储桶。这样即使整台ECS出问题,我只要换台新机器,把备份从OSS拉下来还原即可。
6.5 顺带说一句:通过Docker还能跑很多服务
1Panel的应用商店一直在扩充,而且它是可以自定义容器部署的。我有段时间折腾本地大语言模型,直接在1Panel的Docker模块里新建容器,拉取Ollama镜像并映射端口,没有手动敲过一条docker run命令。Dify这类比较复杂的AI应用编排平台,我也在1Panel里用它自带的Docker Compose功能启动过。面板在这里扮演的就是一个Docker管理入口的角色,好处是镜像、容器、日志都能在Web界面里看,不用每次SSH进去敲命令。
7. 排查记录与常见问题:从OOM到端口冲突的真实经历
7.1 小内存服务器的OOM问题
最让我印象深刻的坑,是2G内存服务器在跑了MySQL、PHP、Redis之后频繁出现数据库连接失败。查看系统日志发现是OOM Killer把MySQL进程杀了。当时第一反应是给服务器加内存,但人家ECS配置已经固定,升级还要重启停服。临时方案是加swap,我先创建了一个2GB的swap文件:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile然后把swap的swappiness值调低一点,避免系统过度依赖swap导致性能崩坏。同时把MySQL的内存参数降下来,双管齐下之后,OOM问题再没出现过。这里想提醒所有小内存用户:容器一多,swap不是可选项,是必选项。哪怕你有4G内存,预留2G swap心理都踏实很多。
7.2 端口冲突与防火墙
反向代理网站配置好之后,发现访问一直502。排查了很久,最后发现是后端服务端口没起来。原因是同一个端口被另一个进程占了,Docker容器启动失败。解决思路很简单:在服务器上先看端口占用情况:
ss -lntp | grep 3000如果有进程占用,改掉某个服务的映射端口,再回1Panel把反向代理的代理地址改成新端口,刷新后正常。这个问题的本质是端口规划不到位。我的建议是提前把所有服务的端口列一张表:Web入口统一走80/443,内部服务一律用8000到8999段,数据库和Redis用3306、6379且只监听127.0.0.1,这样基本不会撞车。
7.3 面板登录异常
还有一次我把面板的CSS样式搞乱了,页面白屏怀疑是浏览器缓存问题,清掉缓存还是这样。最后通过SSH执行了1Panel的重置命令,把面板配置恢复到可用状态。这里的关键是:面板出问题不代表你的网站服务会挂,因为Nginx、MySQL这些都是独立容器,1Panel进程挂了它们照常运行。这也是容器化架构的一个隐藏优势——管理面和业务面解耦。
7.4 快照备份的习惯
最后说一个运维习惯。上云这么多年,吃过几次"手滑"的亏,现在我对阿里云ECS的操作原则是:任何可能导致不可逆变更的操作之前,先在控制台打一个快照。快照其实是云服务器最便宜的保险。1Panel里的配置可以靠计划任务备份,但整个系统盘、数据库目录、面板自身配置,最省事的还是阿里云控制台的手动快照。花几分钟打好快照,后续操作随便折腾,出了问题一键回滚。反正我的经验是:宁可快照多打几个,也不要裸奔操作生产服务器。
1Panel和阿里云这套组合,我用下来最大的感受是:部署成本低、维护心智负担小、出问题容易排查。面板的容器化思维一开始需要适应,但适应之后你会发现服务器里的服务边界变得非常清晰,每个容器都是独立单元,数据通过挂载目录和外部交互,删除和重建都是几秒钟的事。如果你正准备入一台阿里云ECS,或者对现有服务器管理工具不满意,不妨照着这篇文章的步骤试一遍1Panel。安装只要一行命令,配好反向代理、证书和自动备份,剩下的事情真的就不多了。