一、利用django自帶服務器框架發佈web
系統管理員經常需要SSH 或者telent 遠程登錄到Linux 服務器,經常運行一些需要很長時間才能完成的任務,比如系統備份、ftp 傳輸等等。通常情況下我們都是爲每一個這樣的任務開一個遠程終端窗口,因爲它們執行的時間太長了。必須等待它們執行完畢,在此期間不能關掉窗口或者斷開連接,否則這個任務就會被殺掉,一切半途而廢了。這時screen就可以派上用場了。
screen進入一個新建的screen,此時關閉shell窗口,screen爲detached狀態,exit爲退出回到正常的shell窗口,此時關閉shell窗口爲attached狀態
當在正常窗口要連接detached窗口時,命令:screen -r 查看所有screen及pid,當要連接某個的時候,命令:screen -r [pid],當要停止某個screen並且銷燬時,我的作法是kill -s 9 [pid],此時對應screen爲dead??? 狀態,再執行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.7、django1.7、nginx1.6、ubuntu12.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爲工程中的主文件,hello爲app文件,static存放各種要用到樣式文件,js或者css,templates存放各種html的模板文件。
1、uwsgi與django
在與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-------------用於uwsgi與nginx的通信
pidfile------------當失去權限時寫入信息到該處
master=true
chmod-socket=777---uwsgi和nginx通信的socket權限,網上說644,反正777我可以
enable-threads-----允許多線程通信,感覺必須的
workers------------開啓多個線程,一般4個,kill時可以一次殺掉4個
wsgi-file----------uwsgi和django的配置文件
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()
搞定這裏之後,只是完成uwsgi與django的配置,接下來纔是辛苦(調了好久)
2、Nginx
在搗騰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改爲root,uwsgi_pass與ini中socket配置端口對應(注意別被其他程序佔用了),再補充一點:
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