settings.py 裏的 Debug 設定為 False 時,表示不要讓使用者在網頁上看到執行時的 bug 訊息,這可有效的保護網站資訊。
但 Debug 一但設定為 False,靜態文件的 /static 立即失效。Django 官網說明,當 Debug = False 時,就不再掌管 /static 目錄,必需交由 Apache 或其它 web Server 處理。
csrf 跨站請求攻擊保護
Cross Site Request Forgery 是一種很恐怖的攻擊,有多恐怖請查看 CSRF攻擊防護這篇說明。所以此保護機制一定要打開,方法如下。
1. settings.py 裏的 ‘django.middleware.csrf.CsrfViewMiddleware’ 一定要打開
2. 表單的 method 若使用 POST,則後面一定要有加 {% csrf_token %}
3. 如果使用 nginx 當主web server,會出現 “CSRF verification failed. Request aborted.” 錯誤。這是因為 nginx 沒有把 HOST 送給 Django,所以 nginx.conf 需增加如下藍色設定 :
server{
listen 80;
#server_name mahaljsp.ddns.net;
server_name ~.*;
location / {
proxy_pass http://localhost:7001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#pass ip 給 Django
proxy_set_header Host $http_host;#Django csrf才會有效
}
}
運作流程
Apache 曾風行一時,但近來慢慢被小而強悍的 Nginx 取代,且 Nginx 處理靜態文件的效能是 Apache 的 三 倍,所以我們使用 Nginx 當作主要 web Server,使用端請求網頁時,先由 Nginx 接收,再由 Nginx 送給 Django 執行。
Django 執行完的結果,也會交由 Nginx,再由 Nginx 傳送給客戶端。
但如果客戶端要求的是靜態文件時,則由 Nginx 直接送出,不經 Django 處理。
更改 Django port
首先要把 80 port 空出來,所以先將 Django 的 prot 改成 7000
venv\Scripts\python.exe manage.py runserver 0.0.0.0:7000
下載Nginx
https://nginx.org/en/download.html,解壓縮後,將 nginx-1.25.2 複製到 server 目錄下,並改名為 nginx
啟動與停止
進入 dos 命令提示視窗,執行如下指令
d:
cd \server\nginx
start nginx #手動啟動 nginx
nginx -s stop #手動停止 nginx
測試
在瀏覽器網址輸入 http://localhost 即可看到網頁。
開機自啟 Nginx
上述 “nginx start” 是手動啟動 Nginx,每次電腦重新開機都要手動輸入一遍,是很煩人的。
要讓 Nginx 開機後自動啟動,需使用 winsw 將 Nginx 移到系統的背景服務。請到 http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/2.9.0/ 選擇 winsw-2.9.0-bin.exe 。安裝時要求下載 .netFramework 3.5,請選擇下載並安裝。
將 winsw-2.9.0-bin.exe copy 到 nginx 目錄下,並改名為 nginx-winsw.exe
在 nginx 下新增 nginx-winsw.xml,內容如下
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>Nginx</id>
<name>Nginx</name>
<description>本服務用於加載 Nginx 服務</description>
<logpath>C:\Users\thomas\Downloads\nginx-1.19.6\nginx\logs</logpath>
<executable>nginx.exe</executable>
<stopexecutable>nginx.exe</stopexecutable>
<stopargument>-s</stopargument>
<stopargument>stop</stopargument>
<logmode>rotate</logmode>
</service>
安裝到背景服務
系統管理員身份開啟 dos 視窗,使用如下指令安裝到背景服務
安裝到背景服務
nginx-winsw.exe install
移除背景服務
nginx-winsw.exe uninstall
背景服務開啟及關閉
安裝到背景服數後,要重新開機才會自動啟動。若不想重新開機而是要手動開啟或關閉背景服務,需使用系統管理員身份開啟 dos 視窗,執行如下指令
net start nginx #開啟背景服務
net stop nginx #關閉背景服務
更改設定
請開啟 nginx\conf\nginx.conf,修改如下
server { listen 80; server_name mahaljsp.ddns.net; #charset koi8-r; #access_log logs/host.access.log main; #location / { # root html; # index index.html index.htm; #} location / { proxy_pass http://localhost:7001; proxy_set_header Host $http_host;#將客戶端的 HOST 傳入 Django proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#將客戶 ip 傳入Django } location /pictures { alias D:/pictures; } location /static { alias D:/server/pyweb/static; } location /download { alias d:/tools; } location /upload { alias D:/upload; }
}
location / 的功用是為了轉址,當網址為 http://localhost/ 時,使用 proxy_pass 轉交 Django 執行。
更改後記得儲存,然後使用系統管理員權限開啟 DOS 視窗,重新啟動 nginx
net stop nginx
net start nginx
nginx 重啟後,http://localhost/ 即可看到 Django 的首頁了。
ip分享器及防火牆設定
ip 分享器需將 80 port 指向此台電腦 ip,另也需手動將防火牆 80 port 打開。
靜態文件網址
上述設定已把 /pictures 網址指定為 d:/pictures,所以將某張圖片(1.jpg) copy 到 d:\pictures 之下,然後輸入網址 http://localhost/pictures/1.jpg 即可看到圖片
uWSGI
WSGI (Web Server Gateway Interface) 是同步通信服務規範,它是 Python 應用程序(application)或框架(如 Django)和 Web服務之間的一種接口,它是一種協議規範,在 PEP 333 提出。
uWSGI 只有 for Linux 的版本,所以在 Windows 下無法安裝。在 Linux 下執行 pip install uwsgi 。