Django Rest Framework应用程序,由Gunicorn提供服务,由Nginx(SSL)代理

时间:2015-09-08 16:56:33

标签: django ssl nginx django-rest-framework gunicorn

目标:我想通过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"

0 个答案:

没有答案