Django+Nginx+uwsgi 項目部署


一:Django+Nginx+uwsgi 項目部署

# 1
在前面的章節中我們使用 python manage.py runserver 來運行服務器。這只適用測試環境中使用。

正式發布的服務,需要一個可以穩定而持續的服務器。

python django默認啟動
python3 manage.py runserver 0.0.0.0:8000這種方式調用wsgiref單機模塊,性能較低,生產環境不用


# 2
線上使用uwsgi工具(由c語言編寫的工具,性能強悍)啟動django,
使用方式:

在激活虛擬環境的前提下,使用uwsgi
安裝配置好virtualenvwrapper工具,或者virtualenv皆可


1.准備django項目 crm  
# ALLOWED_HOSTS = ['*']

# 環境准備
# 基礎開發環境配置
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

# 提前安裝好python3環境
# virtualenv   : 請確保你的虛擬環境正常工作

# 安裝django1.11
pip3 install django==1.11
#創建django項目mysite
django-admin startproject mysite
#創建app01
python3 manage.py startapp app01
mysite/settings.py

#settings.py設置
ALLOWED_HOSTS = ['*']
install app01
mysite/urls.py

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello_django/', views.hello),
]
app01/views.py


from django.shortcuts import render,HttpResponse

# Create your views here.
def hello(request):
    print('request is :',request)
    return HttpResponse('django is ok ')



1.安裝uwsgi工具

# 進入虛擬環境venv,安裝uwsgi

pip3 install -i https://pypi.douban.com/simple uwsgi


進入虛擬環境venv,安裝uwsgi
(venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi
檢查uwsgi版本
(venv) [root@slave 192.168.11.64 /opt]$uwsgi --version
2.0.17.1
#檢查uwsgi python版本
uwsgi --python-version



2.使用uwsgi.ini配置文件方式,啟動crm項目

-手動創建uwsgi.ini,放在crm項目下,便於管理
		touch uwsgi.ini 
配置文件uwsgi.ini的內容如下,這就是一個普通文本,里面定義了功能參數

# (django1) [root@bogon crm]# ls
# app01  crm  db.sqlite3  manage.py  pltj.py  __pycache__  statics  templates
# (django1) [root@bogon crm]# touch uwsgi.ini
# (django1) [root@bogon crm]# vim uwsgi.ini

	
[uwsgi]
# Django-related settings
# the base directory (full path)
#項目的絕對路徑,定位到nbcrm的第一層
chdir           = /opt/crm

# Django's wsgi file
# 找到項目第二層的wsgi文件
module          = crm.wsgi

# the virtualenv (full path)
# 找到虛擬環境的絕對路徑
home            = /opt/allenv/venv1   

# (venv1) [root@bogon venv1 ]# pwd
# /opt/allenv/venv1  


# process-related settings
# master
# 主進程
master          = true


# maximum number of worker processes
# 開啟uwsgi的多進程數,根據cpu核數來定義
processes       = 1


# the socket (use the full path to be safe
# 基於socket鏈接運行crm,只有與nginx結合的時候,才使用socket形式
socket          = 0.0.0.0:8000

# 當你沒用nginx,調試項目的時候,使用http形式 
# http     =  0.0.0.0:8000


# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true



#指定一個參數,日志放在哪

#如果你使用了supervisor,請注釋掉這個參數
#守護進程在后台運行,且將日志信息,輸出到uwsgi.log日志中
#daemonize = uwsgi.log
[uwsgi]
	chdir           = /opt/NBcrm
    
	# Django's wsgi file
	# 找到項目第二層的wsgi文件
	module          = NBcrm.wsgi
    
	# the virtualenv (full path)
	# 找到虛擬環境的絕對路徑
	home            = /root/Envs/nbcrm

3.啟動配置文件的命令

通過uwsgi.ini配置文件,啟動NBcrm

uwsgi --ini  uwsgi.ini

# 啟動配置文件的命令
# /root/Envs/nbcrm/bin/uwsgi   --ini uwsgi.ini   

# /opt/allenv/crm/bin/uwsgi   --ini uwsgi.ini 

# uwsgi   --ini uwsgi.ini 

4:配置nginx,結合uwsgi,以及處理靜態文件的配置

nginx.conf請求轉發配置如下

    server {
        listen       80;
        server_name  localhost;
			location / {
			include uwsgi_params;
			uwsgi_pass 0.0.0.0:8000;

        }
    }
	
	
nginx處理crm的靜態文件方式
	1.修改django的settings.py靜態文件
	添加如下參數
		# Static files (CSS, JavaScript, Images)
		# https://docs.djangoproject.com/en/1.11/howto/static-files/
		STATIC_ROOT='/opt/s20static'
		STATIC_URL = '/static/'
		STATICFILES_DIRS = [
			os.path.join(BASE_DIR,'statics'),
		]
		
	2.執行命令,收集crm的靜態文件
	 python3  /opt/NBcrm/manage.py collectstatic
	 
	 
	 python3  /opt/crm/manage.py collectstatic
	 
	 

	 3.配置nginx的location路徑匹配,找到crm這些靜態文件
	 在nginx.conf中找到server{}標簽,添加如下參數
	 #當我的請求url是 192.168.16.142:80/static/xxxxxxxx 
		location /static {
			alias  /opt/s20static/;
		}
		
	 4. 最終的nginx.conf文件如下:
	
		修改nginx.conf配置如下
			server {
				listen       80;
				server_name  localhost;
					#最低級路徑匹配,當請求url是 www.s20crm.com(192.168.16.142/)
					location / {
					   #include翻譯就是包含的意思,將外部一個文件的內容,包含進來 
						include uwsgi_params;
						#
						uwsgi_pass 127.0.0.1:8000;
					}
					#當請求是 192.168.16.142/static/xxxxx
					#解析NBcrm靜態文件內容,處理css js
					location /static {
						alias  /opt/s20static/;
					}
				}
			
	

	 5.啟動nginx,訪問nginx的80,是否可以轉發到crm


二:啟動項目的其它幾種方式

1.准備django項目 NB_crm  


2.安裝虛擬環境,在虛擬環境下,安裝uwsgi,進行部署
workon nbcrm
pip3 install -i https://pypi.douban.com/simple uwsgi

3.利用uwsgi運行一個python web腳本文件
	新建一個py腳本文件,寫入如下內容
	def application(env, start_response):
		start_response('200 OK', [('Content-Type','text/html')])
		return [b"Hello World"] # python3
	啟動命令如下
	uwsgi --http :8000 --wsgi-file test.py
		--http參數意思是,基於http協議運行 在 8000端口
		--socket  
		--wsgi-file  找到wsgi.py文件 
		
4.利用uwsgi運行django項目
(以參數形式運行項目),(還有以配置文件形式運行,把運行的參數寫入到一個文件里面,基於這個文件運行)
(以參數形式運行項目)
(以參數形式運行項目)
命令如下 
uwsgi --http :8088 --module mysite.wsgi
	--module  找到django項目的第二層里面的wsgi.py文件
	
uwsgi默認不支持靜態文件解析,使用nginx去解析靜態文件 

uwsgi --http :8088 --module crm.wsgi



5.熱加載django項目,uwsig自動重啟django

uwsgi --http :9000 --module NBcrm.wsgi   --py-autoreload=1 




6.基於配置文件的形式,運行nbcrm


三:supervisor

supervisor 是基於 python 的任務管理工具,用來自動運行各種后台任務,當然你也能直接利用 nohup 命令使任務自動后台運行,但如果要重啟任務,每次都自己手動 kill 掉任務進程,這樣很繁瑣,而且一旦程序錯誤導致進程退出的話,系統也無法自動重載任務。

這里超哥要配置基於virtualenv的supervisor

由於supervisor在python3下無法使用,因此只能用python2去下載!!!!!!

#注意此時已經退出虛擬環境了!!!!!
yum install python-setuptools
easy_install supervisor

通過命令生成supervisor的配支文件

echo_supervisord_conf > /etc/supervisord.conf

然后再/etc/supervisord.conf末尾添加上如下代碼!!!!!!

supervisord.conf配置文件參數解釋
[program:xx]是被管理的進程配置參數,xx是進程的名稱
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序啟動命令
autostart=true       ; 在supervisord啟動的時候也自動啟動
startsecs=10         ; 啟動10秒后沒有異常退出,就表示進程正常啟動了,默認為1秒
autorestart=true     ; 程序退出后自動重啟,可選值:[unexpected,true,false],默認為unexpected,表示進程意外殺死后才重啟
startretries=3       ; 啟動失敗自動重試次數,默認是3
user=tomcat          ; 用哪個用戶啟動進程,默認是root
priority=999         ; 進程啟動優先級,默認999,值小的優先啟動
redirect_stderr=true ; 把stderr重定向到stdout,默認false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默認50MB
stdout_logfile_backups = 20   ; stdout 日志文件備份數,默認是10
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默認為false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程
killasgroup=false     ;默認為false,向進程組發送kill信號,包括子進程
[program:my]
#command=/opt/venv/bin/uwsgi --ini  /etc/uwsgi_nginx.ini  #這里是結合virtualenv的命令 和supervisor的精髓!!!!
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#--home指的是虛擬環境目錄  --module找到 mysite/wsgi.py   

最后啟動supervisor,完成uWSGI啟動django,nginx反向代理

supervisord -c /etc/supervisord.conf #啟動supervisor
supervisorctl -c /etxc/supervisord.conf restart my  #重啟my項目
supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

重新加載supervisor

一、添加好配置文件后

二、更新新的配置到supervisord    

supervisorctl update
三、重新啟動配置中的所有程序

supervisorctl reload
四、啟動某個進程(program_name=你配置中寫的程序名稱)

supervisorctl start program_name
五、查看正在守候的進程

supervisorctl
六、停止某一進程 (program_name=你配置中寫的程序名稱)

pervisorctl stop program_name
七、重啟某一進程 (program_name=你配置中寫的程序名稱)

supervisorctl restart program_name
八、停止全部進程

supervisorctl stop all
注意:顯示用stop停止掉的進程,用reload或者update都不會自動重啟。
5.通過supervisorctl管理命令,管理uwsgi
supervisorctl -c /etc/supervisor.conf 

命令如下
status all 
start s20nbcrm
stop s20nbcrm
stop all



linux出現swp交換文件,是因為vim異常退出,或者有人同時在操作一個文件,linux系統保護機制,會生成swp文件,刪除即可


配置文件形式
nginx.conf
my.cnf
my.ini
uwsgi.ini
*.xml
*.json





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM