一: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