我们有一些Django设置通过代理(Apache和Nginx),最终进入实际的Django运行时。
我们需要在我们的网络中进行端到端的HTTPS。我们一直在重新审视Gunicorn,因为它在我们的其他设置中取得了成功和性能,但需要使用端到端的HTTPS进行测试才能保持一致。
我们的拓扑结构是这样的:
https://foo.com - > [面向公众的代理] - > (https) - > [内部服务器https://192...:8001]
如何配置Gunicorn使用自签名证书侦听HTTPS?
答案 0 :(得分:64)
Gunicorn现在支持SSL,as of version 17.0。您可以将其配置为侦听https,如下所示:
$ gunicorn --certfile=server.crt --keyfile=server.key test:app
如果您使用--bind
侦听端口80,请记住将端口更改为443(HTTPS连接的默认端口)。例如:
$ gunicorn --certfile=server.crt --keyfile=server.key --bind 0.0.0.0:443 test:app
答案 1 :(得分:16)
大致迟到的回复,但对于遇到此问题的其他人,还有另一个选项,使用nginx作为上面的“[面向公众的代理]”。
配置nginx以处理端口443上的传入SSL流量,然后将proxy_pass配置为内部端口上的gunicorn。外部流量已加密,无论如何都不会暴露nginx和gunicorn之间的流量。我发现这很容易管理。
答案 2 :(得分:3)
如果您使用的是 gunicorn.config.py 或类似的 gunicorn 配置文件,您可以添加证书文件和密钥文件。
certfile = '/etc/letsencrypt/live/example.com/fullchain.pem'
keyfile = '/etc/letsencrypt/live/example.com/privkey.pem'
配置文件可用于将设置初始化为环境变量,如果您有很多设置,这会很有帮助。 使用配置文件
通过创建一个名为的文件来创建一个配置文件
gunicorn.config.py
一些通常的设置是
bind = "0.0.0.0:8000"
workers = 4
pidfile = 'pidfile'
errorlog = 'errorlog'
loglevel = 'info'
accesslog = 'accesslog'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
当然还有
certfile = '/etc/letsencrypt/live/example.com/fullchain.pem'
keyfile = '/etc/letsencrypt/live/example.com/privkey.pem'
查看 documentation 和配置文件 example
使用这些设置运行 gunicorn
$ gunicorn app:app
自从
<块引用>默认情况下,将从运行 gunicorn 的同一目录读取名为 gunicorn.conf.py 的文件。
答案 3 :(得分:0)
除了 certfile
和 keyfile
之外,您还需要添加 ca-certs
。没有通过 ca-certs
,我在 Android 设备上获得了 Trust anchor for certification path not found.
。
示例命令:
/usr/bin/python3 /usr/local/bin/gunicorn --bind 0.0.0.0:443 wsgi:app --workers=8 --access-logfile=/root/app/logs/access.log --error-logfile=/root/app/logs/error.log --certfile=/root/app/certificate.crt --keyfile=/root/app/private.key --ca-certs=/root/app/ca_bundle.crt --daemon