![对于在 EC2 上运行的 Django 1.4 应用程序,如何使用 SSL 证书将所有 HTTP 流量重定向到 HTTPS,该应用程序位于 ELB 后面的 nginx/uWSGI 上](https://linux22.com/image/798392/%E5%AF%B9%E4%BA%8E%E5%9C%A8%20EC2%20%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%9A%84%20Django%201.4%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20SSL%20%E8%AF%81%E4%B9%A6%E5%B0%86%E6%89%80%E6%9C%89%20HTTP%20%E6%B5%81%E9%87%8F%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20HTTPS%EF%BC%8C%E8%AF%A5%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BD%8D%E4%BA%8E%20ELB%20%E5%90%8E%E9%9D%A2%E7%9A%84%20nginx%2FuWSGI%20%E4%B8%8A.png)
我想知道如何将我的整个 django 网站置于 HTTPS 之后。如果有人尝试通过 HTTP 访问,我希望该用户被重定向到 HTTPS。目前,Firefox 给我错误“Firefox 检测到服务器正在以永远无法完成的方式重定向此地址的请求。”
我的设置是:
1. 一个带有 SSL 证书的 AWS 负载均衡器 (ELB) ELB 有两个侦听器:
- 负载均衡器端口 80 (HTTP) 指向实例端口 80 (HTTP)
- 负载均衡器端口 443 (HTTPS) 指向实例端口 80 (HTTP)
2.ELB 后面有一个 EC2 实例,运行 nginx/uWSGI
nginx 配置
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
set $home /server/env.example.com;
client_max_body_size 10m;
keepalive_timeout 120;
location / {
uwsgi_pass uwsgi_main;
include uwsgi_params;
uwsgi_param SCRIPT_NAME "";
uwsgi_param UWSGI_CHDIR $home/project;
uwsgi_param UWSGI_SCRIPT wsgi;
uwsgi_param UWSGI_PYHOME $home;
}
}
uwsgi 配置
# file: /etc/init/uwsgi.conf
description "uWSGI starter"
start on (local-filesystems
and runlevel [2345])
stop on runlevel [016]
respawn
exec /usr/local/sbin/uwsgi \
--uid www-data \
--socket 127.0.0.1:5050 \
--master \
--logto /var/log/uwsgi_main.log \
--logdate \
--optimize 2 \
--processes 8 \
--harakiri 120 \
--vhost \
--no-site \
--post-buffering 262144
3.Django 设置文件具有以下特定于 SSL/HTTPS 的设置
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
关于如何正确设置 HTTPS 有什么想法吗?
谢谢
答案1
我相信从 Django 1.4 开始,您只需SECURE_SSL_REDIRECT = True
在 settings.py 文件中进行设置即可
答案2
- 设置您的 AWS ELB 映射 ELB:80 到实例:80,将 ELB:443 映射到实例:1443。
- 绑定nginx监听80和1443端口。
- 将到达端口 80 的请求转发到端口 443。
NGINX 设置
server {
listen 80;
server_name www.example.org;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 1443;
server_name www.example.org;
}