Windows 下 Nginx + Flask 应用迁移阿里云完整部署指南(附安全加固)
阿里云 Nginx + Flask 应用部署配置文档
适用场景:将现有 Flask 应用(监听 5000 端口)迁移到阿里云服务器,使用 Nginx 提供 HTTPS 反向代理,并确保后端服务仅限本机访问。
一、环境准备
1. 服务器信息(示例)
- 操作系统:Windows Server 2022 / 2019(本流程基于 Windows)
- 公网 IP:
123.123.123.123(替换为实际 IP) - 域名:
your-domain.com(替换为实际域名) - SSL 证书:已获取
your-domain.com的证书文件(.crt/.key)
2. 所需软件
- Nginx(Windows 版):下载地址(建议稳定版)
- Python 环境(若 Flask 应用依赖):Python 3.8+,已创建虚拟环境(如
venv)
二、安装 Nginx 并放置证书
- 将 Nginx 压缩包解压到
C:\nginx。 - 将 SSL 证书文件(
your-domain.com_bundle.crt和your-domain.com.key)放入C:\nginx\conf\目录。
三、配置 Nginx
编辑C:\nginx\conf\nginx.conf,内容如下(替换your-domain.com为实际域名):
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # HTTP 强制跳转 HTTPS server { listen 80; server_name your-domain.com www.your-domain.com; return 301 https://$host$request_uri; } # HTTPS 反向代理 server { listen 443 ssl; server_name your-domain.com www.your-domain.com; ssl_certificate C:/nginx/conf/your-domain.com_bundle.crt; ssl_certificate_key C:/nginx/conf/your-domain.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 根路径重定向到 /login(若后端未定义 /) location = / { return 302 /login; } # 所有请求转发到本地 5000 端口(后端应用) 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 https; } } }四、启动 Nginx
- 以管理员身份打开 PowerShell。
- 进入 Nginx 目录:
cd C:\nginx - 测试配置文件语法:
若显示nginx-tsyntax is ok和test is successful,继续。 - 启动 Nginx:
或使用nginxstart nginx在新窗口启动。 - 验证端口监听:
应看到netstat-ano|findstr :80 netstat-ano|findstr :443LISTENING状态。
五、配置 Flask 后端应用仅监听 127.0.0.1
关键安全措施:确保后端应用只监听本地地址,拒绝外网直接访问。
1. 修改启动脚本(如wsgi.py)
如果使用waitress或flask run,务必显式指定host='127.0.0.1'。
示例(wsgi.py):
fromtreasureimportcreate_appfromwaitressimportserve app=create_app()if__name__=='__main__':serve(app,host='127.0.0.1',port=5000,threads=8)2. 检查并移除环境变量覆盖
在启动前,检查是否存在覆盖变量:
$env:WAITRESS_HOST$env:FLASK_RUN_HOST若输出0.0.0.0,需移除或修改为127.0.0.1。
3. 启动后端应用
进入项目目录,激活虚拟环境(如有),执行:
python wsgi.py观察启动日志,确认显示:
Serving on http://127.0.0.1:50004. 验证监听地址
另开一个 PowerShell 窗口:
netstat-ano|findstr :5000期望结果:
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 1234(IP 为127.0.0.1,而非0.0.0.0)
六、加固网络安全(双重保险)
1. 删除可能存在的端口转发规则
netsh interface portproxy show all若有任何涉及 80 或 443 的转发规则,将其删除。例如:
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=802. 添加 Windows 防火墙阻止 5000 端口入站
即使应用绑定了127.0.0.1,仍建议封堵外网访问:
netsh advfirewall firewall add rule name="Block_5000"dir=in action=block protocol=TCP localport=50003. 配置阿里云安全组
登录阿里云控制台,进入实例的安全组配置:
- 入方向规则:只保留
80和443端口放行(来源0.0.0.0/0)。 - 删除任何允许
5000端口的规则。
七、测试访问
- 浏览器访问
http://your-domain.com-> 应自动跳转到https://your-domain.com。 - 访问
https://your-domain.com/login-> 应正常显示登录页面。 - 访问
https://your-domain.com-> 应跳转到/login(因配置了location = /重定向)。 - 从外部网络(如手机流量)访问
http://123.123.123.123:5000-> 应连接超时或拒绝访问,证明后端已隔离。
八、日常运维命令速查
| 操作 | 命令(管理员 PowerShell) |
|---|---|
| 测试 Nginx 配置 | cd C:\nginx; nginx -t |
| 重载 Nginx 配置(不中断服务) | nginx -s reload |
| 优雅停止 Nginx | nginx -s quit |
| 强制停止 Nginx | nginx -s stop |
| 查看 Nginx 进程 | tasklist | findstr nginx |
| 查看端口监听 | netstat -ano | findstr :80或:443或:5000 |
| 实时查看 Nginx 访问日志 | Get-Content C:\nginx\logs\access.log -Wait |
| 实时查看 Nginx 错误日志 | Get-Content C:\nginx\logs\error.log -Wait |
九、开机自启配置(可选)
若希望服务器重启后 Nginx 自动启动,可将以下命令放入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\start_nginx.bat:
@echo off cd /d C:\nginx start nginx或使用WinSW将 Nginx 封装为 Windows 服务(推荐生产环境)。
十、常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
Nginx 启动报bind() to 0.0.0.0:80 failed (10013) | 端口被占用(残留 Nginx、IIS、iphlpsvc 等) | 使用netstat -ano | findstr :80找出 PID,结束进程;若为iphlpsvc,检查并删除netsh portproxy规则 |
| 访问 HTTPS 显示证书错误 | 证书路径或域名不匹配 | 检查ssl_certificate路径和域名是否一致 |
| 访问页面出现 502 Bad Gateway | 后端应用未启动或未监听 5000 | 检查后端进程及netstat | findstr 5000 |
| 访问根路径返回 404 | 后端应用未定义/路由 | 在 Nginx 中添加location = / { return 302 /login; }或后端添加路由 |
| 外网仍能访问 5000 端口 | 云安全组未关闭 5000 入站 | 去阿里云控制台删除该规则 |
十一、总结
本配置实现了:
- HTTP 自动跳转 HTTPS
- Nginx 反向代理到本地 Flask 应用
- 后端应用仅监听
127.0.0.1,外网无法直接访问 - 防火墙和云安全组双重加固
- 日常运维命令齐备
按照此文档,运维人员可快速完成部署,并确保生产环境安全稳定。
文档版本:1.1
适用系统:Windows Server
最后更新:2026-07-21