1、新建獨立運行環(huán)境,命名為env
[root@vultr ~]# mkdir projects # 測試的項目總目錄
[root@vultr ~]# pip3 install virtualenv
[root@vultr ~]# cd projects
[root@vultr projects]# virtualenv env --python=python3 --no-site-packages
--python:指定Python版本
--no-site-packages:不復制系統(tǒng)已安裝Python包
2、激活虛擬環(huán)境
[root@vultr projects]# source env/bin/activate
執(zhí)行后命令提示符前面會出現(xiàn)一個env,變成(env)[root@vultr opt]#,退出虛擬環(huán)境執(zhí)行deactivate即可。
3、安裝項目依賴:
pip3 install, 在虛擬環(huán)境中安裝的包,不會對系統(tǒng)環(huán)境造成影響。
Django項目配置
1、上傳Django項目: Hello項目
目錄結(jié)構(gòu):
Hello/
apps/
Hello/
manage.py
2、配置項目的數(shù)據(jù)庫信息:vi Hello/Hello/settings.py
如果是遠程服務(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啟動項目,看是否正常運行
(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、命令行運行測試
在 項目目錄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)建項目時生成的文件
如果訪問URL正常,說明Python虛擬環(huán)境和uWSGI沒有問題.
3、使用ini配置文件來啟動uWSGI
我習慣性創(chuàng)建projects目錄,目錄結(jié)構(gòu)如下:
/root/projects/
script/ --> 存放uWSGI相關(guān)的文件,例如uwsgi.ini, uwsgi.pid...
Hello/ --> 項目目錄
apps/ --> 應(yīng)用程序目錄
Hello/ --> settings.py等文件所在目錄
static/
env/ --> 虛擬環(huán)境目錄
[root@vultr projects]# vi script/uwsgi.ini
[uwsgi]
# 項目目錄
chdir=/root/projects/Hello/
# 虛擬環(huán)境目錄
home=/root/projects/env/
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 指定項目的application
module=Hello.wsgi:application
# 指定sock的文件路徑
socket=/root/projects/script/uwsgi.sock
# 啟用主進程
master=true
# 進程個數(shù)
workers=5
pidfile=/root/projects/script/uwsgi.pid
# 自動移除unix Socket和pid文件當服務(wù)停止的時候
vacuum=true
# 序列化接受的內(nèi)容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設(shè)置自中斷時間
harakiri=30
# 設(shè)置緩沖
post-buffering=4096
# 設(shè)置日志目錄
daemonize=/root/projects/script/uwsgi.log
4、后臺啟動停止uWSGI的命令
[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 啟動
[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)的版本,可以通過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? # 名字是隨便起的,建議跟項目目錄一樣
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;
# 指定項目路徑uwsgi
location / {
include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊
uwsgi_connect_timeout 30; # 超時時間
uwsgi_pass unix:/root/projects/script/uwsgi.sock;
}
# 指定靜態(tài)文件路徑
location /static/ {
alias /root/projects/Hello/static/;
index index.html index.htm;
}
}
4、啟動與停止Nginx
檢查uWSGI是否啟動了
[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
啟動Nginx
[root@vultr projects]# /etc/init.d/nginx start
訪問URL,見證奇跡的時刻到了,然后...
ok,報錯了,莫慌。度娘查了502是服務(wù)器錯誤,然而前面測試了Django+uWSGI沒問題,所以最有可能是在Nginx出錯了。
來,我們查看一下Nginx的錯誤日志文件,日志文件在哪呢???
[root@vultr projects]# find / -name nginx.conf
/etc/nginx/nginx.conf
[root@vultr projects]# vi /etc/nginx/nginx.conf
error_log參數(shù)就是錯誤日志文件了,讓我們再打開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 可以看出是沒有權(quán)限???原因是我貪圖方便, 直接把項目文件以及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)于路徑的都修改過來,修改好后,再次啟動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
正在啟動 nginx:?????????????????????????????????????????? [確定]
再次訪問URL, 訪問正常。
多項目部署
利用virtualenv可以在服務(wù)器上配置多個Python運行環(huán)境,因此根據(jù)Nginx、uWSGI、virtualenv可以實現(xiàn)一個服務(wù)器上運行多個項目,且互不干擾。
首先我們先來了解一下Nginx+uWSGI通信原理。
請求首先交給Nginx,如果是靜態(tài)內(nèi)容Nginx就直接處理了,如果是動態(tài)內(nèi)容就將請求交給uWSGI服務(wù)器,Nginx和uWSGI之間是通過Socket來通信的,通信協(xié)議就是/etc/nginx/conf.d/Hello.conf里配置的uwsgi_params文件。
那么,現(xiàn)在我們來梳理一下,Nginx是怎么知道uWSGI在哪里?通過什么和uWSGI做Socket通信,回看/etc/nginx/conf.d/Hello.conf文件:
原來是根據(jù)uwsgi_pass指定了Nginx與uWSGI通信的Socket文件路徑,看到這,就知道好辦了,一個項目配置一個uwsgi.ini文件和nginx.conf里的一個server,那既然需要部署多個項目,那就是多個uwsgi.ini和nginx.conf里的多個server。
好的,我們開始測試:
1、配置虛擬環(huán)境以及測試用runserver運行Django項目是否正常。 我的目錄結(jié)構(gòu)是:
opt/
projects/
Hello/ --> 第一個Django項目
env/ --> 第一個Django項目的虛擬環(huán)境
World/ --> 第二個Django項目
env_1/ --> 第二個Django項目的虛擬環(huán)境
script/ --> uwsig.ini等文件存放
2、配置World項目的uwsgi_world.ini文件
[root@vultr projects]# vi script/uwsgi_w.ini
[uwsgi]
# 項目目錄
chdir=/opt/projects/World/
# 虛擬環(huán)境目錄
home=/opt/projects/env_1/
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 指定項目的application
module=World.wsgi:application
# 指定sock的文件路徑
socket=/opt/projects/script/uwsgi_w.sock
# 啟用主進程
master=true
# 進程個數(shù)
workers=5
pidfile=/opt/projects/script/uwsgi_w.pid
# 自動移除unix Socket和pid文件當服務(wù)停止的時候
vacuum=true
# 序列化接受的內(nèi)容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設(shè)置自中斷時間
harakiri=30
# 設(shè)置緩沖
post-buffering=4096
# 設(shè)置日志目錄
daemonize=/opt/projects/script/uwsgi_w.log
3、配置Nginx
# 可以分開多個配置文件,這里我放在同一個配置文件里
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf
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;
# 指定項目路徑uwsgi
location / {
include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊
uwsgi_connect_timeout 30; # 超時時間
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; # 端口,請注意端口
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;
# 指定項目路徑uwsgi
location / {
include uwsgi_params; # 加載nginx和uwsgi的通信協(xié)議模塊
uwsgi_connect_timeout 30; # 超時時間
uwsgi_pass unix:/opt/projects/script/uwsgi_w.sock;
}
# 指定靜態(tài)文件路徑
location /static/ {
alias /opt/projects/World/static/;
index index.html index.htm;
}
}
4、啟動uWSGI和Nginx,訪問兩個端口的URL。 ok,訪問正常。
總結(jié)
以上所述是小編給大家介紹的Python開發(fā)之Nginx+uWSGI+virtualenv多項目部署教程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

