我们现在已经开发好了一个python3.10.6+flask+sqlite的web项目(https://lzm07.blog.csdn.net/article/details/150269909),想要部署到服务器上,由于开发和测试都是在windows系统上,所以我们希望在服务器上也采用windows server系统。有关阿里云ECS+windows server系统的购买与远程连接,可以看我的CSDN文章:阿里云ECS的windows server系统如何远程桌面连接-CSDN博客
一、项目部署准备
(一)项目目录和文件组织结构
部署项目前,我们先明确项目目录和文件组织结构:
项目文件组织结构:
vietnam-study-in-china/
│
├── app/
│ ├── __init__.py # 应用初始化
│ ├── models.py # 数据模型
│ ├── config.py # 配置文件
│ ├── translations/ # 翻译文件
│ │ ├── en/
│ │ ├── zh/
│ │ └── vi/
│ │
│ ├── static/ # 静态文件
│ │ ├── css/
│ │ ├── js/
│ │ ├── images/
│ │ └── pdf/
│ │
├── templates/
│ ├── base.html # 基础模板
│ ├── front/ # 前台模板
│ │ ├── home.html # 首页
│ │ ├── register.html # 注册页
│ │ ├── login.html # 登录页
│ │ └── …(其他前台页面)
│ └── admin/ # 管理后台模板
│ ├── index.html # 后台首页
│ └── …(其他后台页面)
│ │
│ ├── routes/ # 路由
│ │ ├── __init__.py
│ │ ├── front.py # 前台路由
│ │ └── admin.py # 管理端路由
│ │
│ └── utils/ # 工具函数
│ ├── __init__.py
│ ├── translations.py # 翻译相关
│ └── helpers.py # 辅助函数
│
├── migrations/ # 数据库迁移文件
│
├── instance/ # 数据库
│ └── study_in_china.sqlite # 数据库文件
│
├── vsic-venv/ # 虚拟环境目录
│
├── requirements.txt # 依赖包
│
└── run.py # 应用入口
其中,app:项目代码文件夹;instance:sqlite数据库存放目录;vsic-venv:项目虚拟环境目录;run.py项目执行文件。
(二)生成依赖清单requirements.txt
在项目开发完了之后,不管是部署在其他电脑还是服务器上,可能都要知道当前项目要安装哪些依赖项,每个依赖项都是采用什么版本。
我们可以通过执行命名,导出所以本项目的依赖项,方便在其他地方部署时安装。
本地先进入项目文件夹,激活虚拟环境,激活后命令提示符前会显示 (vsic-venv):
vsic-venv\\Scripts\\activate
本地执行pip freeze > requirements.txt生成依赖清单:
(三)复制项目文件夹到服务器上
如果是如前面,采用阿里云的windows server服务器,则可以用远程桌面,登录服务器,之后,直接将本地的项目复制到服务器上。
解压并放在了:C:\\website\\vietnam-study-in-china
以下是使用waitress-serve启动Flask应用的具体操作步骤:
二、一阶段部署
目标:安装好运行环境,并能像本地一样,在服务器的本机上正常运行。
(一)运行环境
1.Python安装与环境变量配置
一定要确保跟本地开发是python环境是一致的。
下载Python 3.10.6 Windows安装包,在服务器上安装,勾选“Add Python to environment variables”;
验证安装:远程连接服务器,打开CMD,执行python –version确认版本正确。
2.数据库配置
SQLite无需独立安装,随Python自带,只需确保项目目录有读写权限;
为防止数据库文件损坏,设置定期备份任务(通过Windows任务计划程序实现)。
(二)进入项目目录并激活虚拟环境
1.打开命令提示符(CMD)
通过远程桌面连接到服务器后,打开 CMD,进入你的项目根目录:
cd C:\\website\\vietnam-study-in-china
2.创建和激活虚拟环境
创建虚拟环境:
python -m venv vsic-venv
进入vsic-venv虚拟环境的Scripts目录,执行激活命令:
vsic-venv\\Scripts\\activate
激活成功后,命令行前缀会显示 (vsic-venv),表示当前处于虚拟环境中。
(三)服务器本地运行
在虚拟环境中,执行:
py run.py
由于前文项目中,已经有了本地开发时的虚拟环境,所以这里并不需要安装依赖项,就可以直接运行站点。当看到如下界面:
证明,此时就可以在服务器上的浏览器打开http://127.0.0.1:5000,访问网站了。
(四)公网访问问题
我们有了服务器的公网IP,那么此时能不能在公网上访问我们的网站呢?
其实是不能的。
第一个问题就是:我们使用了一个服务器没有开放的端口5000。
公网访问需要同时开放「云服务商安全组」和「服务器本地防火墙」
服务器本地能访问(127.0.0.1:5000),说明应用本身正常,但公网访问需要经过两层防火墙:
(1)阿里云ECS的安全组(云平台层面的网络控制);
(2)Windows Server的本地防火墙(服务器操作系统层面的控制)。
公网无法访问的问题通常与网络访问控制或端口开放配置相关,结合阿里云ECS和Windows Server环境,可按以下步骤设置:
1. 检查阿里云ECS安全组是否开放5000端口(最关键)
阿里云ECS默认会拦截所有未明确允许的端口,必须手动添加规则开放5000端口:
操作步骤:
(1)登录阿里云控制台 → 进入你的ECS实例详情页 → 左侧菜单找到「安全组」并点击进入。
(2)选择实例绑定的安全组 → 点击「配置规则」→ 「入站规则」→ 「手动添加」。
(3)填写规则:
2. 检查Windows Server本地防火墙是否允许5000端口入站
即使阿里云安全组开放了端口,服务器本地防火墙仍可能拦截(默认不会,可跳过):
操作步骤:
(1)远程连接服务器 → 打开「控制面板」→「系统和安全」→「Windows Defender 防火墙」→「高级设置」。
(2)左侧选择「入站规则」→ 右侧点击「新建规则」。
规则类型选择「端口」→ 下一步 → 协议选择「TCP」→ 特定本地端口填写「5000」→ 下一步。
(3)允许连接 → 下一步 → 勾选「域」「专用」「公用」(根据实际网络环境选择,建议全选)→ 下一步。
(4)名称填写「允许 5000 端口(Flask)」→ 完成。
3. 验证端口是否被正确监听(排除绑定问题)
在服务器上执行命令,确认5000端口确实被Waitress监听且绑定到所有网卡(0.0.0.0):
在CMD中执行(无需进入虚拟环境)
netstat -ano | findstr :5000
正常结果应显示类似: TCP 0.0.0.0:5000 0.0.0.0:0 LISTENING 12345 0.0.0.0:5000 表示绑定所有网卡,LISTENING 表示正在监听。若显示127.0.0.1:5000,说明Waitress绑定地址错误(需重新执行waitress-serve –host 0.0.0.0 …)。
4. 测试公网端口是否可达(定位拦截点)
在你的本地电脑上,用工具测试服务器5000端口是否能连通:
方法 1:CMD命令(Windows本地,Windows10之后telnet要自行安装):
telnet [IP地址] [端口号]
telnet 47.107.172.52 5000
若显示空白窗口或提示 “连接成功”,说明端口通畅;
若提示 “无法连接” 或 “超时”,说明仍被拦截。
方法 2:在线端口检测工具(如「站长工具 – 端口检测」https://tool.chinaz.com/port): 输入公网IP和5000端口,检测是否“开放”(存在延时,也可能不准确)。
当然,更直接的,就是直接打开网站:
如果还不能正常访问,千万别放弃,继续跟着我的文档往下走就对了。
因为端口仅仅是其中一个不能访问的原因。
5. 其他可能原因
(1)端口冲突:若5000端口被其他程序占用,可能导致实际监听失败(通过 netstat -ano | findstr :5000 确认占用进程,结束冲突进程)。
(2)运营商限制:极少数情况下,部分运营商会封锁非 80/443 的端口(可临时改为 80 端口测试,若能访问则说明是端口限制)。
在一阶段部署中,其实我们所需要做的工作很少,当然实现的功能也很有限:
(1)工作:仅复制项目到服务器,安装好python环境,进入项目目录,创建和激活虚拟环境,再在阿里云上增加安全规则。
(2)限制:访问网站仅能通过IP本地访问(证明项目正常),不能公网访问,不能绑定域名。
三、二阶段部署
目标:公网IP访问网站。
一阶段仅能通过IP在服务器本地访问,不能公网访问,更不能绑定域名。
部署python+Flask应用,需要使用Waitress启动服务:
(1)安装工具:pip install waitress
(2)启动命令:waitress-serve –host 0.0.0.0 –port 5000 your_app:app
接下来我们就来实现:
(一)直接安装Waitress
基于一阶段的基础,应该是会出现接下来的(一)(二)两步的情况。但是,也不能直接跳过,按部就班继续操作即可。
1.直接安装Waitress会出现的问题
不想了解问题,不想复现,可以直接到第(二)步。
(1)通过远程桌面连接到服务器后,打开CMD,进入你的项目根目录:
cd C:\\website\\vietnam-study-in-china
(2)进入vsic-venv虚拟环境的Scripts目录,执行激活命令:
vsic-venv\\Scripts\\activate
激活成功后,命令行前缀会显示 (vsic-venv),表示当前处于虚拟环境中。
(3)在虚拟环境中安装waitress工具:
pip install waitress
如果可以安装,则可以跳过下面的(二)步骤。
如果是前面直接复制的项目文件,采用的本地开发时创建的虚拟环境,则此时会提示如下问题:
(vsic-venv) C:\\website\\vietnam-study-in-china>pip install waitress Fatal error in launcher: Unable to create process using '"C:\\Users\\lzm07\\Desktop\\??????\\vietnam-study-in-china\\vsic-venv\\Scripts\\python.exe" "C:\\website\\vietnam-study-in-china\\vsic-venv\\Scripts\\pip.exe" install waitress': ???????????
原因是什么?如何解决呢?
出现这个错误的核心原因是:虚拟环境(vsic-venv)是从本地复制到服务器的,其中包含了本地的路径信息(如错误中的C:\\Users\\lzm07\\Desktop\\??????),导致在服务器上无法正确识别 Python 解释器路径。
虚拟环境本质上是依赖本地路径的,不能直接复制到其他机器使用,需要在服务器上重新创建虚拟环境。
(二)Waitress安装的正确办法
1. 删除复制过来的旧虚拟环境
在服务器的项目目录中,删除复制过来的vsic-venv文件夹(避免冲突):
# 进入项目根目录
cd C:\\website\\vietnam-study-in-china
# 删除旧虚拟环境(确认路径正确再执行)
rmdir /s /q vsic-venv
直接进入vietnam-study-in-china,删除vsic-venv文件夹也行。
2. 在服务器上重新创建虚拟环境
在服务器上使用系统自带的Python重新创建虚拟环境:
# 进入项目根目录
cd C:\\website\\vietnam-study-in-china
# 创建新的虚拟环境(名称仍为vsic-venv)
python -m venv vsic-venv
3. 激活新的虚拟环境
激活虚拟环境:
vsic-venv\\Scripts\\activate
激活成功后,命令行前缀会显示(vsic-venv),表示当前环境正确。
4. 安装项目依赖(包括waitress)
这就是为什么我们在项目部署前要先生成依赖清单requirements.txt的原因,就是在这个地方派上用场,直接安装:
# 安装依赖
pip install -r requirements.txt
# 单独安装waitress
pip install waitress
由于整个项目的依赖项非常多,下载和安装过程都非常的久,安装时建议使用国内的镜像,如下:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
5.关键说明
(1)虚拟环境不能跨机器复制,因为内部包含硬编码的本地路径,必须在目标机器上重新创建。
(2)路径中尽量避免中文或特殊字符(错误中的??????可能是中文乱码导致的),建议项目路径使用纯英文(如C:\\website\\vietnam-study-in-china是合适的)。
(3)如果后续需要迁移环境,正确的做法是在本地执行pip freeze > requirements.txt生成依赖清单,然后在服务器上通过该文件安装依赖,而不是复制整个虚拟环境。
(三)启动Flask应用(核心命令)
根据我们的项目结构,run.py是启动文件,需确认该文件中是否定义了Flask实例(通常为app)。run.py内容类似:
from app import create_app # 从app文件夹导入创建应用的函数
app = create_app() # 初始化Flask实例
if __name__ == '__main__':
app.run(debug=True) # 本地开发时的启动方式
在安装好waitress后,此时,使用waitress-serve启动的命令为:
waitress-serve –host 0.0.0.0 –port 5000 run:app
命令说明:
(1)–host 0.0.0.0:允许服务器所有网卡的IP访问(包括公网IP)。
(2)–port 5000:指定服务端口为5000(需确保该端口已在阿里云安全组和服务器防火墙中开放)。
(3)run:app:run指run.py文件(模块名),app指该文件中定义的Flask实例变量(需与run.py中的实际变量名一致)。
(四)验证启动是否成功
命令执行后,若看到类似以下输出,说明启动成功:
Serving on http://0.0.0.0:5000
测试访问:
(1)在服务器本地浏览器访问http://localhost:5000(或是http://127.0.0.1:5000),确认应用正常显示。
(2)通过公网访问 http://你的服务器公网IP:5000,确认能正常打开(需提前开放5000端口)。
至此,才可以通过公网IP访问网站:
四、设置开机自启(可选)
为避免服务器重启后需手动启动应用,可创建一个批处理文件实现自启:
在项目根目录创建start_app.bat文件(可以先建一个txt,之后改后缀),内容如下:
@echo off
cd /d C:\\website\\vietnam-study-in-china # 切换到项目目录
vsic-venv\\Scripts\\activate # 激活虚拟环境
waitress-serve –host 0.0.0.0 –port 5000 run:app # 启动服务
将该批处理文件添加到Windows启动目录:
(1)按下Win + R,输入shell:startup打开启动文件夹。
(2)将start_app.bat的快捷方式复制到该文件夹中。
五、常见问题排查
(1)启动报错“找不到模块”:检查run:app是否正确(如run.py中实例变量是app还是application,需对应修改)。
(2)端口被占用:执行netstat -ano | findstr :5000查看占用进程,通过任务管理器结束对应进程后重试。
(3)公网无法访问:检查阿里云安全组是否开放5000端口,以及Windows防火墙是否允许5000端口的入站连接。
按照以上步骤操作,即可通过Waitress启动你的Flask应用,并通过公网IP访问。使用域名访问网站(后续需配合反向代理绑定域名,可参考之后文章有关IIS/Nginx配置)。
评论前必须登录!
注册