无法使用SSL来使用django + nginx + wsgi

时间:2011-01-07 05:15:04

标签: ssl nginx mod-wsgi

我已经为Django + nginx + wsgi + ssl做了几个例子,但是我无法让它们工作。我只是在浏览器中遇到错误而不能连接。

我在主机上运行了两个网站。除了ip地址,服务器名称和目录之外,配置文件是相同的。

当两者都不使用SSL时,它们可以正常工作。当我尝试用其中一个来听443时,我无法连接到其中任何一个。

我的配置文件如下,任何建议都会受到赞赏。

server{
listen xxx.xxx.xxx.xxx:80;
server_name sub.domain.com;

access_log /home/django/logs/nginx_customerdb_http_access.log;
error_log /home/django/logs/nginx_customerdb_http_error.log;

location / { 
    proxy_pass  http://127.0.0.1:8080; 
    proxy_redirect          off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90; 
    proxy_send_timeout      90; 
    proxy_read_timeout      90; 
    proxy_buffers           32 4k; 
}   

location /site_media/ {
    alias /home/django/customerdb_site_media/;
}   

location /admin-media/ {
    alias /home/django/django_admin_media/;
}   
}

server{
listen xxx.xxx.xxx.xxx:443;
server_name sub.domain.com;

access_log /home/django/logs/nginx_customerdb_http_access.log;
error_log /home/django/logs/nginx_customerdb_http_error.log;

ssl on; 
ssl_certificate sub.domain.com.crt;
ssl_certificate_key sub.domain.com.key;
ssl_prefer_server_ciphers   on; 


location / { 
    proxy_pass              http://127.0.0.1:8080; 
    proxy_redirect          off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Protocol    https;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
}

location /site_media/ {
    alias /home/django/customerdb_site_media/;
}

location /admin-media/ {
    alias /home/django/django_admin_media/;
}
}


<VirtualHost *:8080>
ServerName xxx.xxx.xxx.xxx
ServerAlias xxx.xxx.xxx.xxx

LogLevel warn
ErrorLog /home/django/logs/apache_customerdb_error.log
CustomLog /home/django/logs/apache_customerdb_access.log combined

WSGIScriptAlias / /home/django/customerdb/apache/django.wsgi
WSGIDaemonProcess customerdb_wsgi processes=4 threads=5
WSGIProcessGroup customerdb_wsgi

SetEnvIf X-Forwarded-Protocol "^https$" HTTPS=on

</VirtualHost>

UDPATE:主机上存在两个站点(在不同的IP上)是个问题。如果我删除其他网站,上面的设置大多数工作。这样做也会带来另一个问题:chrome不接受网站安全说某些内容未加密。

2 个答案:

答案 0 :(得分:2)

[这应该是评论......]

您还应该设置

proxy_set_header X-Forwarded-Protocol $scheme

当连接安全时向Django表示,否则你的https链接将被重定向到http,这是不好的。

这将http实际为httphttpshttps

答案 1 :(得分:0)

我更改了侦听80的服务器以重写为https删除了所有其他指令。