第一次把项目搬到线上,很多人最直接的感受是步骤多、细节碎。本地跑得好好的程序,放到服务器上就报错:端口不通,依赖版本对不上,数据库连不上,问题一个接一个。这篇文章用一个小团队的实际经历做线索,说说在阿里云服务器上部署项目时要留意什么,正在做这件事的朋友可以对照着看。

案例背景
这是一个做在线预约的小团队。后端用 Python 的 Flask 框架,前端是 Vue 打包后的静态文件,数据存在 MySQL 里。项目原来一直跑在一台本地测试机上,用户多起来以后,就得迁到公网能访问的环境。团队选了阿里云 ECS,系统是 Ubuntu 22.04 LTS,2 核 4G,40G 云盘。配置不算高,预算也比较好控制。
上线前要先想清楚的几件事
动手之前,有几件事最好先定下来。服务器规格决定了后面扩容的空间,可以结合现在的访问量和未来半年的增长预估来选,不必一开始就堆很高的配置。安全组也要提前规划,只开放必要端口,比如 22(SSH)、80 和 443(HTTP/HTTPS)。数据库端口不要对公网开放。
这个团队在这里栽过一次跟头。调试时图方便,把 MySQL 的 3306 端口对全部来源开放,两天后日志里出现大量异常登录尝试。后来改成只允许内网地址访问,问题才停下来。调试期间放宽权限可以理解,但调完要及时收回来,最好在日程里设个提醒,否则很容易忘。安全组的原则是只开必要的端口。
搭建运行环境
服务器买好、初始化完成后,可以按下面的顺序搭环境。这几步之间有依赖关系,最好不要打乱。
- 通过 SSH 登录实例,先更新系统软件包。刚开通的机器,软件包版本可能不是最新的,先更新能省去不少奇怪的依赖问题。
- 单独建一个普通用户来运行服务,不要直接用 root 启动应用。权限小一点,应用出问题时影响范围也小一点。
- 安装 Python 虚拟环境、Nginx 和 MySQL,并把每个组件的版本号记下来。以后本地和服务器行为不一致时,先对比版本,往往能很快找到原因。
- 用 Git 或 scp 把代码同步到指定目录。如果用 Git,之后更新代码和回滚都会方便很多。
- 按 requirements.txt 安装依赖,并确认版本和本地一致。本地能跑、线上报错,很多时候就出在某个包的版本上。
进程管理与反向代理
直接运行 python app.py 只适合临时测试,终端一关,服务就停了。团队改用 Gunicorn 作为 WSGI 服务器,再用 systemd 管理进程,这样服务器重启后,应用也能自动拉起来。Nginx 在最前面接收外部请求,静态资源由它直接返回,动态请求则转发给 Gunicorn 监听的本地端口。
这样分工有两个直接好处。Nginx 处理静态文件效率高,应用服务器的压力会小很多。另外,HTTPS 证书和访问日志都能在 Nginx 层统一配置,之后要改,只需要看一个地方。
域名、证书与切换
域名要先在阿里云完成备案,再解析到服务器的公网 IP。国内服务器绑定域名需要备案,流程通常要一到两周,建议尽早提交,别等到上线当天才发现卡住了。证书可以用阿里云提供的免费 SSL 证书,部署到 Nginx 后,把 HTTP 请求统一跳转到 HTTPS。
上线前,团队列了一份检查清单,逐项确认:接口能正常返回,数据库读写没问题,登录状态刷新后还在,日志能正确写入。全部通过后,才切换 DNS 记录。整个切换过程控制在十分钟以内,用户基本没有感觉到。切换前把旧环境留着,万一要退回去,能很快切回。
上线之后的运维
部署完成只是开始,线上服务要持续盯着。下面几项最好从第一天就做起来:
- 在云监控里给 CPU、内存和磁盘设置告警阈值。磁盘最容易被日志悄悄占满,磁盘告警值得优先设。
- 定期备份数据库。可以用阿里云的快照功能,或者开启 RDS 的自动备份,并且定期确认备份能不能恢复。
- 保留最近几个版本的代码包,出问题时能快速回滚,不用临时拼凑旧版本。
- 定期更新系统补丁和依赖库,及时修复已知的安全漏洞。更新前先在测试环境跑一遍,避免新版本带来新问题。
这个团队上线后第一个月,一次数据库误操作差点造成数据丢失。好在提前开启了每日备份,十几分钟就完成了恢复。事后他们的看法很实际:备份策略应该在部署之初就定下来,等出了事故再补,代价会大得多。
结语
这类部署的麻烦,往往出在环境、安全、进程和监控要同时照顾到,单个命令本身并不难。选型先按业务来,安全组只开必要端口,服务交给 systemd 守护,备份和告警尽早配。一步步来,小团队也能把项目稳稳地送上线。