網頁

安裝Django+Flup+Nginx 於 Windows 平台

安裝Django+Flup+Nginx 於 Windows 平台


原本是要安裝Lighttpd+Flup+Django 後來發現 Nginx比Lighttpd還優,所以就試著安裝看看,果然是真的比Lighttpd還容易安裝,看網路文章說它還比較強,所以是輕量級web server不錯的選擇。

有關Apache、Nginx、Lighttpd評比的相關比較及評比,請參閱。

==========================================================

一. 先前工作:
  1.) 先安裝 python27 及Django
  2.) 建立一個mysite的目錄(自己設定的專案名稱)

==========================================================





二. 下載及安裝stable Nginx 版本
  1.) 下載stable nginx-1.4.4   ( nginx網站及說明)
  2.) 解壓縮將目錄放至C:\  (最好將目錄也改成nginx)
  3.) 執行C:\nginx.exe即可啟動web server
  4.) 在IE網址上打http://localhost/  沒問題的話就會出現一個網頁 "Welcome to nginx!"
  5.) 首頁的位址在 C:\nginx\html\index.html 視需要可以更改成你自己想要的,但主要我們還要銜接Django所以改了也沒用。
  6.) 要中止網站執行,需要在dos command 的視窗中執行  taskkill /f /im nginx.exe

==========================================================

三. 網站設定
  1.) 網站設定文件在C:\nginx\conf\nginx.conf
  2.) 檔案路徑設定方式有二種
  • /cygdrive/C/mysite
  • C:/mysite
    但試過第一種設定在windows上會有問題(Django的admin管理端執行時畫面會出錯),建議使用第二種設定。
  3.) 最好將原本的nginx.conf設定檔改名不要刪除,以備後續還原,將下列內容取代原本的設定檔。


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
            root   C:/mysite;
            index  index.html index.htm;
            # 指定 fastcgi 的主機與接口    8051為與django接口的port
            fastcgi_pass 127.0.0.1:8051;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_param SERVER_PROTOCOL $server_protocol;
            fastcgi_param SERVER_PORT $server_port;
            fastcgi_param SERVER_NAME $server_name;
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
        }

        location ^~ /media/ {
                alias        C:/Python27/Lib/site-packages/django/contrib/admin/media/;
        }
        # 可接受的資料來源
        location ~* ^.+\.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
        {
                expires 30d;
                break;
        }

        location ^~ /static/admin/
        {
                alias C:/Python27/Lib/site-packages/django/contrib/admin/static/admin/;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}



   # another virtual host using mix of IP-, name-, and port-based configuration
   #
   #server {
   #    listen       8000;
   #    listen       somename:8080;
   #    server_name  somename  alias  another.alias;

   #    location / {
   #        root   html;
   #        index  index.html index.htm;
   #    }
   #}


   # HTTPS server
   #
   #server {
   #    listen       443;
   #    server_name  localhost;

   #    ssl                  on;
   #    ssl_certificate      cert.pem;
   #    ssl_certificate_key  cert.key;

   #    ssl_session_timeout  5m;

   #    ssl_protocols  SSLv2 SSLv3 TLSv1;
   #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
   #    ssl_prefer_server_ciphers   on;

   #    location / {
   #        root   html;
   #        index  index.html index.htm;
   #    }
   #}

}

==========================================================
四. 安裝flup  
   首先,先到C:\Python27的目錄中,我的們目的是要能夠透過easy_install來安裝flup-1.0.3.dev_20110405-py2.7.egg,
執行pip setuptools 下載安裝setuptools-2.1.tar.gz, 完成後即可利用easy_install

執行easy_install flup-1.0.3.dev_20110405-py2.7.egg ,  flup是用來作為python實現WSGI的接口,相關說明:http://trac.saddi.com/flup
    3.) 安裝成功則會出現下列訊息:

 Processing flup-1.0.3.dev_20110405-py2.7.egg
Copying flup-1.0.3.dev_20110405-py2.7.egg to c:\python27\lib\site-packages
Adding flup 1.0.3.dev-20110405 to easy-install.pth file

Installed c:\python27\lib\site-packages\flup-1.0.3.dev_20110405-py2.7.egg
Processing dependencies for flup==1.0.3.dev-20110405
Finished processing dependencies for flup==1.0.3.dev-20110405

==========================================================


五. Django 與 Nginx的結合

     利用port 8051作為Django與Nginx的接口
     1.) 在mysite目錄中執行 
            python manage.py runfcgi method=threaded host=127.0.0.1 port=8051

     2.) 至nginx安裝的目錄中執行nginx.exe
     3.) 執行完成後,開啟IE輸入網址http://localhost/  即可完成,1.) 與 2.) 的順序可替換。

==========================================================

六. 製作成Windows Service(服務)
    1.) 下載 Windows Server 2003 Resource Kit Tools 安裝於 %ProgramFiles%\Windows Resource Kits\Tools\

    2.) 假設nginx.exe在 C:\nginx\ ,python安装在 C:\python27\,Django網站在C:\mysite\

    3.) 將 nginx 服務文件放置於C:\doc\nginx\ 
      3-1.) 在目錄中建置文件reg_service.bat 内容如下

"%ProgramFiles%\Windows Resource Kits\Tools\instsrv.exe" Nginx "%ProgramFiles%\Windows Resource Kits\Tools\srvany.exe"

pause


          粗體為服務名稱,應避免與現用服務名稱衝突。


       3-2.) 繼續在目錄中建立 reg_service.reg 注册表
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NGINX\Parameters]
"Application"="C:\\nginx\\nginx.exe"
"AppParameters"=""
"AppDirectory"="C:\\nginx\\"

       3-3.) 繼續建立 start_service.bat 來作為手動啟動服務,電腦重新啟動後此服務會自動啟動。
net start Nginx
pause
      3-4.) 繼續建立 stop_service.bat 用於停止服務
net stop Nginx
taskkill /f /im nginx.exe
taskkill /f /im nginx.exe
taskkill /f /im nginx.exe
taskkill /f /im nginx.exe
pause


         因為nginx.exe的行程至少有2個以上,net Stop只能停止一個,其他的行程必須利用winodws command line 的taskkill 去終止。

     3-5.) 繼續建立del_service.bat 用於删除服務

sc delete Nginx
pause


    4.) 下面為建立 fastcgi 的服務,把下面的所有文件設置在目錄 C:\doc\mysite\

        4-1.) reg_service.bat

"%ProgramFiles%\Windows Resource Kits\Tools\instsrv.exe" fastcgi_mysite "%ProgramFiles%\Windows Resource Kits\Tools\srvany.exe"
pause



        4-2.) reg_service.reg 

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fastcgi_mysite\Parameters]

"Application"="C:\\Python27\\python.exe"

"AppParameters"="manage.py runfcgi method=threaded host=127.0.0.1 port=8051"

"AppDirectory"="C:\\mysite\\"



        4-3.) start_service.bat 
net start fastcgi_mysite
pause



        4-4.) stop_service.bat 

net stop fastcgi_mysite

pause



        4-5.) del_service.bat 

sc delete fastcgi_mysite
pause




    5. ) 執行步驟:

        依次執行 C:\doc\mysite\ 下的

reg_service.bat
reg_service.reg
start_service.bat

        即可啟動 django以fastcgi方式執行在127.0.0.1:8051的服務



         繼續執行 C:\doc\nginx\ 下的

reg_service.bat

reg_service.reg
start_service.bat

        即可啟動 nginx 服務

==========================================================
七. 建立網站啟動及停止服務的bat 檔
    在建立bat檔之前請確認六. 的5.)可正確執行。(bat寫法參考網址:http://ca95.pixnet.net/blog/post/3922827)
    1.) 網站啟動:
  將 六. 所檔案中的pause移除,建立一個nginx_django_webstart.bat

call C:\doc\mysite\ start_service.bat
call C:\doc\nginx\start_service.bat


 2.) 網站停止服務:nginx_django_webstop.bat
         call C:\doc\mysite\stop_service.bat
            call C:\doc\nginx\stop_service.bat