在 http 和 https 上运行 Gunicorn

Posted

技术标签:

【中文标题】在 http 和 https 上运行 Gunicorn【英文标题】:Running Gunicorn on both http and https 【发布时间】:2016-06-05 09:00:52 【问题描述】:

当我启动我的 Gunicorn 服务时,我目前使用这个命令来启动它:

gunicorn --certfile=/Projects/thebodyofchrist.us.crt --keyfile=/Projects/thebodyofchrist.us.key bodyofchrist.wsgi -b 0.0.0.0:443 -b 0.0.0.0:80 -w 10

用于将 gunicorn 绑定到 http 和 https -- 或设置 apache2 以侦听 http 并使用现有参数将请求重定向到 https。 我有数百个指向http://example.com/sample/request 的链接 并需要它自动转到https://example.com/sample/request

gunicorn 正在托管 django。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

可以在 gunicorn 中添加此类支持。目前是不可能的。

https://github.com/benoitc/gunicorn/issues/1466

【讨论】:

【参考方案2】:

Gunicorn 是一个非常可靠的项目,我希望他们有朝一日能够通过多个端口绑定和命令行开关来指示 SSL 优先级。

当您最终投入生产时,您会想要使用 Apache 或 nginx 的卓越负载平衡。

但没有什么能阻止您(在开发过程中)运行一些绑定到端口 80 的工作人员和一些绑定到端口 443 的工作人员,并设置了密钥文件和证书文件。然后,您可以将登录链接写为“绝对”网址,例如href="https://yoursite/login" 登录后,他们将使用 https 网址。

#!/bin/sh
# put 8 workers as Daemon listening for HTTPS on 443
gunicorn -D -w 8 --certfile=/Projects/thebodyofchrist.us.crt --keyfile=/Projects/thebodyofchrist.us.key bodyofchrist.wsgi -b 0.0.0.0:443

# put 2 workers as Daemon listening for HTTP on port 80
gunicorn -D -w 2 bodyofchrist.wsgi -b 0.0.0.0:80

【讨论】:

现在如何将所有 http 流量重定向到 https? 这取决于您使用的框架。例如,如果您使用 FastAPI 或 starlette。有一个中间件可以做到这一点:HTTPSRedirectMiddleware 它只是使用不同的模式和端口号进行重定向。看看这里的代码也许它可以帮助你github.com/encode/starlette/blob/… 我不确定运行仅将请求从 http 重定向到 https 的工作人员是否是最佳选择。 运行第一行时,会不会每次到达第二行?【参考方案3】:

可以绑定多个地址。例如:

gunicorn -b 127.0.0.1:8000 -b [::1]:8000 test:app

https://docs.gunicorn.org/en/stable/settings.html?highlight=bind#server-socket

所以你可以这样做

gunicorn -b :80 -b :443 test:app

【讨论】:

那不是在 443 和 80 上都使用 ssl 吗? 这是错误的!不适用于带有证书的真正 https!

以上是关于在 http 和 https 上运行 Gunicorn的主要内容,如果未能解决你的问题,请参考以下文章

Webpack Dev Server在HTTPS / Web Sockets Secure上运行

运行 ServiceHost 时不能同时支持 http 和 https url

如何在 https 而不是 http 上运行 firebase(函数)模拟器?

Nodejs HTTP 和 HTTPS 在同一个端口上

支持 HTTP 和 HTTPS Web.Config WCF 服务

如何在 http 和 https 之间共享 asp.net 会话