初學(xué)者的django+uwsgi+nginx部署教程

部署環(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)換

作用:

  1. 第一級的nginx并不是必須的,uwsgi完全可以完成整個的和瀏覽器交互的流程挺举;
  2. 在nginx上加上安全性或其他的限制杀赢,可以達(dá)到保護(hù)程序的作用;
  3. uWSGI本身是內(nèi)網(wǎng)接口豹悬,開啟多個work和processes可能也不夠用葵陵,而nginx可以代理多臺uWSGI完成uWSGI的負(fù)載均衡;
  4. 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ù)與查錯。


  1. https://blog.csdn.net/c465869935/article/details/53242126 ?

  2. (http://www.reibang.com/p/c3b13b5ad3d7) ?

  3. (https://www.cnblogs.com/codingcloud/p/5095066.html) ?

  4. (https://blog.csdn.net/chaishen10000/article/details/46897901) ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但汞,一起剝皮案震驚了整個濱河市宿刮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌私蕾,老刑警劉巖僵缺,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異踩叭,居然都是意外死亡磕潮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門容贝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來自脯,“玉大人,你說我怎么就攤上這事嗤疯≡┙瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵茂缚,是天一觀的道長戏罢。 經(jīng)常有香客問我屋谭,道長,這世上最難降的妖魔是什么龟糕? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任桐磁,我火速辦了婚禮,結(jié)果婚禮上讲岁,老公的妹妹穿的比我還像新娘我擂。我一直安慰自己,他們只是感情好缓艳,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布校摩。 她就那樣靜靜地躺著,像睡著了一般阶淘。 火紅的嫁衣襯著肌膚如雪衙吩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天溪窒,我揣著相機(jī)與錄音坤塞,去河邊找鬼。 笑死澈蚌,一個胖子當(dāng)著我的面吹牛摹芙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宛瞄,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼浮禾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坛悉?” 一聲冷哼從身側(cè)響起伐厌,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裸影,沒想到半個月后挣轨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轩猩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年卷扮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片均践。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡晤锹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彤委,到底是詐尸還是另有隱情鞭铆,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布焦影,位于F島的核電站车遂,受9級特大地震影響封断,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舶担,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一坡疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衣陶,春花似錦柄瑰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至译断,卻和暖如春详囤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镐作。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留隆箩,地道東北人该贾。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像捌臊,于是被迫代替她去往敵國和親杨蛋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容