[問題] SSL for Django + Nginx + uWSGI

看板Python作者 (內湖流川楓)時間6年前 (2018/03/31 16:47), 6年前編輯推噓4(4018)
留言22則, 4人參與, 6年前最新討論串1/1
各位大大好,小的只有一個需求, 希望一個放在 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://www.ptt.cc/bbs/Python/M.1522486034.A.3FC.html

03/31 17:06, 6年前 , 1F
內容出不來要不要看一下django有沒有收到request
03/31 17:06, 1F

03/31 17:07, 6年前 , 2F
或有沒有error?
03/31 17:07, 2F

03/31 17:08, 6年前 , 3F
謝謝大大,目前用了 uWSGI 後看不到 django 的行為,
03/31 17:08, 3F

03/31 17:08, 6年前 , 4F
之前有用ELB可以直接設定https 單個instance的設定不太熟
03/31 17:08, 4F

03/31 17:08, 6年前 , 5F
我研究一下要怎麼看 uWSGI 後面 project 的 log... @@"
03/31 17:08, 5F

03/31 17:09, 6年前 , 6F
port有對?
03/31 17:09, 6F
這個問題我其實自己也不確定... 在 Nginx <--> socket <--> uWSGI <--> Django 架構下走 http 會通, 所以我自己覺得 uWSGI <--> Django 之間的設定是 ok 的, 但走 https 後,Nginx 把 http request 轉到 port 443, uWSGI 跟 Django 到底需不需要改變設定,這是我還沒弄懂的地方... orz

03/31 17:09, 6年前 , 7F
請問... ELB 可以跑 python 3.x 嗎?
03/31 17:09, 7F

03/31 17:18, 6年前 , 8F
ELB是負載平衡跟後面跑什麼沒什麼關係 我問port的原因是
03/31 17:18, 8F
ELB 是 AWS Elastic Beanstalk 嗎? 之前我疑似看到 EB 很好設 https,但當我打開 AWS 控制台時, 看到的全是 python 2.7,就縮了... (汗

03/31 17:19, 6年前 , 9F
第一個教學uWSGI跑在8080 第二個SO他設定8000
03/31 17:19, 9F
啊啊,抱歉,這是我問題寫的不清楚了,那段 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

03/31 17:25, 6年前 , 10F
我用過nginx轉到uwsgi_pass sock file的方式在EC2上
03/31 17:25, 10F

03/31 17:27, 6年前 , 11F
nginx 的conf設定一下關於SSL的部分就好..
03/31 17:27, 11F

03/31 17:27, 6年前 , 12F
建議直接看uWSGI的doc
03/31 17:27, 12F

03/31 17:28, 6年前 , 13F

03/31 17:29, 6年前 , 14F
題外話,不要到處去找解法 直接看官方文件最安全
03/31 17:29, 14F

03/31 17:30, 6年前 , 15F
輕則是卡在奇怪的地方 重則server被駭也不知道原因
03/31 17:30, 15F
謝謝大大的建議~ 之前有翻到這個資源,但可能是我對網路的概念太貧乏了,還是沒能把問題解決 orz http://uwsgi-docs.readthedocs.io/en/latest/HTTPS.html 想請問... 依您的經驗,要走 https,除了 Nginx 之外, uWSGI 跟 Django project 也都需要做相對應的設定的,是嗎?

03/31 18:18, 6年前 , 16F
BTW 你是有自己買憑證 還是用AWS的SSL方案
03/31 18:18, 16F

03/31 18:18, 6年前 , 17F
我之前莊是自己有憑證 裝好crt&key 只要設定nginx conf就好
03/31 18:18, 17F
呃... 我並沒有設 SSL 憑證, 想說沒憑證只是會跳出這個連線不安全的訊息而已... 會是這個問題嗎... (汗 剛才找了一下,發現 AWS 有 SSL 的服務,感謝大大提供了這個訊息, 我彷彿又看到了一條路... 先去試試看!!

03/31 19:14, 6年前 , 18F
我記得uWSGI可以設定log 還有nginx的log也看看
03/31 19:14, 18F
收到!! 大感謝!!!

04/01 11:57, 6年前 , 19F
Nginx 開 443 ,把 request 導到 uwsgi 的 socket file
04/01 11:57, 19F

04/01 11:57, 6年前 , 20F
就好,Django 那邊全部都不用設,很簡單的
04/01 11:57, 20F

04/01 11:58, 6年前 , 21F
忘記講 nginx 那邊要設一下 443 的 ssl 憑證
04/01 11:58, 21F
謝謝大大~ 這樣的意思是說 uWSGI 本身預設就能處理 https 的連線了,對吧? 我再研究一下...

04/02 12:28, 6年前 , 22F
socket就跟https沒關係了吧
04/02 12:28, 22F
感謝各位大大的幫助,我終於把 https 給跑起來了!! 老天,我花了快一個禮拜的時間,才發現防火牆 port 443 沒開... 擔誤諸位大大寶貴的時間,真的是非常的抱歉... (跪 QwQ ※ 編輯: archon (125.227.30.252), 04/09/2018 16:36:17
文章代碼(AID): #1QlqiIFy (Python)