Flask项目从开发到生产部署:阿里云服务器+Gunicorn+Nginx全流程实战
2026/8/6 3:50:33 网站建设 项目流程

1. 从本地开发到云端部署:一个Flask项目的完整旅程

如果你已经用Flask在本地跑通了一个Web应用,看着浏览器里那个熟悉的页面,心里大概会想:“是时候把它放到公网上了。” 这个想法很简单,但真动手时,面对服务器、Linux命令、Nginx配置这些名词,新手很容易被一堆零散的教程搞得晕头转向。今天,我就以一个过来人的身份,把从本地Flask项目到阿里云服务器上稳定运行的每一步,掰开揉碎了讲给你听。这不是一个简单的命令罗列,我会告诉你每个命令背后的意图,每个配置项的作用,以及我在这个过程中踩过的那些坑。我们的目标很明确:让你能拿着一份清晰的“地图”,从零开始,安全、完整地把你的Flask应用部署上线。

整个过程可以概括为几个核心阶段:准备一台云服务器、在服务器上搭建Python运行环境、将你的代码安全地传上去、配置一个可靠的Web服务器(Nginx)和应用服务器(Gunicorn),最后处理静态文件和域名。听起来步骤不少,但别担心,我们一步一步来。

2. 战前准备:服务器选购与基础环境搭建

部署的第一步,你得有个“战场”——云服务器。这里以阿里云ECS为例,其他云服务商(如腾讯云、华为云)的操作大同小异。

2.1 服务器选型与安全组配置

购买服务器时,对于个人项目或小型应用,选择最低配置(如1核2G)的“突发性能实例 t5”或“共享标准型 s6”通常就足够了,成本最低。地域选择离你目标用户近的,比如你的用户主要在华东,就选“华东1(杭州)”或“华东2(上海)”。操作系统镜像,我强烈推荐选择Ubuntu 20.04 LTSUbuntu 22.04 LTS。LTS代表长期支持,系统稳定,社区资料丰富,遇到问题更容易找到解决方案。CentOS也是一个经典选择,但考虑到其未来的变化,Ubuntu对新手更友好。

服务器买好后,第一件关乎生死存亡的事就是配置安全组。安全组相当于云服务器的虚拟防火墙。默认情况下,为了安全,云服务器只开放了少数几个端口(如22端口用于SSH)。我们需要手动开放Web服务所需的端口。

  • 22端口(SSH):必须开放,这是我们远程连接和管理服务器的唯一通道。建议将源IP设置为“0.0.0.0/0”以方便连接,但从安全角度,最好设置为你的固定公网IP或IP段。
  • 80端口(HTTP):必须开放,用于提供普通的网页访问。
  • 443端口(HTTPS):建议开放,用于提供加密的HTTPS访问。虽然初期可以不用,但迟早要上。
  • 你的Flask应用端口(如5000):在测试阶段可能需要临时开放,但在生产环境,我们通常不会直接暴露这个端口,而是通过Nginx反向代理,所以最终可以关闭。

注意:一个常见的坑是,在服务器上运行了Flask应用,但浏览器无法访问,除了检查代码,首要就要怀疑安全组规则是否放行了对应端口。

2.2 首次登录与基础系统更新

拿到服务器的公网IP地址后,我们通过SSH连接它。在Mac或Linux的终端,或者Windows的PowerShell/WSL中,使用命令:

ssh root@你的服务器公网IP

系统会提示你输入购买时设置的密码。首次登录后,立即做两件事:

  1. 更新软件源列表apt update。这个命令并不会升级任何软件,而是从配置的源服务器获取最新的软件包列表信息。
  2. 升级已安装的包apt upgrade -y。这个命令会根据上一步获取的列表,升级所有可以升级的软件包。-y参数表示自动确认,避免中途需要手动输入Y

这能确保你的系统拥有最新的安全补丁和软件版本。

2.3 创建部署专用用户(非root操作)

始终使用root用户操作是危险的,一次误操作可能导致灾难性后果。最佳实践是创建一个用于部署的普通用户,并赋予其必要的权限。

# 添加一个新用户,例如叫 ‘deploy’ adduser deploy # 按照提示设置密码和相关信息(可以一路回车跳过) # 将新用户添加到 ‘sudo’ 组,使其能以管理员权限执行命令 usermod -aG sudo deploy

之后,我们可以切换到deploy用户来操作:su - deploy。输入你刚设置的密码。你会发现命令行提示符从root@...变成了deploy@...

3. 构建稳固的后方:Python环境与项目部署

服务器基础打好后,我们就要为Flask应用准备运行环境了。这里的关键是环境隔离,避免不同项目的依赖包互相冲突。

3.1 安装Python与虚拟环境工具

Ubuntu系统通常预装了Python 3。我们可以通过python3 --version确认。接下来安装pip(Python包管理工具)和venv(创建虚拟环境的工具)。

sudo apt install python3-pip python3-venv -y

venv是Python 3.3+自带的模块,用它创建虚拟环境轻量且标准。

3.2 传输项目代码:多种方式的选择

如何把本地代码弄到服务器上?常见的有三种方式:

  1. SCP命令:简单直接,适合小项目或单文件。
    # 在本地终端执行,将整个项目目录上传到服务器的/home/deploy目录下 scp -r /你的/本地/项目路径 deploy@服务器IP:/home/deploy/
  2. SFTP客户端:如FileZilla,图形化界面,拖拽上传,适合不熟悉命令行的开发者。
  3. Git:最推荐的方式。在服务器上安装Git (sudo apt install git -y),然后在你的项目目录(例如/home/deploy/myapp)中直接git clone你的代码仓库地址。这种方式便于后续更新代码。

假设我们通过SCP将项目上传到了/home/deploy/myflaskapp目录下。

3.3 创建虚拟环境并安装依赖

进入项目目录,创建并激活虚拟环境:

cd /home/deploy/myflaskapp python3 -m venv venv # 创建一个名为 ‘venv’ 的虚拟环境目录 source venv/bin/activate # 激活虚拟环境

激活后,命令行提示符前会出现(venv)字样,表示后续的pip安装都会局限在这个环境内。

接下来安装项目依赖。通常我们会有一个requirements.txt文件。

pip install -r requirements.txt

如果没有这个文件,你需要在本地项目中用pip freeze > requirements.txt生成,然后再上传。如果项目很简单,也可以直接安装Flask和Gunicorn:

pip install flask gunicorn

心得:务必在requirements.txt中固定主要依赖的版本号(如Flask==2.1.2),避免因版本自动升级导致线上环境与本地开发环境不一致,引发难以排查的bug。

4. 从测试到生产:应用服务器Gunicorn的登场

在本地开发时,我们用的是Flask自带的开发服务器(app.run())。这个服务器性能弱、不安全,仅用于开发调试。在生产环境,我们需要一个专业的WSGI应用服务器,Gunicorn(Green Unicorn)是一个简单高效的选择。

4.1 为什么是Gunicorn?

Gunicorn是一个用Python写的WSGI HTTP服务器,它采用“预派生”(pre-fork)模型。简单理解,就是启动时先创建好一批子进程(worker),由这些子进程来处理实际的Web请求。主进程只负责管理这些子进程(如重启崩溃的worker)。这种方式比Flask单线程的开发服务器能承受高得多的并发访问。

4.2 使用Gunicorn启动Flask应用

在你的项目目录下(虚拟环境已激活),运行:

gunicorn -w 4 -b 0.0.0.0:5000 “你的应用模块名:应用实例名”

让我拆解这个命令:

  • -w 4:指定启动4个worker进程。一个常见的经验法则是设置为(2 * CPU核心数) + 1。对于我们的1核服务器,设置为3或4都是合理的。
  • -b 0.0.0.0:5000:绑定到所有网络接口的5000端口。0.0.0.0表示允许外部访问,如果只写127.0.0.1:5000则只能本机访问。
  • “你的应用模块名:应用实例名”:这是最关键的部分。假设你的入口文件是app.py,里面创建Flask应用的代码是app = Flask(__name__),那么这里就写“app:app”。第一个app是文件名(不含.py),第二个app是文件里的Flask对象变量名。如果你的应用工厂模式写在myapp/__init__.py里,对象叫create_app(),那么这里可能是“myapp:create_app()”

运行后,如果没报错,你可以先在服务器上自己测试一下:curl http://127.0.0.1:5000。如果能看到应用的响应,说明Gunicorn和Flask应用本身工作正常。

4.3 坑点排查:Gunicorn启动失败常见原因

  • 导入错误(ImportError):最常见。检查命令中的模块路径是否正确,虚拟环境是否激活,以及requirements.txt的依赖是否全部安装成功。
  • 端口被占用:如果5000端口已被其他程序使用,会报Address already in use。可以用sudo lsof -i:5000查看占用进程,或换一个端口。
  • 权限问题:如果项目目录或文件权限不对,可能导致Gunicorn无法读取。确保deploy用户对项目目录有读写执行权限。

提示:直接在前台运行Gunicorn,会占用一个终端,且退出终端进程就结束了。这显然不适合生产环境。我们需要让它作为后台服务运行,这就是下一步要做的。

5. 让服务稳定运行:Systemd守护进程与Nginx反向代理

让Gunicorn在后台稳定运行,并且实现高并发、处理静态文件、支持HTTPS,我们需要引入两个重量级角色:Systemd和Nginx。

5.1 使用Systemd管理Gunicorn服务

Systemd是现代Linux系统的服务管理器。我们可以创建一个service文件,让系统来托管我们的Gunicorn进程,实现开机自启、自动重启、日志收集等。

创建一个服务配置文件:

sudo vim /etc/systemd/system/myflaskapp.service

写入以下内容(请根据你的实际情况修改):

[Unit] Description=Gunicorn instance to serve my Flask app After=network.target [Service] User=deploy Group=www-data # 通常Nginx的运行用户组,方便权限管理 WorkingDirectory=/home/deploy/myflaskapp Environment=“PATH=/home/deploy/myflaskapp/venv/bin” ExecStart=/home/deploy/myflaskapp/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 “app:app” [Install] WantedBy=multi-user.target

关键参数解析:

  • UserGroup:指定以哪个用户/组身份运行服务。用deploy用户可以避免权限过高。
  • WorkingDirectory:服务启动时的工作目录。
  • Environment:设置环境变量,这里把虚拟环境的bin目录加入PATH,确保系统能找到gunicorn命令。
  • ExecStart:就是之前我们手动执行的启动命令。

保存退出后,执行以下命令:

sudo systemctl daemon-reload # 重新加载systemd配置 sudo systemctl start myflaskapp # 启动服务 sudo systemctl enable myflaskapp # 设置开机自启 sudo systemctl status myflaskapp # 查看服务状态

如果状态显示active (running),并且用curl测试5000端口依然能通,说明服务配置成功。此时即使你退出SSH连接,服务也会在后台持续运行。

5.2 安装并配置Nginx作为反向代理

现在Gunicorn在5000端口提供服务,但我们不能直接让用户访问5000端口。我们需要Nginx作为“前台接待”和“静态文件服务员”。

  1. 安装Nginxsudo apt install nginx -y

  2. 启动Nginxsudo systemctl start nginx。此时在浏览器访问你的服务器公网IP,应该能看到Nginx的欢迎页面,这说明Nginx的80端口服务正常。

  3. 配置反向代理:我们需要告诉Nginx,当有访问请求时,转发给本机5000端口的Gunicorn处理。 删除默认配置:sudo rm /etc/nginx/sites-enabled/default创建我们的站点配置:sudo vim /etc/nginx/sites-available/myflaskapp写入以下配置:

    server { listen 80; server_name 你的域名 或 服务器公网IP; location / { proxy_pass http://127.0.0.1:5000; 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; } }

    这个配置的意思是:监听80端口,将所有访问根路径/的请求,转发给本机127.0.0.1:5000(即Gunicorn)。后面几行proxy_set_header是为了将客户端的真实IP等信息传递给后端的Flask应用,否则在Flask里看到的访问者IP都是127.0.0.1

  4. 启用配置并测试

    # 创建软链接,启用该配置 sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled/ # 测试Nginx配置语法是否正确 sudo nginx -t # 如果显示“syntax is ok”,则重载Nginx使配置生效 sudo systemctl reload nginx

    现在,再次通过浏览器访问你的服务器公网IP(80端口),你应该看到的不再是Nginx欢迎页,而是你的Flask应用了!Nginx已经成功扮演了反向代理的角色。

5.3 配置Nginx处理静态文件

让Nginx直接处理静态文件(CSS, JS, 图片)是更高效的做法,可以减轻Gunicorn的负担。假设你的Flask静态文件在/home/deploy/myflaskapp/static目录下。

修改上面的Nginx配置,在location /块之前添加一个专门处理静态文件的location块:

server { listen 80; server_name 你的域名 或 服务器公网IP; # 静态文件交由Nginx直接处理 location /static { alias /home/deploy/myflaskapp/static; expires 30d; # 设置浏览器缓存30天,提升性能 } location / { proxy_pass http://127.0.0.1:5000; ... # 其他proxy_set_header配置保持不变 } }

修改后,记得运行sudo nginx -tsudo systemctl reload nginx。这样,用户请求/static/style.css时,Nginx会直接从/home/deploy/myflaskapp/static/style.css读取并返回,速度更快。

6. 部署自动化与后续维护:脚本与HTTPS

完成以上步骤,你的Flask应用已经基本部署完毕。但每次更新代码都要手动操作一堆命令,太麻烦。而且,没有HTTPS的网站在今天是不合格的。

6.1 编写简单的部署脚本

我们可以编写一个Shell脚本,将更新代码、安装依赖、重启服务等步骤自动化。在项目根目录创建deploy.sh

#!/bin/bash echo “开始部署…” cd /home/deploy/myflaskapp # 1. 拉取最新代码(如果用Git) # git pull origin main # 2. 激活虚拟环境(如果在脚本中运行,需要source) source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt # 4. 重启Gunicorn服务 sudo systemctl restart myflaskapp # 5. 重启Nginx(通常不需要,除非修改了Nginx配置) # sudo systemctl reload nginx echo “部署完成!”

给脚本执行权限:chmod +x deploy.sh。以后更新代码后,只需要运行./deploy.sh即可完成部署。

6.2 为网站添加HTTPS支持(使用Certbot)

使用Let‘s Encrypt的免费证书,通过Certbot工具可以非常方便地实现。首先安装Certbot和Nginx插件:

sudo apt install certbot python3-certbot-nginx -y

然后运行一条命令,Certbot会自动读取你的Nginx配置,引导你完成域名验证和证书申请,并自动修改Nginx配置:

sudo certbot --nginx -d 你的域名

按照提示操作(输入邮箱、同意协议等),完成后,你的Nginx配置会被自动修改,监听443端口并配置好SSL证书。Certbot还会自动设置定时任务,在证书快过期时自动续期,完全无需人工干预。

6.3 日常维护与监控

  • 查看日志:出问题时,日志是第一现场。
    • Gunicorn日志:sudo journalctl -u myflaskapp -f-f表示实时跟踪)
    • Nginx访问日志:sudo tail -f /var/log/nginx/access.log
    • Nginx错误日志:sudo tail -f /var/log/nginx/error.log
  • 更新代码与重启:使用上面的部署脚本。
  • 服务器安全:定期运行sudo apt update && sudo apt upgrade更新系统。考虑禁用SSH密码登录,改用密钥对认证,提升安全性。

走到这里,你的Flask应用已经从一个本地开发项目,蜕变成一个在公网可访问、拥有独立域名(可选)、支持HTTPS、由专业服务器软件驱动的生产级应用了。这个过程看似步骤繁多,但每一步都有其明确的目的:系统更新是为了安全,虚拟环境是为了隔离,Gunicorn是为了性能,Systemd是为了稳定,Nginx是为了高效和安全代理,HTTPS则是现代网站的标配。理解了这个链条,部署就不再是黑盒操作,而是一次对Web应用运行原理的深入实践。下次再部署时,你甚至可以尝试不同的组合,比如用uWSGI替代Gunicorn,或者把数据库也部署到这台服务器上,思路都是相通的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询