您好,登錄后才能下訂單哦!
這篇文章主要介紹Python開(kāi)發(fā)之Nginx+uWSGI+virtualenv多項(xiàng)目部署的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
1、新建獨(dú)立運(yùn)行環(huán)境,命名為env
[root@vultr ~]# mkdir projects # 測(cè)試的項(xiàng)目總目錄 [root@vultr ~]# pip3 install virtualenv [root@vultr ~]# cd projects [root@vultr projects]# virtualenv env --python=python3 --no-site-packages --python:指定Python版本 --no-site-packages:不復(fù)制系統(tǒng)已安裝Python包
2、激活虛擬環(huán)境
[root@vultr projects]# source env/bin/activate
執(zhí)行后命令提示符前面會(huì)出現(xiàn)一個(gè)env,變成(env)[root@vultr opt]#,退出虛擬環(huán)境執(zhí)行deactivate即可。
3、安裝項(xiàng)目依賴:
pip3 install, 在虛擬環(huán)境中安裝的包,不會(huì)對(duì)系統(tǒng)環(huán)境造成影響。
Django項(xiàng)目配置
1、上傳Django項(xiàng)目: Hello項(xiàng)目
目錄結(jié)構(gòu):
Hello/ apps/ Hello/ manage.py
2、配置項(xiàng)目的數(shù)據(jù)庫(kù)信息:vi Hello/Hello/settings.py
如果是遠(yuǎn)程服務(wù)器,需要修改setting.py文件中的ALLOWED_HOSTS:
ALLOWED_HOSTS = ['*']
3、數(shù)據(jù)遷移
(env)[root@vultr Hello]# python3 manage.py makemigrations
(env)[root@vultr Hello]# python3 manage.py migrate
4、收集靜態(tài)文件:vi Hello/Hello/settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static")
:wq保存后,執(zhí)行
(env)[root@vultr Hello]# python3 manage.py collectstatic --noinput
5、用runserver啟動(dòng)項(xiàng)目,看是否正常運(yùn)行
(env)[root@vultr Hello]# python3 manage.py runserver 0.0.0.0:8088
uWSGI配置
deactivate退出虛擬環(huán)境
1、安裝uWSGI
[root@vultr Hello]# pip3 install uWSGI
2、命令行運(yùn)行測(cè)試
在 項(xiàng)目目錄Hello 下,執(zhí)行以下命令:
[root@vultr Hello]# uwsgi --http ip:端口 --home /root/env/ --file Hello/wsgi.py --static-map=/static=static
--home:指定虛擬環(huán)境的目錄
wsgi.py:Django創(chuàng)建項(xiàng)目時(shí)生成的文件
如果訪問(wèn)URL正常,說(shuō)明Python虛擬環(huán)境和uWSGI沒(méi)有問(wèn)題.
3、使用ini配置文件來(lái)啟動(dòng)uWSGI
我習(xí)慣性創(chuàng)建projects目錄,目錄結(jié)構(gòu)如下:
/root/projects/ script/ --> 存放uWSGI相關(guān)的文件,例如uwsgi.ini, uwsgi.pid... Hello/ --> 項(xiàng)目目錄 apps/ --> 應(yīng)用程序目錄 Hello/ --> settings.py等文件所在目錄 static/ env/ --> 虛擬環(huán)境目錄
[root@vultr projects]# vi script/uwsgi.ini
[uwsgi] # 項(xiàng)目目錄 chdir=/root/projects/Hello/ # 虛擬環(huán)境目錄 home=/root/projects/env/ # 啟動(dòng)uwsgi的用戶名和用戶組 uid=root gid=root # 指定項(xiàng)目的application module=Hello.wsgi:application # 指定sock的文件路徑 socket=/root/projects/script/uwsgi.sock # 啟用主進(jìn)程 master=true # 進(jìn)程個(gè)數(shù) workers=5 pidfile=/root/projects/script/uwsgi.pid # 自動(dòng)移除unix Socket和pid文件當(dāng)服務(wù)停止的時(shí)候 vacuum=true # 序列化接受的內(nèi)容,如果可能的話 thunder-lock=true # 啟用線程 enable-threads=true # 設(shè)置自中斷時(shí)間 harakiri=30 # 設(shè)置緩沖 post-buffering=4096 # 設(shè)置日志目錄 daemonize=/root/projects/script/uwsgi.log
4、后臺(tái)啟動(dòng)停止uWSGI的命令
[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 啟動(dòng) [root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止
Nginx配置
1、 配置yum:
[root@vultr projects]# vi /etc/yum.repos.d/nginx.repo
[nginx] name=nginx repo # 下面這行centos根據(jù)你自己的操作系統(tǒng)修改比如:OS/rehel # 6是你Linux系統(tǒng)的版本,可以通過(guò)URL查看路徑是否正確 baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1
2、 安裝: yum -y install nginx
3、添加配置文件
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf # 名字是隨便起的,建議跟項(xiàng)目目錄一樣
server { listen 84; # 端口 server_name 10.129.205.183 ; # 域名 access_log /var/log/nginx/access.log main; charset utf-8; gzip on; 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; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定項(xiàng)目路徑uwsgi location / { include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊 uwsgi_connect_timeout 30; # 超時(shí)時(shí)間 uwsgi_pass unix:/root/projects/script/uwsgi.sock; } # 指定靜態(tài)文件路徑 location /static/ { alias /root/projects/Hello/static/; index index.html index.htm; } }
4、啟動(dòng)與停止Nginx
檢查uWSGI是否啟動(dòng)了
[root@vultr projects]# ps -ef | grep uwsgi root 2299 1 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2301 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2302 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2303 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2304 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2305 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2306 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini root 2361 2016 0 06:32 pts/1 00:00:00 grep uwsgi
啟動(dòng)Nginx
[root@vultr projects]# /etc/init.d/nginx start
訪問(wèn)URL,見(jiàn)證奇跡的時(shí)刻到了,然后...
ok,報(bào)錯(cuò)了,莫慌。度娘查了502是服務(wù)器錯(cuò)誤,然而前面測(cè)試了Django+uWSGI沒(méi)問(wèn)題,所以最有可能是在Nginx出錯(cuò)了。
來(lái),我們查看一下Nginx的錯(cuò)誤日志文件,日志文件在哪呢???
[root@vultr projects]# find / -name nginx.conf /etc/nginx/nginx.conf [root@vultr projects]# vi /etc/nginx/nginx.conf
error_log參數(shù)就是錯(cuò)誤日志文件了,讓我們?cè)俅蜷_(kāi)error.log文件,找到最后一條記錄:
2019/05/12 06:41:43 [crit] 1514#1514: *2 connect() to unix:/root/projects/script/uwsgi.sock failed (13: Permission denied) while connecting to upstream, ...(后面省略)
從 failed (13: Permission denied) while connecting to upstream 可以看出是沒(méi)有權(quán)限???原因是我貪圖方便, 直接把項(xiàng)目文件以及uWSGI文件放在了/root/目錄下 !!!
好,修改路徑,先停止Nginx和uWSGI,再修改路徑/root/projects/更改為/opt/projects/:
[root@vultr projects]# uwsgi --stop script/uwsgi.pid [root@vultr projects]# /etc/init.d/nginx stop 停止 nginx: [確定] [root@vultr projects]# cd .. [root@vultr ~]# mv projects /opt/ [root@vultr ~]# cd /opt/projects/
然后將script/uwsgi.ini和/etc/nginx/conf.d/Hello.conf中關(guān)于路徑的都修改過(guò)來(lái),修改好后,再次啟動(dòng)uWSGI和Nginx:
[root@vultr projects]# uwsgi --ini script/uwsgi.ini [uWSGI] getting INI configuration from script/uwsgi.ini [root@vultr projects]# /etc/init.d/nginx start
正在啟動(dòng) nginx: [確定]
再次訪問(wèn)URL, 訪問(wèn)正常。
多項(xiàng)目部署
利用virtualenv可以在服務(wù)器上配置多個(gè)Python運(yùn)行環(huán)境,因此根據(jù)Nginx、uWSGI、virtualenv可以實(shí)現(xiàn)一個(gè)服務(wù)器上運(yùn)行多個(gè)項(xiàng)目,且互不干擾。
首先我們先來(lái)了解一下Nginx+uWSGI通信原理。
請(qǐng)求首先交給Nginx,如果是靜態(tài)內(nèi)容Nginx就直接處理了,如果是動(dòng)態(tài)內(nèi)容就將請(qǐng)求交給uWSGI服務(wù)器,Nginx和uWSGI之間是通過(guò)Socket來(lái)通信的,通信協(xié)議就是/etc/nginx/conf.d/Hello.conf里配置的uwsgi_params文件。
那么,現(xiàn)在我們來(lái)梳理一下,Nginx是怎么知道uWSGI在哪里?通過(guò)什么和uWSGI做Socket通信,回看/etc/nginx/conf.d/Hello.conf文件:
原來(lái)是根據(jù)uwsgi_pass指定了Nginx與uWSGI通信的Socket文件路徑,看到這,就知道好辦了,一個(gè)項(xiàng)目配置一個(gè)uwsgi.ini文件和nginx.conf里的一個(gè)server,那既然需要部署多個(gè)項(xiàng)目,那就是多個(gè)uwsgi.ini和nginx.conf里的多個(gè)server。
好的,我們開(kāi)始測(cè)試:
1、配置虛擬環(huán)境以及測(cè)試用runserver運(yùn)行Django項(xiàng)目是否正常。 我的目錄結(jié)構(gòu)是:
opt/ projects/ Hello/ --> 第一個(gè)Django項(xiàng)目 env/ --> 第一個(gè)Django項(xiàng)目的虛擬環(huán)境 World/ --> 第二個(gè)Django項(xiàng)目 env_1/ --> 第二個(gè)Django項(xiàng)目的虛擬環(huán)境 script/ --> uwsig.ini等文件存放
2、配置World項(xiàng)目的uwsgi_world.ini文件
[root@vultr projects]# vi script/uwsgi_w.ini
[uwsgi] # 項(xiàng)目目錄 chdir=/opt/projects/World/ # 虛擬環(huán)境目錄 home=/opt/projects/env_1/ # 啟動(dòng)uwsgi的用戶名和用戶組 uid=root gid=root # 指定項(xiàng)目的application module=World.wsgi:application # 指定sock的文件路徑 socket=/opt/projects/script/uwsgi_w.sock # 啟用主進(jìn)程 master=true # 進(jìn)程個(gè)數(shù) workers=5 pidfile=/opt/projects/script/uwsgi_w.pid # 自動(dòng)移除unix Socket和pid文件當(dāng)服務(wù)停止的時(shí)候 vacuum=true # 序列化接受的內(nèi)容,如果可能的話 thunder-lock=true # 啟用線程 enable-threads=true # 設(shè)置自中斷時(shí)間 harakiri=30 # 設(shè)置緩沖 post-buffering=4096 # 設(shè)置日志目錄 daemonize=/opt/projects/script/uwsgi_w.log
3、配置Nginx
# 可以分開(kāi)多個(gè)配置文件,這里我放在同一個(gè)配置文件里 [root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf server { listen 84; # 端口,請(qǐng)注意端口 server_name 10.129.205.183 ; # 域名 access_log /var/log/nginx/access.log main; charset utf-8; gzip on; 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; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定項(xiàng)目路徑uwsgi location / { include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊 uwsgi_connect_timeout 30; # 超時(shí)時(shí)間 uwsgi_pass unix:/opt/projects/script/uwsgi.sock; } # 指定靜態(tài)文件路徑 location /static/ { alias /opt/projects/Hello/static/; index index.html index.htm; } } server { listen 86; # 端口,請(qǐng)注意端口 server_name 10.129.205.183 ; # 域名 access_log /var/log/nginx/access.log main; charset utf-8; gzip on; 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; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定項(xiàng)目路徑uwsgi location / { include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊 uwsgi_connect_timeout 30; # 超時(shí)時(shí)間 uwsgi_pass unix:/opt/projects/script/uwsgi_w.sock; } # 指定靜態(tài)文件路徑 location /static/ { alias /opt/projects/World/static/; index index.html index.htm; } }
4、啟動(dòng)uWSGI和Nginx,訪問(wèn)兩個(gè)端口的URL。 ok,訪問(wèn)正常。
以上是“Python開(kāi)發(fā)之Nginx+uWSGI+virtualenv多項(xiàng)目部署的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。