作者archon (内湖流川枫)
看板Python
标题[问题] SSL for Django + Nginx + uWSGI
时间Sat Mar 31 16:47:06 2018
各位大大好,小的只有一个需求,
希望一个放在 AWS 上的 django 网站能走 https。
目前在网路上收集到的方法有两套:
1. Nginx <--> socket <--> uWSGI <--> Django
2. runsslserver
第一种方法我基本的设定是照
http://goo.gl/ZusnCE 走,
先透过 Nginx 跟 uWSGI 看到 http 的网页没问题,
但接着要切到 https 就试不出来了 (哭)
网路上有蛮多教学的,比方说这篇
https://goo.gl/kEh55q
不外乎就是 Nginx 设 port 80 reroute 到 443,
这部份我好像有试出来,在浏览器上直接打 IP 连结会转到 https,
但网站的内容就出不来了...
uWSGI 跟 Django 要不要设定则是众说纷云,
看过一种说法是 Nginx 对外走 https,对 uWSGI 走 http,
所以 uWSGI 跟 Django 都不用做任何设定,
我很喜欢这种做法,但目前还没找到这种做法 Nginx 的确切设定是什麽...
另一种说法则复杂许多,Nginx 要抽换掉 proxy header:
# nginx.conf
location / {
proxy_pass
http://localhost:8000/;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
uWSGI 设定要改成支援 https:
# uwsgi.ini
env = HTTPS=on
Django settings 也要修改:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
这种我也试了,还是无法,找不到问题所在... orz
第二种方法
https://github.com/teddziuba/django-sslserver
的确实我轻易地获得了 https 的连线,但这个 github 专案明明白白写着,
this
should not be used for production setups.
This app is intended for special use-cases.
Most people should instead do a proper production deplyoment
where a real webserver such as Apache or NGINX handles SSL.
搞得我也不敢随意使用这种作法...
想请问... 有没有在这方面有经验的大大能给我一条明路?
附带一提,其实我真正想要的,是透过 javascript 拿到装置 gps 的座标,
但 Chrome 的只允许 https 连线可以用这 API...
如果有方法能绕过这个限制,我也都愿意嚐试,
当然,能把 https 跑起来还是最好了 QwQ
--
喜欢拍照的正妹们,赶快来找我报到吧!!!
https://flic.kr/s/aHsk8JbB2C
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.227.30.252
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1522486034.A.3FC.html
1F:→ djshen: 内容出不来要不要看一下django有没有收到request 03/31 17:06
2F:→ djshen: 或有没有error? 03/31 17:07
3F:→ archon: 谢谢大大,目前用了 uWSGI 後看不到 django 的行为, 03/31 17:08
4F:→ djshen: 之前有用ELB可以直接设定https 单个instance的设定不太熟 03/31 17:08
5F:→ archon: 我研究一下要怎麽看 uWSGI 後面 project 的 log... @@" 03/31 17:08
6F:→ djshen: port有对? 03/31 17:09
这个问题我其实自己也不确定...
在 Nginx <--> socket <--> uWSGI <--> Django 架构下走 http 会通,
所以我自己觉得 uWSGI <--> Django 之间的设定是 ok 的,
但走 https 後,Nginx 把 http request 转到 port 443,
uWSGI 跟 Django 到底需不需要改变设定,这是我还没弄懂的地方... orz
7F:→ archon: 请问... ELB 可以跑 python 3.x 吗? 03/31 17:09
8F:→ djshen: ELB是负载平衡跟後面跑什麽没什麽关系 我问port的原因是 03/31 17:18
ELB 是 AWS Elastic Beanstalk 吗?
之前我疑似看到 EB 很好设 https,但当我打开 AWS 控制台时,
看到的全是 python 2.7,就缩了... (汗
9F:→ djshen: 第一个教学uWSGI跑在8080 第二个SO他设定8000 03/31 17:19
啊啊,抱歉,这是我问题写的不清楚了,那段 8000 是我直接 copy 别人文章中的内容,
我自己 Nginx 设定档的是按照第一个范例下去改成的,内容如下
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/firstsite.sock;
# 以下是新增的部份
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
其实这也是我在网路上找解法遇到一个很大的问题,
Django 走 https 的教学,感觉大家的 Nginx 都是先处在某个运作情况下,
修改的部份到底能不能适用第一个范例设定的环境,我心中充满了无限的问号 orz
10F:推 Sunal: 我用过nginx转到uwsgi_pass sock file的方式在EC2上 03/31 17:25
11F:推 Sunal: nginx 的conf设定一下关於SSL的部分就好.. 03/31 17:27
12F:→ Sunal: 建议直接看uWSGI的doc 03/31 17:27
14F:→ Sunal: 题外话,不要到处去找解法 直接看官方文件最安全 03/31 17:29
15F:→ Sunal: 轻则是卡在奇怪的地方 重则server被骇也不知道原因 03/31 17:30
谢谢大大的建议~
之前有翻到这个资源,但可能是我对网路的概念太贫乏了,还是没能把问题解决 orz
http://uwsgi-docs.readthedocs.io/en/latest/HTTPS.html
想请问... 依您的经验,要走 https,除了 Nginx 之外,
uWSGI 跟 Django project 也都需要做相对应的设定的,是吗?
16F:推 Sunal: BTW 你是有自己买凭证 还是用AWS的SSL方案 03/31 18:18
17F:→ Sunal: 我之前庄是自己有凭证 装好crt&key 只要设定nginx conf就好 03/31 18:18
呃... 我并没有设 SSL 凭证,
想说没凭证只是会跳出这个连线不安全的讯息而已...
会是这个问题吗... (汗
刚才找了一下,发现 AWS 有 SSL 的服务,感谢大大提供了这个讯息,
我彷佛又看到了一条路... 先去试试看!!
18F:→ djshen: 我记得uWSGI可以设定log 还有nginx的log也看看 03/31 19:14
收到!! 大感谢!!!
19F:推 eric541: Nginx 开 443 ,把 request 导到 uwsgi 的 socket file 04/01 11:57
20F:→ eric541: 就好,Django 那边全部都不用设,很简单的 04/01 11:57
21F:→ eric541: 忘记讲 nginx 那边要设一下 443 的 ssl 凭证 04/01 11:58
谢谢大大~ 这样的意思是说 uWSGI 本身预设就能处理 https 的连线了,对吧?
我再研究一下...
22F:→ djshen: socket就跟https没关系了吧 04/02 12:28
感谢各位大大的帮助,我终於把 https 给跑起来了!!
老天,我花了快一个礼拜的时间,才发现防火墙 port 443 没开...
担误诸位大大宝贵的时间,真的是非常的抱歉... (跪 QwQ
※ 编辑: archon (125.227.30.252), 04/09/2018 16:36:17