ubuntu下發布Django Web的兩種方法

一、利用django自帶服務器框架發佈web

 

    系統管理員經常需要SSH 或者telent 遠程登錄到Linux 服務器,經常運行一些需要很長時間才能完成的任務,比如系統備份、ftp 傳輸等等。通常情況下我們都是爲每一個這樣的任務開一個遠程終端窗口,因爲它們執行的時間太長了。必須等待它們執行完畢,在此期間不能關掉窗口或者斷開連接,否則這個任務就會被殺掉,一切半途而廢了。這時screen就可以派上用場了。

    screen進入一個新建的screen,此時關閉shell窗口,screendetached狀態,exit爲退出回到正常的shell窗口,此時關閉shell窗口爲attached狀態

當在正常窗口要連接detached窗口時,命令:screen -r 查看所有screenpid,當要連接某個的時候,命令:screen -r [pid],當要停止某個screen並且銷燬時,我的作法是kill -s 9 [pid],此時對應screendead??? 狀態,再執行screen -wipe清除即可。

參考:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

 

Django自帶了發佈Web的功能,如命令

python manage.py runserver 8080

其服務器日誌直接在接入shell界面輸出(default),通過一定設置應該也可以重定向到log文件中。

然而,當我們將shell關閉的時候,會發送關閉信號給django服務器,導致服務器關閉。有一種辦法可以解決,利用screen

只需新建一個screen,再輸入指令python manage.py runserver 0.0.0.0:8080 & 即可。

0.0.0.0: 或者 &都不能成功。

 

二、利用uwsgi+nginx發佈django web

 

    配置之前,隨便看看這兩篇,開始按照第一篇完全來是成功的,第二篇就不行了,然後就各種google

http://django-china.cn/topic/101/

http://django-china.cn/topic/124/

 

    引用博主的說法,通常做法是,將nginx作爲服務器最前端,它將接收WEB的所有請求,統一管理請求。nginx把所有靜態請求自己來處理(這是NGINX的強項)。然後,NGINX將所有非靜態請求通過uwsgi傳遞給Django,由Django來進行處理,從而完成一次WEB請求。

本機部件爲python2.7django1.7nginx1.6ubuntu12.04

先說說我的django工程文件部署情況

cimc2>

cimc2>

                  __init__.py

                  settins.py

                  urls.py

                wsgi.py

                 hello>

                               __init__.py

                               static>

                                               css

                                                js

                                                fonts

                              templates

                              views.py

                              admin.py

                              models.py

                manage.py

備註:cimc2爲工程中的主文件,helloapp文件,static存放各種要用到樣式文件,js或者csstemplates存放各種html的模板文件。

 

1uwsgidjango    

    在與manage.py同級的文件目錄下新建django_socket.ini文件,也可以新建django_socket.xml文件,不過還要再裝libxml(命令:sudo apt-get install libxml2-dev ),因爲編譯uwsgi前需要將libxml編譯,所以要先安裝libxml再,安裝uwsgi(網上的說法),所以要先卸載掉,甚至把文件夾rm掉再按照libxml->uwsgi進行。

 

不過我用xml方式沒有成功,不知爲什麼,就配置django_socket.ini文件。

 

uwsgi配置文件配置方法可以參考:

 

http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html

http://blog.csdn.net/sasoritattoo/article/details/17187949

 

我是這麼搞的:

 

[uwsgi]
socket=127.0.0.1:8011
pidfile=/var/run/nginx.pid
master=true
chmod-socket=777
enable-threads=true
workers=4
wsgi-file=django_wsgi.py
logdate=true
daemonize=/home/gugugujiawei/DjangoServer/cimc2/log/django.log

 

解釋一下:

[uwsgi]

socket-------------用於uwsginginx的通信

pidfile------------當失去權限時寫入信息到該處

master=true

chmod-socket=777---uwsginginx通信的socket權限,網上說644,反正777我可以

enable-threads-----允許多線程通信,感覺必須的

workers------------開啓多個線程,一般4個,kill時可以一次殺掉4

wsgi-file----------uwsgidjango的配置文件

logdate------------隨便加進去的

daemonize----------日誌文件,不寫的話就和發佈python一樣裸奔在shell界面

 

在與manage.py同級的文件目錄下新建django_wsgi.py文件,原因在上面

#coding:utf-8
import os
import sys
from django.core.wsgi import get_wsgi_application
reload(sys)
sys.setdefaultencoding('utf8')
 
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE","cimc2.settings"
)
#from django.core.handlers.wsgi import WSGIHandler
#application=WSGIHandler()
application=get_wsgi_application()

 

搞定這裏之後,只是完成uwsgidjango的配置,接下來纔是辛苦(調了好久)

 

2Nginx

 

    在搗騰nginx的時候,確實發現它的不少好處,規劃性好,維護性強,各種配置用得好的話,可以優化你的系統,方便維護,也可以做出很好的負載均衡和系統資源分配。

    在/etc/ngin目錄下可以看到

 

看到網上n多種方法,各種試,以下親測可用

sites-available下有個default文件,該文件用來改變端口號即可,如

 

配置文件在這裏,nginx.conf,按照之前工程文件的部署情況,這裏可以這麼寫:

 

user root;
worker_processes 4;
pid /run/nginx.pid;
 
events {
worker_connections 768;
# multi_accept on;
}
 
http {
 
##
# Basic Settings
##
 
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
 
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
 
include /etc/nginx/mime.types;
default_type application/octet-stream;
 
##
# Logging Settings
##
 
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
 
##
# Gzip Settings
##
 
gzip on;
gzip_disable "msie6";
 
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
 
##
# Virtual Host Configs
##
 
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server{
listen 8080;
server_name 127.0.0.1;
charset utf-8;
client_max_body_size 25M;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass 127.0.0.1:8011;
access_log off;
}
location /static{
alias /home/gugugujiawei/DjangoServer/cimc2/hello/static;
}
}
 
}
 
 
#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#	 listen     localhost:110;
#	 protocol   pop3;
#	 proxy      on;
#	}
# 
#	server {
#	 listen     localhost:143;
#	 protocol   imap;
#	 proxy      on;
#	}
#}


user改爲rootuwsgi_passinisocket配置端口對應(注意別被其他程序佔用了),再補充一點:

Html裏面如:

<script src="/static/js/jquery-1.11.0.js" ></script>

Settings.py裏面如:

 

還有STATIC_URL=’/static/’,STATIC_ROOT我沒加進去。


再進階學習之後,才知道在nginx.conf中include一個個的conf文件就可以實現監聽多個server,當然,是不同端口。

之後,由於uwsgi不能像django自帶發佈服務器runserver那樣修改源碼則自動加載,因而需要重啓uwsgi程序。

重啓步驟試過很多種,發現這種簡單粗暴:

1、查看nginx與uwsgi通信的socket端口

netstat -anp |grep xxxx

2、殺死對應的進程

kill -s 9 ****

3、重啓uwsgi

uwsgi --ini django_socket.ini

4、重啓nginx

killall -s 9 nginx(直接殺死進程,因爲有時候出現stop不了的情況)

/etc/init.d/nginx start

轉載前請留下網址:http://blog.csdn.net/gugugujiawei

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章