目标:我想通过https提供django-rest-framework(drf)响应。
我试图理解为什么我的设置不起作用,是否可以通过其中一个组件中的简单设置更改来修复,或者我应该尝试不同的方法。
我有一个由gunicorn服务的drf应用程序。 Gunicorn是NGINX代理的幕后推手。我也有一些由NGINX提供的静态内容。这个设置适用于普通的旧http。
然后我设置NGINX来监听ssl(和安装的证书等)。静态内容适用于https。我仍然可以通过http访问drf,但我没有得到任何/暂时超过https。 gunicorn日志对我有帮助,但django dev服务器让开发服务器不能通过https"发送请求时
这是我第一次尝试使用nginx配置(匿名)。这主要来自阅读gunicorn和nginx手册。
server {
server_name example.com;
listen 443 ssl;
ssl_certificate /path/to/cert;
ssl_certificate_key /path/to/key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ...
location /static/{
alias /path/to/static/content/;
}
location / {
return 301 $scheme://example.com/static;
}
location /drf/{
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Real_IP $remote_addr;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://127.0.0.1:6565; # bound to gunicorn, can be reached from http://example.com:6565 - ideally want to be available from https://example.com:6565
}
}
server {
listen 80;
server_name example.com;
return 301 https://example.com
}
我不认为还有一个额外的步骤。在DRF方面,我阅读relevant Django security section并尝试使用SECURE_SSL_REDIRECT
= True(1.8中的新内容 - 许多现有问题未解决)和SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
。
我也尝试过重定向,但这在黑暗中有点像:
...after `proxy_pass` above, and commenting out proxy_redirect off:
proxy_redirect http://127.0.0.1:6565 https://example.com/drf
Ubuntu 14,Gunicorn 19,Nginx 1.1, Django 1.8(DRF 3.2)
更新:
NGINX错误记录:
如果我去https://example.com:6565
,我什么都得不到。对于https://example.com/drf/endpoint
的请求,这是nginx的错误日志中的错误。
2015/09/08 13:53:52 [error] 12564#0: *14 connect() failed (111: Connection refused while connecting to upstream, client: 155.xxx.xxx.xx, server:example.com, request:"GET /drf/endpoint", upstream: "http://127.0.0.1:6565/drf/endpoint", host: "example.com"