Windows Nginx

      在〈Windows Nginx〉中尚無留言

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 。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *