部署環(huán)境要求
1、centos7 64位(CentOS Linux release 7.5.1804 (Core))
2墓怀、Python2.7 (系統(tǒng)自帶了)和Python3.6.5
3尾膊、Mysql == 5.7.18
4意鲸、Django==2.0.1
5廓鞠、mysqlclient==1.3.12
6口四、uWSGI==2.0.15
7魁瞪、nignx==1.13.7
為了降低出現(xiàn)bug的機(jī)會穆律,請盡量使用的一樣的環(huán)境
安裝好系統(tǒng)后可以使用如下命令將系統(tǒng)更新到最新
sudo yum update
sudo yum upgrade
安裝原理
- 首先客戶端請求服務(wù)資源,
- nginx作為直接對外的服務(wù)接口,接收到客戶端發(fā)送過來的http請求,會解包导俘、分析峦耘,
- 如果是靜態(tài)文件請求就根據(jù)nginx配置的靜態(tài)文件目錄,返回請求的資源旅薄,
- 如果是動態(tài)的請求,nginx就通過配置文件,將請求傳遞給uWSGI辅髓;uWSGI 將接收到的包進(jìn)行處理,并轉(zhuǎn)發(fā)給wsgi,
- wsgi根據(jù)請求調(diào)用django工程的某個文件或函數(shù)洛口,處理完后django將返回值交給wsgi矫付,
- wsgi將返回值進(jìn)行打包,轉(zhuǎn)發(fā)給uWSGI第焰,
- uWSGI接收后轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)买优。
注:不同的組件之間傳遞信息涉及到數(shù)據(jù)格式和協(xié)議的轉(zhuǎn)換
作用:
- 第一級的nginx并不是必須的,uwsgi完全可以完成整個的和瀏覽器交互的流程挺举;
- 在nginx上加上安全性或其他的限制杀赢,可以達(dá)到保護(hù)程序的作用;
- uWSGI本身是內(nèi)網(wǎng)接口豹悬,開啟多個work和processes可能也不夠用葵陵,而nginx可以代理多臺uWSGI完成uWSGI的負(fù)載均衡;
- django在debug=False下對靜態(tài)文件的處理能力不是很好瞻佛,而用nginx來處理更加高效脱篙。
進(jìn)入正題,一行命令伤柄,一行注釋绊困,使用root身份登錄系統(tǒng)執(zhí)行
1、安裝各類基礎(chǔ)模塊
yum -y install gcc-c++(為centos系統(tǒng)增加編譯功能)
yum -y install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mariadb-devel
(安裝這些模塊都是為了成功編譯安裝python3适刀,防止出現(xiàn)各種異常)
yum install libxml* (安裝這個模塊是為了讓uwsig支持使用“-x"選項秤朗,能通過xml文件啟動項目)
2、編譯安裝python3
進(jìn)入home路徑(本人喜歡把東西都下載到這里),執(zhí)行以下命令:
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
下載完成后笔喉,執(zhí)行解壓命令:
tar -zxvf Python-3.6.5.tgz
進(jìn)入解壓后的Python-3.6.5文件夾取视,依次執(zhí)行以下命令
./configure --prefix=/usr/local/python3
(將python3安裝到/usr/local/python3/路徑下)
make -j2 (此選項用于開啟多少內(nèi)核編譯,用于提高效率)
make install -j2 (此選項用于開啟多少內(nèi)核安裝常挚,用于提高效率)
mv /usr/bin/python /usr/bin/python.bak(備份python2的連接)
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3(以上兩個ln命令是為了方便在終端中直接使用python3和pip3命令)
pip3 install --upgrade pip(升級pip)
最后修改yum對python2的配置:
vim /usr/bin/yum
將#! /usr/bin/python修改為#! /usr/bin/python2
vim /usr/libexec/urlgrabber-ext-down
將#! /usr/bin/python 也要修改為#! /usr/bin/python2
這樣python 2.X和3.X便同時存在了作谭,并且以3為主!
3奄毡、安裝Virtualenv
3.1 安裝virtualenv
pip3 install virtualenv
3.2 使用python3指定虛擬目錄
如果您有數(shù)據(jù)盤折欠,那么建議您創(chuàng)建到數(shù)據(jù)盤中(linux數(shù)據(jù)盤重新掛載教程),本次教程使用的目錄為: /var/www/目錄下
cd /var/www/ #進(jìn)入到 /var/www/ 中
virtualenv -p /usr/bin/python gdcj #指定python3創(chuàng)建虛擬目錄gdcj
如果python位置不同可以使用吼过,下面的命令锐秦,查找python的位置
which python
which python3
3.3 配置程序需求環(huán)境
使用命令進(jìn)入虛擬目錄,然后安裝項目配置環(huán)境盗忱。
cd /var/www/gdjcj #gdcj為python3創(chuàng)建虛擬目錄
source bin/activate #激活虛擬目錄
pip3 install -r requirements.txt # 安裝原項目的環(huán)境配置
注:以下內(nèi)容未申明退出虛擬目錄酱床,均在虛擬目錄中運(yùn)行。如遇到權(quán)限不夠趟佃,請在命令前加上sudo
注意:我在安裝時出現(xiàn)了如下的錯誤提示:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-97z4efug/mysqlclient/
4斤葱、M(MariaDB)
首先安裝數(shù)據(jù)庫M,但是需要注意下的是慷垮,CentOS 6之前的版本中提供了MySQL安裝包,但是在CentOS 7.X已經(jīng)用MariaDB替代了MySQL揍堕。而MariaDB實際上是MySQL的一個分支,所以MariaDB完全兼容MySQL汤纸,包括API和命令行衩茸,所以這里的LNMP的M是就是MariaDB:
yum install mariadb mariadb-server -y
yum install MySQL-python -y
注意這里使用的是yum不是pip,-y表示直接下載完成后直接安裝贮泞。
安裝完畢后對數(shù)據(jù)庫進(jìn)行初始化:
systemctl start mariadb.service
mysql_secure_installation
mysql -uroot -p密碼
create database mysite;
exit
systemctl enable mariadb.service
第一行表示啟動mariadb服務(wù)楞慈,第二行表示進(jìn)入初始化(可以設(shè)置管理員密碼),第三行表示用的root賬號和設(shè)置的密碼登錄啃擦,第四行則是創(chuàng)建一個名為mysite的數(shù)據(jù)庫囊蓝。第五行是將mariadb服務(wù)加入到自啟動。
5令蛉、安裝uWSGI
不要在虛擬環(huán)境中安裝uWSGI
聚霜,
5.1、安裝:
pip install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
5.2珠叔、測試uWSGI:
新建文件test.py蝎宇,寫入以下內(nèi)容
def application(env, start_response):
start_response('200 OK',[('Content-Type', 'text/html')])
#return ['Hello world'] # Python2
return [b'Hello world'] # Python3[root@localhost pro]#
5.3、運(yùn)行
sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
5.4祷安、調(diào)試
如果端口占用姥芥,使用
lsof -i :80001
列出占用端口的程序的pid號,并使用以下命令殺掉所有占用端口的程序
sudo kill -9 pid1
#如果使用pid文件
sudo uwsgi --stop uwsgi.pid
然后瀏覽 http://127.0.0.1:8000(或http://內(nèi)網(wǎng)ip:8000汇鞭、或http://外網(wǎng)ip:8000)查看效果凉唐,有”Hello World”輸出即安裝成功。
5.5霍骄、使用uwsgi測試項目
nginx并不是必須的台囱,uwsgi完全可以完成整個的和瀏覽器交互的流程,請參見【uWSGI+django+nginx的工作原理流程與部署歷程】[1]腕巡,我們可以直接使用uwsgi對項目進(jìn)行測試玄坦。在項目目錄下生成uwsgi.ini配置文件,如下
# 這句代碼必須加上
[uwsgi]
#使用nginx連接時使用
#socket=127.0.0.1:9090
#直接做web服務(wù)器使用
http=0.0.0.0:8080
#項目目錄
chdir=/home/www/gdcj
#項目中wsgi.py文件的目錄绘沉,相對于項目目錄
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
在項目中的settings.py文件中將服務(wù)器的ip添加
到ALLOWED_HOSTS 配置項中
啟動
uwsgi --ini uwsgi.ini
其它命令[2]
uwsgi --reload uwsgi.pid # 重啟
uwsgi --stop uwsgi.pid # 關(guān)閉
此時使用在瀏覽器中輸入http://服務(wù)器ip:8080即可看到項目的輸出煎楣,說明配置已經(jīng)成功。
6车伞、安裝nginx
由于新裝的centos7中沒有nginx的鏡像源(參見centos yum 沒有可用軟件包 nginx择懂。),因為nginx位于第三方的yum源里面另玖,而不在centos官方y(tǒng)um源里面困曙。解決辦法如下:
yum install epel-release -y
yum update
yum install nginx -y
同時通過命令將其改開機(jī)啟動:
systemctl start nginx
6.1表伦、建立工程單獨(dú)的nginx配置文件
首先確認(rèn)自己準(zhǔn)確的知道nginx的默認(rèn)配置文件目錄(nginx.conf)的路徑,如果不清楚慷丽,請使用如下命令獲取:
nginx -t
大概會列出以下類似信息:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
里面說明了nginx默認(rèn)配置文件的路徑是:/etc/nginx/nginx.conf蹦哼;
6.2、確保nginx.conf的同目錄下有uwsgi_params文件
如:/etc/nginx/uwsgi_params要糊,沒有的話根據(jù)鏈接獲取纲熏, 后面要用到。
6.3锄俄、建立自己的nginx配置文件
自己的工程目錄下局劲,建立如gdcj.conf(/home/www/gdcj/gdcj.conf)的配置文件;復(fù)制nginx.conf里面全部的內(nèi)容奶赠,全部寫入destiny.conf中鱼填。
然后按照下面寫的,把destiny.conf配置文件中的server段部分全部替換掉毅戈。
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /home/www/gdcj/nginx_access.log;
error_log /home/www/gdcj/nginx_error.log;
client_max_body_size 75M;
location /static {
alias /wwwroot/destiny/destiny/static;
}
location / {
include /etc/nginx/conf/uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
}
}
其中的 listen 80代表服務(wù)器開放80端口苹丸;
location [目錄名]代表項目路徑的引導(dǎo);
access_log 和error_log是定義nginx訪問日志和錯誤日志的存放路徑。
“l(fā)ocation /static”中的”/static”是自己定義的項目引用靜態(tài)文件時竹祷,瀏覽器中顯示的靜態(tài)資源所在的根目錄名;這樣的話谈跛,用戶在瀏覽器中查看到的所有image、css或js資源都是處在http://127.0.0.1/static下的塑陵。
django靜態(tài)文件的絕對路徑是根據(jù)自己的實際情況來確定的感憾,一般在自己的django的app名/static目錄下,或自己python manage.py collectstatic后的路徑下。本教程的是在/home/www/gdcj/static根目錄下令花。
“l(fā)ocation /”是指訪問項目根目錄時阻桅,nginx要做的事。其中需要指定 uwsgi_params文件的絕對路徑兼都,上面已經(jīng)提到了嫂沉;如果還有media文件之類的靜態(tài)目錄,仿照static的寫法扮碧,自己補(bǔ)充趟章。
127.0.0.1:9090是指uWSGI綁定的監(jiān)聽地址,這里使用了9090端口慎王。所以我們要將在測試uwsgi時使用的uwsgi.ini文件修改如下:
# 這句代碼必須加上
[uwsgi]
#使用nginx連接時使用
socket=127.0.0.1:9090
#直接做web服務(wù)器使用
#http=0.0.0.0:8080
#項目目錄
chdir=/home/www/gdcj
#項目中wsgi.py文件的目錄蚓土,相對于項目目錄
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
6.4、更改靜態(tài)目錄權(quán)限歸屬者
需要注意的是赖淤,請確認(rèn)自己django的靜態(tài)文件目錄所有者是www用戶(如果不會建立請看第7步)蜀漆,如果不是,請用以下命令更改靜態(tài)目錄權(quán)限歸屬者:
sudo chown -R www:www /home/www/gdcj/static
6.5咱旱、nginx的一些操作(可以不看)[3]
6.5.1确丢、啟動
啟動代碼格式:nginx安裝目錄地址 -c nginx配置文件地址
例如:
nginx -c /home/www/gdcj/gdcj.conf
6.5.2绷耍、停止
1、查看進(jìn)程號
ps -ef|grep nginx
2鲜侥、殺死進(jìn)程
kill -QUIT 進(jìn)程id
6.5.3褂始、重啟
1、驗證nginx配置文件是否正確
nginx -t -c /home/www/gdcj/gdcj.conf
看到如下顯示gdcj.conf syntax is ok
gdcj.conf test is successful
說明配置文件正確描函!
2病袄、重啟Nginx服務(wù)
nginx -s reload
7、centos下配置用戶及用戶組權(quán)限[4]
groupadd www
useradd --shell /sbin/nologin -g www www
8赘阀、啟動uwsgi和nginx
8.1、啟動uWSGI
sudo uwsgi --ini /home/www/gdcj/gdcj.ini
8.2脑奠、啟動nginx
在這之前基公,我們要先去nginx配置文件的根目錄拷貝mime.types(/etc/nginx/mime.types)到工程目錄(/home/www/gdcj/mime.types),和gdcj.conf放在一起宋欺。
否則用配置文件啟動nginx會報錯:
nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)1
當(dāng)然轰豆,如果不想拷貝mime.types文件,也可以將配置文件中“include mime.types;”一項齿诞,改成絕對路徑“include /etc/nginx/mime.types;”
如果nginx已經(jīng)開啟酸休,先關(guān)閉nginx(service nginx stop或nginx -s stop),再執(zhí)行以下命令:
nginx -c /home/www/gdcj/gdcj.conf
這里的-c 表示加載配置文件啟動
9祷杈、理一下路徑
工程路徑: /home/www/gdcj
工程靜態(tài)文件路徑: /home/www/gdcj/static
wsgi.py的路徑: /home/www/gdcj/gdcj/wsgi.py
uwsgi.ini的路徑: /home/www/gdcj/uwsgi.ini
uwsgi日志路徑: /home/www/gdcj/uwsgi.log
destiny.conf的路徑: /home/www/gdcj/gdcj.conf
uwsgi_params的路徑: /etc/nginx/uwsgi_params
nginx訪問日志路徑: /home/www/gdcj/nginx_access.log
nginx錯誤日志路徑: /home/www/gdcj/nginx_error.log
幾乎把所有有關(guān)工程的配置文件和日志文件都放在工程目錄下了斑司,方便后期維護(hù)與查錯。