python网站部署
我把一个Flask应用扔到云服务器上,网站第一次部署花了整整一个下午。部署不是网站代码问题,是部署环境问题。Python版本不对,网站pip源超时,部署nginx配置写错,网站最后发现是部署防火墙没开端口。这些坑,网站每个部署过Python项目的部署人都踩过。 部署的网站本质就三件事:把代码弄上去,把依赖装好,部署让进程跑起来。网站听起来简单,部署但每一步都有讲究。网站 先说代码上传。git clone是最干净的方式,别用FTP拖文件,容易漏东西。服务器上装个git,拉代码,完事。但你得处理密钥,不然每次都要输密码。ssh-keygen生成密钥,把公钥加到服务器的authorized_keys里,或者用GitHub的deploy key,都行。 依赖管理这块,我吃过亏。直接在服务器上pip install,装到系统环境里,后来升级系统包把生产环境的依赖搞坏了。现在都用虚拟环境。python3 -m venv venv,激活,然后pip install -r requirements.txt。隔离得干干净净,出问题直接删了重建,不心疼。 进程管理是另一个坑。直接用python app.py跑,终端一关服务就没了。nohup能撑一阵,但进程崩了没人管。用systemd,写个service文件,定义好启动命令和重启策略,系统帮你盯着。这是最省心的方案。或者用supervisor,图形界面管理多个进程,也顺手。 真正让部署变复杂的是反向代理。Python自带的开发服务器性能不行,得用gunicorn或uwsgi跑应用,然后让nginx转发请求。nginx处理静态文件和并发连接,比Python服务器强太多。配置不复杂,但得理解location和proxy_pass的关系。 我见过有人把Flask的debug模式开到生产环境,报错信息直接暴露给用户,连数据库密码都亮出来了。别贪图方便,debug=False,错误日志写到文件里,出问题再看日志排查。 数据库迁移是部署里最容易被忽略的。代码改了,表结构没同步,线上直接报错。用Flask-Migrate或Django的migration工具,把数据库变更纳入版本控制。部署时跑一遍迁移命令,比手动改数据库安全一百倍。 环境变量管理也别偷懒。数据库地址、密钥、API token,别硬编码在代码里。写在.env文件里,部署时export,或者用python-dotenv加载。这样换环境只用改配置,不用动代码。 最后说个细节:日志。程序跑起来不代表没问题,得知道它运行得怎么样。把日志输出到文件,配置好轮转,别让日志文件无限增长把磁盘塞满。用logging模块,设置好格式和级别,排查问题的时候能少掉一半头发。 部署这事,第一次难,第二次熟,第三次就能闭着眼操作了。核心思路是标准化:固定Python版本,固定依赖版本,固定启动命令,固定配置方式。把环境变成代码的一部分,换台服务器也能一键复现。 我后来写了个deploy.sh脚本,把拉代码、建虚拟环境、装依赖、迁移数据库、重启服务这些步骤串起来。每次部署就执行一个命令,再也没出过岔子。自动化不是炫技,是防止自己手滑。 服务器这东西,你对它越随意,它越会在凌晨三点给你颜色看。规矩部署,省下的是睡眠时间。