雨云云服务器部署 Python 后端:Flask/FastAPI + Gunicorn + Nginx 上线实操

从本地写好接口到公网能访问,用雨云云服务器把 Python 服务稳定跑起来
发布于
5

为什么不直接 python app.py 跑生产

开发时 python main.py 能跑,但那是单进程、无守护、断线就停,根本扛不住生产流量。在雨云云服务器上把 Python 后端跑稳,标准做法是:虚拟环境隔离依赖 + Gunicorn 多 worker 起服务 + Nginx 做反向代理和静态分流 + systemd 保活。这样进程挂了会自动拉起,重启服务器也能自己起来。

一、选购与系统准备

Python 后端吃 CPU 和内存,API 类轻服务 1 核 2G 起步,有数据库或重计算建议 2 核 4G。系统选 Ubuntu 22.04,自带 Python 3.10。购买走 雨云专属入口 jiyueip.com/link/5617 填优惠码 admin01 五折,国内节点记得备案。

二、建虚拟环境并装依赖

sudo apt install -y python3-venv
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn

用虚拟环境能避免把包装进系统 Python,以后迁移也干净。

三、用 Gunicorn 起服务

假设入口文件 app.py 里是 app = Flask(__name__)。起 4 个 worker:

gunicorn -w 4 -b 127.0.0.1:8000 app:app

绑定 127.0.0.1 而不是 0.0.0.0,让 Nginx 在前面对外,Gunicorn 不直接暴露公网更安全。FastAPI 则用 gunicorn -k uvicorn.workers.UvicornWorker -w 4 app:app。

四、Nginx 反向代理

装 Nginx,新建站点配置 /etc/nginx/sites-available/myapi:

server {
    listen 80;
    server_name your.domain.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

软链到 sites-enabled 后 nginx -t && systemctl reload nginx。域名解析到服务器 IP,就能通过域名访问接口了。

五、systemd 保活

写 /etc/systemd/system/myapi.service:

[Unit]
Description=My Python API
After=network.target
[Service]
WorkingDirectory=/home/ubuntu/myapi
ExecStart=/home/ubuntu/myapi/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app
Restart=always
User=ubuntu
[Install]
WantedBy=multi-user.target

systemctl enable –now myapi 后进程崩溃会自动重启,服务器重启也会自启。

合规使用提醒

本文部署方式仅用于合法的开发测试、业务接口、内部工具等场景。在中国大陆用雨云国内节点对外提供 Web 服务须完成 ICP 备案;接口若涉及用户个人信息,须遵守《个人信息保护法》。不得利用云服务器搭建违法违规服务。

常见问题(FAQ)

Gunicorn 开几个 worker 合适?
经验值是 CPU 核数 × 2 + 1。1 核机器开 3~4 个够用,再多反而因上下文切换拖慢。内存紧张就少开。
为什么 Gunicorn 绑 127.0.0.1 而不是 0.0.0.0?
绑本地回环,外部流量统一走 Nginx 反代。这样能加 HTTPS、限流、屏蔽恶意请求,Gunicorn 不直接面对公网也更安全。
Flask 和 FastAPI 部署差别大吗?
虚拟环境和 Nginx 部分完全一样,差别只在启动命令:Flask 用 gunicorn 直接起,FastAPI 要加 -k uvicorn.workers.UvicornWorker 换异步 worker。
接口上线后 502 怎么办?
多半是 Gunicorn 没起来或端口不对。查 systemctl status myapi 看报错,确认 Gunicorn 绑的是 127.0.0.1:8000,Nginx proxy_pass 指向同一个地址。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600