apache反向代理flask的核心是启用proxy和proxy_http模块,配置virtualhost将/转发至http://127.0.0.1:5000,配合proxypreservehost on与x-forwarded头,并确保flask绑定127.0.0.1且生产环境使用gunicorn替代app.run。

要让 Apache 作为反向代理把外部请求转发给本地运行的 Python Flask 应用,核心是不暴露 Flask 的开发服务器端口(如 5000),而是由 Apache 统一接收 HTTP 请求、处理 SSL、限流、日志等,再把请求安全地转给后端 Flask 实例。整个过程对用户透明,也不需要修改 Flask 代码逻辑。
✅ 前提条件:确保 Apache 已启用关键模块
Flask 反向代理依赖 mod_proxy 和 mod_proxy_http,部分场景还需 mod_rewrite 或 mod_headers。在终端执行:
a2enmod proxy proxy_http headers systemctl restart apache2
Ubuntu/Debian 系统用
a2enmod;CentOS/RHEL 请检查/etc/httpd/conf.modules.d/00-proxy.conf是否已启用对应模块,并确认httpd服务重启成功。
✅ 配置 Apache 虚拟主机(推荐方式)
编辑站点配置文件(如 /etc/apache2/sites-available/myflask.conf),写入以下内容:
<virtualhost>
ServerName myapp.example.com
ServerAdmin webmaster@localhost
# 关闭正向代理
ProxyRequests Off
# 允许代理到 localhost:5000
<proxy>
Require all granted
</proxy>
# 把所有请求转发给 Flask(假设它运行在 http://127.0.0.1:5000)
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
# 必须传递真实客户端 IP 和协议信息
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "http"
# 记录转发日志(可选)
LogLevel info proxy:info
ErrorLog ${APACHE_LOG_DIR}/myflask_error.log
CustomLog ${APACHE_LOG_DIR}/myflask_access.log combined
</virtualhost>
启用该站点并重载:
a2ensite myflask.conf systemctl reload apache2
✅ 注意:Flask 应用需以
host='127.0.0.1', port=5000启动(不要用0.0.0.0暴露公网),确保只允许本地访问。
✅ Flask 端适配真实请求头(关键细节)
Apache 转发时会把原始 Host、IP、协议等信息放在请求头中。Flask 默认不信任这些头,需手动启用信任:
from flask import Flask, request
app = Flask(__name__)
# 显式信任来自本地反向代理的头字段
@app.before_request
def before_request():
if request.headers.get('X-Forwarded-For'):
request.environ['REMOTE_ADDR'] = request.headers['X-Forwarded-For'].split(',')[0].strip()
if request.headers.get('X-Forwarded-Proto') == 'https':
request.environ['wsgi.url_scheme'] = 'https'
@app.route('/')
def hello():
return f"Hello from {request.host} — real IP: {request.remote_addr}"
或者更稳妥的方式:使用 ProxyFix 中间件(需安装 werkzeug >= 2.2.0):
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(
app.wsgi_app,
x_for=1, x_proto=1, x_host=1, x_prefix=1
)
⚠️ 若跳转链接变成
http://127.0.0.1:5000/xxx,或登录后跳回内网地址,就是没正确设置ProxyFix或X-Forwarded-*头。
✅ 补充建议:生产环境应搭配 WSGI 服务器
Flask 自带的 app.run() 仅适合开发调试。正式部署建议用 gunicorn 或 uwsgi 替代:
pip install gunicorn gunicorn --bind 127.0.0.1:5000 --workers 2 --timeout 30 myapp:app
然后 Apache 的 ProxyPass 目标仍为 http://127.0.0.1:5000/,但后端更稳定、支持并发、可平滑重启。
不复杂但容易忽略
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











