云计算百科
云计算领域专业知识百科平台

Windows server服务器上部署python项目(超详细教程)

  我们现在已经开发好了一个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)填写规则:

  • 优先级:1(或其他数值,越小越优先)
  • 规则方向:入站
  • 协议类型:TCP
  • 端口范围:5000/5000
  • 授权对象:0.0.0.0/0(允许所有公网 IP 访问,生产环境可限制为你的本地 IP)
  • 描述:自定义(如 “允许访问 Flask 应用 5000 端口”)
  • 点击「确定」保存规则。
  • 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配置)

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Windows server服务器上部署python项目(超详细教程)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!