【适合中小企业应用的Flask网站部署指南】【小白指南系列】如何在Windows Server服务器上部署Flask网站和SSL证书开启HTTPS

【适合中小企业应用的Flask网站部署指南】【小白指南系列】如何在Windows Server服务器上部署Flask网站和SSL证书开启HTTPS

前言:

上一篇文章已经配置好Redis数据库和网站雏形建立了。现在完善了一个比较重大的功能和进度之后,我们尝试初步将Flask项目网站配置到真实运行的云服务上去,这个需要一个比较可靠和稳定的方案。这就是这篇文章的目标:让你从测试环境搬迁到生产环境中运行你的网站。

准备生产环境:

第一步:上传"源代码"到云服务器。不需要移动.env文件夹。

上传到服务器之后,检查是否有env虚拟环境文件夹。如果有,删除。

然后重新创建:

在project目录下,使用服务器上的Python创建新环境输入:

bash 复制代码
	python -m venv newEnv

然后激活:

bash 复制代码
# CMD 中
newEnv\Scripts\activate.bat

# PowerShell 中(需先允许执行脚本)
.\newEnv\Scripts\Activate.ps1 

看到(newEnv)即可确定自己处于虚拟环境模式激活状态。

进一步确认可以输入:

bash 复制代码
where python

如果输出路径包含 newEnv\Scripts\python.exe(例如 C:\path\to\project\newEnv\Scripts\python.exe),说明当前处于 newEnv 环境中。

服务器上激活newEnv后执行:

powershell 复制代码
#本地项目中先导出依赖清单
pip freeze > requirements.txt
#进入项目目录
pip install flask waitress  # 安装Flask和Waitress
pip install -r requirements.txt  # 安装项目其他依赖

在目录下创建或找到"run.py"文件,复制以下内容到文件中:

python 复制代码
#run.py
from waitress import serve
from flask_app import app  # 从主文件导入创建好的 app 实例

if __name__ == '__main__':
    # 使用 Waitress 启动应用,配置和原 Flask 服务器保持一致
    threads = 4
    serve(app, host='0.0.0.0', port=8080, threads = threads )

保存"run.py"文件,关闭它,然后回到powershell,在虚拟环境newEnv下面执行启动命令:python run.py

环境变量配置:

A:关闭命令行窗口后,环境变量会失效,适合临时测试。

bash 复制代码
# CMD 中:激活虚拟环境后,依次执行
set SECRET_KEY=124123124123124124bd21
set REDIS_HOST_IP=123.123.123.123
set REDIS_PORT=26739
set REDIS_PWD=1sdsdgasdfasdg
set DB_SERVER=abc.com
set MSSQL_USER=dbuser
set MSSQL_PWD=123345123
set DB_INSTANCE=
set DB_NAME_MAIN=dbName

# 启动应用
python run.py

B:如果不想每次都输入,就创建批处理脚本:创建一个 .bat 脚本(如 start_app.bat),批量设置环境变量并启动应用:

bash 复制代码
@echo off
:: 激活虚拟环境
call newEnv\Scripts\activate.bat

:: 设置环境变量
set SECRET_KEY=124123124123124124bd21
set REDIS_HOST_IP=123.123.123.123
set REDIS_PORT=26739
set REDIS_PWD=1sdsdgasdfasdg
set DB_SERVER=abc.com
set MSSQL_USER=dbuser
set MSSQL_PWD=123345123
set DB_INSTANCE=......
set DB_NAME_MAIN=dbName

:: 启动应用
python run.py

使用时,双击 start_app.bat 或在命令行中执行即可。

配置 HTTPS (部署SSL证书)

可以不通过 IIS 在 自定义 端口直接配置 HTTPS,只需让 Waitress 服务器直接支持 SSL 即可。以下是具体实现方法:

核心原理

Waitress 本身支持通过 ssl_context 参数配置 HTTPS,需要准备SSL 证书文件(.pem 格式),然后在启动脚本中指定证书路径和端口。

步骤 1:准备 SSL 证书

你需要两个文件:

证书文件(cert.pem):包含公钥

私钥文件(key.pem):包含私钥

如果你有正式 SSL 证书(如从 Let's Encrypt、阿里云等申请),直接使用对应的 .pem 格式文件。

测试环境可生成自签名证书(Windows 下可通过 OpenSSL 生成):

powershell 复制代码
#安装 OpenSSL(如通过 Chocolatey:choco install openssl)
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

生成后会在当前目录得到 cert.pem 和 key.pem,将它们放到项目目录中(如 C:\python_Project\project\ssl\)。

步骤 2:修改 run.py 支持 HTTPS

run.py 中添加 SSL 配置,让 Waitress 监听 8080(自行修改) 端口并启用 HTTPS:

python 复制代码
from waitress import serve
from flask_app import app
import os

if __name__ == '__main__':
    # 配置SSL证书路径(替换为你的实际路径)
    ssl_cert = os.path.join(os.path.dirname(__file__), 'ssl', 'cert.pem')  # 证书文件
    ssl_key = os.path.join(os.path.dirname(__file__), 'ssl', 'key.pem')    # 私钥文件

    # 验证证书文件是否存在
    if not os.path.exists(ssl_cert) or not os.path.exists(ssl_key):
        raise FileNotFoundError("SSL证书文件不存在,请检查路径是否正确")

    # 启动Waitress并启用HTTPS,绑定8080端口
    serve(
        app,
        host='0.0.0.0',
        port=8080,
        url_scheme='https',  # 强制使用HTTPS
        ssl_context=(ssl_cert, ssl_key)  # 传入证书和私钥
    )

步骤 3:启动应用并验证

确保证书路径正确(脚本中已添加路径验证,若路径错误会直接报错)。

在虚拟环境中启动应用:

powershell

(yunEnv) PS C:\python_Project\YunShangERP> python run.py

启动成功后,通过 https://服务器IP:8080 访问(注意是 https 而非 http)。

拥有pfx文件,如何获得pem?可以通过 OpenSSL 工具将 PFX 文件转换为 PEM 格式的证书和私钥文件。以下是具体步骤:

步骤 1:安装 OpenSSL

如果服务器上没有 OpenSSL,先安装它:

方法 1(推荐):通过 Chocolatey 包管理器安装(需管理员权限)

以管理员身份打开 PowerShell

安装 Chocolatey(若未安装):

powershell 复制代码
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

安装 OpenSSL:

powershell 复制代码
choco install openssl -y

重启 PowerShell 使配置生效。温馨提示:OpenSSL下载很慢

步骤 2:转换 PFX 到 PEM

假设你的 PFX 文件路径为 C:\cert\your_cert.pfx,执行以下命令:

提取私钥(key.pem)

powershell 复制代码
openssl pkcs12 -in "C:\cert\your_cert.pfx" -nocerts -out "C:\cert\key.pem" -nodes

执行后会提示输入 PFX 文件的密码(若设置过),输入后回车。

-nodes 表示不加密私钥(避免启动时需要输入密码)。

提取证书(cert.pem)

powershell 复制代码
openssl pkcs12 -in "C:\cert\your_cert.pfx" -nokeys -out "C:\cert\cert.pem"

同样可能需要输入 PFX 密码。

步骤 3:验证文件

转换完成后,在 C:\cert\ 目录下会生成两个文件:

key.pem:私钥文件

cert.pem:证书文件

可以用文本编辑器打开查看,确认内容以 -----BEGIN PRIVATE KEY-----(私钥)和 -----BEGIN CERTIFICATE-----(证书)开头。

步骤 4:配置到应用中

将生成的 cert.pem 和 key.pem 放到项目的 ssl 目录(如 C:\python_Project\project\ssl\),然后按之前的 run.py 配置即可启用 HTTPS。

如果转换过程中提示密码错误,需确认 PFX 文件的原始密码是否正确(通常是导出 PFX 时设置的密码)。

其它方案:

用IIS来重定向绑定SSL证书

搭配 IIS 作为反向代理(可选)

如果需要处理静态文件、SSL 证书或域名绑定,可使用 Windows 自带的 IIS 作为反向代理:

安装 IIS:通过「服务器管理器 → 添加角色和功能」安装 IIS 及「URL 重写」模块

配置反向代理:

在 IIS 中创建网站,绑定域名和端口(如 80)

安装「Application Request Routing」模块

配置 URL 重写规则,将请求转发到 http://127.0.0.1:8000

相关推荐
zhysunny24 分钟前
Day22: Python涡轮增压计划:用C扩展榨干最后一丝性能!
c语言·网络·python
小张同学zkf1 小时前
【测试】基于博客系统的测试报告
python·功能测试·压力测试·测试
麦麦大数据2 小时前
求职推荐大数据可视化平台招聘系统 Vue+Flask python爬虫 前后端分离
vue.js·爬虫·python·信息可视化·flask·推荐算法·协同过滤
海绵宝宝汉堡包2 小时前
数据分析专栏记录之 -基础数学与统计知识 2 概率论基础与python
python·数据分析·概率论
赴3353 小时前
图像边缘检测
人工智能·python·opencv·计算机视觉
谢尔登3 小时前
【计算机网络】 IPV4和IPV6区别
运维·服务器·计算机网络
@Demi3 小时前
vsCode或Cursor 使用remote-ssh插件链接远程终端
服务器·ide·vscode·ssh
llrraa20104 小时前
python whisper生成字幕
开发语言·python·whisper
没有梦想的咸鱼185-1037-16634 小时前
AI大模型支持下的:CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
人工智能·python·深度学习·机器学习·chatgpt·数据挖掘·数据分析
Ratten4 小时前
批量识别图片文字保存到 excel 中
python