Django uwsgi Nginx 的生產(chǎn)環(huán)境部署詳解
配置生產(chǎn)環(huán)境
#setting.py 文件中 DEBUG = False # 生產(chǎn)環(huán)境 # 允許訪問的域名,域名前加一個點(diǎn)表示允許訪問該域名下的子域名,比如 www.zmrenwu.com、 # test.zmrenwu.com 等二級域名同樣允許訪問。如果不加前面的點(diǎn)則只允許訪問 zmrenwu.com ALLOWED_HOSTS = ["127.0.0.1",".blogzjl.site"]
創(chuàng)建Python虛擬環(huán)境
安裝 virtualenv
sudo pip3 install virtualenv
克隆Python的環(huán)境
#先到指定目錄下運(yùn)行, 我的虛擬環(huán)境是在 blogzjl.site 目錄下 #指定--python=python3 克隆Python3的環(huán)境 virtualenv --python=python3 env #進(jìn)入虛擬環(huán)境 source /home/zjl/sites/blogzjl.site/env/bin/activate #用戶名前,會出現(xiàn) (env) zjl@ ,表示進(jìn)入 #后面基本上都是在虛擬環(huán)境中完成的
收集靜態(tài)文件
先在settings中配置 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
同時在mysite_nginx.conf 中將靜態(tài)文件的路徑改為 static 的絕對路徑
#在settings中配置 # STATIC_ROOT 指明了靜態(tài)文件的收集目錄,即項(xiàng)目根目錄(BASE_DIR)下的 static 文件夾 STATIC_ROOT = os.path.join(BASE_DIR, 'static') #在命令行輸入 python3 manage.py collectstatic #將靜態(tài)文件copy到統(tǒng)一的目錄static下
uwsgi配置
安裝 uwsgi
pip3 install uwsgi #可能需要更新pip才能安裝,根據(jù)提示輸入命令更新 pip install --upgrade pip
測試 uwsgi
在項(xiàng)目目錄下執(zhí)行
uwsgi --http 127.0.0.1:8080 --file BlogProject/wsgi.py --static-map=/static=static #--http 這個就和runserver一樣指定IP 端口 #--file Django 項(xiàng)目中wsgi.py文件的路徑,和setting.py在同一個目錄下 #-- static 做一個映射,指定靜態(tài)文件 #可能會啟動/訪問失敗,請檢查端口是否占用,file 或 static 路徑是否正確 #使用命令 netstat -nultp 查看端口使用情況 #關(guān)掉相關(guān)經(jīng)常 killall -9 uwsgi 或 kill -9 進(jìn)程號
執(zhí)行Linux命令 curl http://127.0.0.1:8080 訪問,查看是否是訪問成功后的頁面(可以啟動DEBUG 對錯誤頁面的相關(guān)調(diào)試)
配置文件
相當(dāng)于將 uwsgi --http 127.0.0.1:8080 --file BlogProject/wsgi.py --static-map=/static=static 這一長串命令配置到文件里,簡化以后的啟動命令
在自定義目錄或項(xiàng)目主目錄下創(chuàng)建uwsgi配置文件:blogzjl_uwsgi.ini(自定義命名,以 .ini 結(jié)束),我這里是在/home/zjl/sites/blogzjl.site/blogzjl/
路徑下自定義的一個目錄 script 存放所有配置(包括nginx)相關(guān)的文件
[uwsgi] #the local unix socket file than commnuincate to Nginx socket = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock # 項(xiàng)目路徑 chdir = /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/ # Django's wsgi file 項(xiàng)目中wsgi的位置 wsgi-file = BlogProject/wsgi.py #進(jìn)程相關(guān)設(shè)置 # 進(jìn)程數(shù) 同 processes worker = 5 #processes = 4 #線程數(shù) #threads = 2 #指定靜態(tài)文件 static-map = /static=/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static #主進(jìn)程啟動 master = true pidfile = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.pid #static-map = /static = /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static #啟動uwsgi的用戶名和用戶組 uid = zjl gid = zjl #啟用線程 enable-threads = True #設(shè)置自中斷時間 harakir = 30 #設(shè)置緩沖 post-buffering = 4096 #設(shè)置后臺運(yùn)行 daemonize = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.log #monitor uwsgi status #stats = 127.0.0.1:9191 # clear environment on exit 退出時清除環(huán)境 vacuum = true
uwsgi 執(zhí)行的相關(guān)命令
#啟動命令 #在項(xiàng)目目錄下 uwsgi --ini ../script/blogzjl-uwsgi.ini #停止 uwsgi --stop ../script/uwsgi.pid #重啟 uwsgi -- reload ../script/uwsgi.pid #uwsgi.pid 為 配置文件中 pidfile 設(shè)置的值 ,用來控制uwsgi重啟或停止,
uwsgi 相關(guān)配置文件參數(shù)
master = true #啟動主進(jìn)程,來管理其他進(jìn)程,其它的uwsgi進(jìn)程都是這個master進(jìn)程的子進(jìn)程,如果kill這個master進(jìn)程,相當(dāng)于重啟所有的uwsgi進(jìn)程。 chdir = /web/www/mysite #在app加載前切換到當(dāng)前目錄, 指定運(yùn)行目錄 module = mysite.wsgi # 加載一個WSGI模塊,這里加載mysite/wsgi.py這個模塊 py-autoreload=1 #監(jiān)控python模塊mtime來觸發(fā)重載 (只在開發(fā)時使用) lazy-apps=true #在每個worker而不是master中加載應(yīng)用 socket = /test/myapp.sock #指定socket文件,也可以指定為127.0.0.1:9000,這樣就會監(jiān)聽到網(wǎng)絡(luò)套接字 processes = 2 #啟動2個工作進(jìn)程,生成指定數(shù)目的worker/進(jìn)程 buffer-size = 32768 #設(shè)置用于uwsgi包解析的內(nèi)部緩存區(qū)大小為64k。默認(rèn)是4k。 daemonize = /var/log/myapp_uwsgi.log # 使進(jìn)程在后臺運(yùn)行,并將日志打到指定的日志文件或者udp服務(wù)器 log-maxsize = 5000000 #設(shè)置最大日志文件大小 disable-logging = true #禁用請求日志記錄 vacuum = true #當(dāng)服務(wù)器退出的時候自動刪除unix socket文件和pid文件。 listen = 120 #設(shè)置socket的監(jiān)聽隊(duì)列大?。J(rèn):100) pidfile = /var/run/uwsgi.pid #指定pid文件 enable-threads = true #允許用內(nèi)嵌的語言啟動線程。這將允許你在app程序中產(chǎn)生一個子線程 reload-mercy = 8 #設(shè)置在平滑的重啟(直到接收到的請求處理完才重啟)一個工作子進(jìn)程中,等待這個工作結(jié)束的最長秒數(shù)。這個配置會使在平滑地重啟工作子進(jìn)程中,如果工作進(jìn)程結(jié)束時間超過了8秒就會被強(qiáng)行結(jié)束(忽略之前已經(jīng)接收到的請求而直接結(jié)束) max-requests = 5000 #為每個工作進(jìn)程設(shè)置請求數(shù)的上限。當(dāng)一個工作進(jìn)程處理的請求數(shù)達(dá)到這個值,那么該工作進(jìn)程就會被回收重用(重啟)。你可以使用這個選項(xiàng)來默默地對抗內(nèi)存泄漏 limit-as = 256 #通過使用POSIX/UNIX的setrlimit()函數(shù)來限制每個uWSGI進(jìn)程的虛擬內(nèi)存使用數(shù)。這個配置會限制uWSGI的進(jìn)程占用虛擬內(nèi)存不超過256M。如果虛擬內(nèi)存已經(jīng)達(dá)到256M,并繼續(xù)申請?zhí)摂M內(nèi)存則會使程序報內(nèi)存錯誤,本次的http請求將返回500錯誤。 harakiri = 60 #一個請求花費(fèi)的時間超過了這個harakiri超時時間,那么這個請求都會被丟棄,并且當(dāng)前處理這個請求的工作進(jìn)程會被回收再利用(即重啟)
nginx配置
安裝nginx
#安裝nginx sudo apt install nginx #測試是否安裝成功 sudo /etc/init.d/nginx start #訪問域名或地址,出現(xiàn)歡迎界面 #重啟 sudo /etc/init.d/nginx restart #重載 sudo /etc/init.d/nginx reload #停止 sudo /etc/init.d/nginx stop
配置文件
在在前面自定義的 script 目錄下創(chuàng)建blogzjl_nginx.conf(文件名以nginx結(jié)尾),同時做一個軟連接,把此文件生成一個快捷方式到/etc/nginx/site-enabled/目錄下
#nginx ifconfig_file server { # 監(jiān)聽端口 listen 80; # 服務(wù)器的域名 或ip server_name .blogzjl.site; # substitute your machine's IP address or FQDN charset utf-8; #存放日志文件 access_log /var/log/nginx/blogzjl_access.log; #error_log /var/log/nginx/blogzjl_error.log error; gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支持壓縮的類型 # 最大上傳 client_max_body_size 75M; # Django 媒體相關(guān)文件 # location /media { # alias /; # your Django project's media files - amend as required # } #Django 靜態(tài)相關(guān)文件 location /static/ { alias /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static/; # your Django project's static files - amend as required #index index.html index.htm; expires 30d; } # 所有非媒體、靜態(tài)相關(guān)通過uwsgi 交給Django服務(wù)器 處理 location / { include uwsgi_params; # the uwsgi_params file you installed uwsgi_read_timeout 60; uwsgi_send_timeout 60; uwsgi_pass unix:/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock; } }
創(chuàng)建軟連接
ln -s /home/zjl/sites/blogzjl.site/blogzjl/script/blogzjl_nginx.conf /etc/nginx/site-enabled # ln -s 源文件絕對 目標(biāo)文件絕對路徑 #到 /etc/nginx/site-enabled/ 目錄下將 default 文件刪除防止其覆蓋 blogzjl_nginx.conf 中的配置
啟動 nginx 和 uwsgi
在啟動前最好查看端口號,將相關(guān)進(jìn)程關(guān)掉
#查看端口 netstat -nultp #關(guān)掉相關(guān)進(jìn)程,最好關(guān)徹底,相關(guān)端口被占用的都關(guān)掉,或自行換一個端口 killall -9 uwsgi killall -9 nginx #對于還沒有關(guān)掉的 kill -9 進(jìn)程號
最后啟動 uwsgi 和 nginx
#在項(xiàng)目目錄下執(zhí)行 #啟動uwsgi uwsgi --ini ../script/blogzjl-uwsgi.ini #啟動nginx /etc/init.d/nginx start
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動靜分離
- 解決nginx+uwsgi部署Django的所有問題(小結(jié))
- Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署的方法
- 詳解Django+Uwsgi+Nginx的生產(chǎn)環(huán)境部署
- nginx+uwsgi啟動Django項(xiàng)目的詳細(xì)步驟
- 詳解Django+Uwsgi+Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署
- Centos部署django服務(wù)nginx+uwsgi的方法
- Nginx+Uwsgi+Django 項(xiàng)目部署到服務(wù)器的思路詳解
- centos7下基于nginx+uwsgi部署Django項(xiàng)目的實(shí)現(xiàn)
相關(guān)文章
Python RuntimeWarning:invalid value encounter
這篇文章主要介紹了Python RuntimeWarning:invalid value encountered in double_scalars處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06pyqt彈出新對話框,以及關(guān)閉對話框獲取數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇pyqt彈出新對話框,以及關(guān)閉對話框獲取數(shù)據(jù)的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python字符串、整數(shù)、和浮點(diǎn)型數(shù)相互轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇Python字符串、整數(shù)、和浮點(diǎn)型數(shù)相互轉(zhuǎn)換實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Python Pandas中的shift()函數(shù)實(shí)現(xiàn)數(shù)據(jù)完美平移應(yīng)用場景探究
shift()?是 Pandas 中一個常用的數(shù)據(jù)處理函數(shù),它用于對數(shù)據(jù)進(jìn)行移動或偏移操作,常用于時間序列數(shù)據(jù)或需要計(jì)算前后差值的情況,本文將詳細(xì)介紹?shift()?函數(shù)的用法,包括語法、參數(shù)、示例以及常見應(yīng)用場景2024-01-01在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程
這篇文章主要介紹了在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04Django Admin后臺添加數(shù)據(jù)庫視圖過程解析
這篇文章主要介紹了Django Admin后臺添加數(shù)據(jù)庫視圖過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04