Flask经Gunicorn与Apache反向代理配置及HTTP返回问题求助
解决Flask+Gunicorn+Apache反向代理的HTTPS访问问题
折腾了好几个小时还没搞定确实闹心,我看你已经搭好了基础的反向代理框架,只是配置可能没补全或者有些细节没注意到。下面给你补全完整的Apache SSL虚拟主机配置,再提几个关键的检查点,应该就能让你的HTTPS访问正常跑起来:
完整的Apache SSL虚拟主机配置
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName app.your-domain.com # 替换成你的实际域名 ProxyPreserveHost On SSLProxyEngine On # 反向代理到Gunicorn监听的地址(这里假设Gunicorn跑在本地8000端口) ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ # Let's Encrypt证书相关路径,补全你没写完的部分 SSLCertificateFile /etc/letsencrypt/live/app.your-domain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/app.your-domain.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/app.your-domain.com/chain.pem # 推荐添加的SSL安全配置,避免旧协议和弱加密 SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder off SSLCompression off SSLSessionTickets off # 关键:告诉Flask应用当前请求是通过HTTPS过来的 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" </VirtualHost> </IfModule>
必须检查的几个关键点
- 确认Gunicorn的监听地址:Gunicorn要绑定
127.0.0.1:8000(不能只写localhost,避免Apache连接失败),启动命令参考:gunicorn --bind 127.0.0.1:8000 your_flask_app:app - 启用Apache必要模块:除了
mod_ssl,还要确保mod_proxy和mod_proxy_http已经开启,执行这两条命令:sudo a2enmod proxy proxy_http ssl sudo systemctl restart apache2 - Flask应用的HTTPS适配:在你的Flask代码里添加这些配置,保证会话cookie和生成的URL都是HTTPS的:
app.config.update( SESSION_COOKIE_SECURE=True, REMEMBER_COOKIE_SECURE=True, PREFERRED_URL_SCHEME='https' ) - 配置校验与服务重启:每次改完Apache配置先校验正确性:
sudo apache2ctl configtest,没问题再重启Apache和Gunicorn服务。
另外,建议加一个80端口的虚拟主机,把所有HTTP请求自动重定向到HTTPS,提升用户体验:
<VirtualHost *:80> ServerName app.your-domain.com Redirect permanent / https://app.your-domain.com/ </VirtualHost>
按上面的步骤调整后,应该就能实现用户HTTPS请求 → Apache → Gunicorn → Flask的完整流程了。
内容的提问来源于stack exchange,提问作者hans2k6
相关产品推荐
相关产品推荐

