一學(xué)就會(huì)的django項(xiàng)目服務(wù)器部署nginx-uwsgi-django/build

一管嬉、前言

需要在阿里云服務(wù)器部署Django-restframework框架,一開始不清楚情況忌愚,網(wǎng)上找了很多的文章和辦法耘纱,東拼西湊也沒有能夠完全實(shí)現(xiàn)nginx和uwsgi的互通。

想學(xué)會(huì)革娄?

你需要找一個(gè)干干凈凈的倾贰、沒有安裝其他東西的Linux服務(wù)器(Centos系統(tǒng))來跟著這篇文章做。

參考過的文章有

-視頻:Nginx + uWsgi 部署 Django + Mezzanine 生產(chǎn)服務(wù)器

-文章:uWSGI+django+nginx的工作原理流程與部署歷程

-文章:uwsgi官方文檔

-文章:Django Nginx+uwsgi 安裝配置

-文章:centos7 下通過nginx+uwsgi部署django應(yīng)用

二拦惋、網(wǎng)上文章的遺漏

因?yàn)槭菛|拼西湊匆浙,所以無論是網(wǎng)上的文章還是自己拼湊的配置,都是沒有辦法打通的厕妖。后來紅包求助首尼,才了解到有這幾個(gè)地方:

1、nginx執(zhí)行權(quán)限

2言秸、uwsgi配置

3软能、uwsgi設(shè)置虛擬環(huán)境

4、uwsgi安裝問題及插件安裝問題

5举畸、django靜態(tài)文件收集處理

三查排、部署安裝記錄

1城榛、創(chuàng)建非管理員賬戶

由于安全需求疚顷,還是配置一個(gè)非管理員(自己操作,增加sudo授權(quán))賬戶操作丧失,通過命令創(chuàng)建用戶名密碼

adduser quinns  # 新增用戶

passwd quinns  # 為quinns設(shè)置密碼

設(shè)置好之后叛买,還需要開啟sudo權(quán)限砂代,通過命令:

vi /etc/sudoers

然后找到有 root ALL=(ALL)那一行,然后在下面增加一行:

quinns ALL=(ALL)  ALL

保存即可率挣。

下面的操作刻伊,用新用戶quinns登錄來操作。

2、安裝依賴

uwsgi和nginx以及anaconda的安裝會(huì)存在一些報(bào)錯(cuò)問題捶箱,這里為了避免出現(xiàn)這情況智什,所以先安裝好依賴。

sudo yum install gcc-c++

sudo yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

sudo yum install uwsgi-plugin-python

sudo yum install libxml*

sudo yum install -y bzip2

sudo yum -y install pcre-devel

sudo yum install python-devel

sudo yum install build-essential python-dev

3讼呢、安裝軟件

通過quinns賬戶登錄撩鹿,然后到quinns用戶目錄(/home/quinns)下新建一個(gè)utils目錄谦炬,把一些軟件下載在utils目錄下悦屏。

3.1安裝anaconda

通過wget方式下載anaconda(官網(wǎng))

wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh

如果想更快,就安裝國內(nèi)源(清華鏡像):

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Linux-x86_64.sh

下載好之后sh安裝

sh Anaconda3-5.0.1-Linux-x86_64.sh

一路默認(rèn)键思,到之后面安裝完的時(shí)候會(huì)提示是否添加環(huán)境變量础爬,輸入yes即可。

如果想要后面使用更快吼鳞,可以更改倉庫鏡像:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

這樣的話安裝軟件都是國內(nèi)源看蚜,速度比較快

3.2驗(yàn)證是anaconda否成功安裝

通過命令:

conda list

來驗(yàn)證是否成功安裝并加入環(huán)境變量,如果出現(xiàn)list列表則代表成功赔桌,如果出現(xiàn)報(bào)錯(cuò)提示信息則需要用命令:

source ~/.bashrc

來添加供炎,然后重復(fù)conda list命令。如果還是不行疾党,則編輯/etc/profile文件音诫,在底部添加環(huán)境變量及指向:

export PATH=/home/quinns/anaconda3/bin:$PATH

通過文件添加的環(huán)境變量需重啟服務(wù)器才能生效

3.3安裝uwsgi

在確認(rèn)安裝好anaconda之后,先不著急新建虛擬環(huán)境雪位,直接在linux下輸入python竭钝,檢查默認(rèn)python是否已自動(dòng)替換為python3.6。接著通過pip安裝uwsgi:

pip install uwsgi

待有安裝成功的提示出來雹洗,再通過命令:

uwsgi --version

來確認(rèn)是否成功安裝香罐。

3.4創(chuàng)建虛擬環(huán)境

通過anaconda來創(chuàng)建python虛擬環(huán)境:

conda create --name envname python=3.6.3

(親身經(jīng)歷 3.6.5無法啟動(dòng)uwsgi,最好還是3.6.3)

觀察過程,無報(bào)錯(cuò)即完成安裝时肿。

3.5安裝nginx

直接通過yum來安裝nginx即可庇茫,如果想安裝新版,可以在網(wǎng)上尋找新方法螃成。

sudo yum install nginx

安裝完成后應(yīng)該是自動(dòng)啟動(dòng)服務(wù)港令,在瀏覽器輸入ip即可訪問nginx的歡迎頁面。如果沒有锈颗,通過命令:

sudo service nginx start/restart

來啟動(dòng)或者重啟nginx服務(wù)顷霹。

3.6安裝mysql

先下載mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

接著安裝mysql-community-release-el7-5.noarch.rpm包

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

安裝這個(gè)包后,會(huì)獲得兩個(gè)mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo击吱,/etc/yum.repos.d/mysql-community-source.repo淋淀。

最后執(zhí)行安裝

sudo yum install mysql-server

3.7重置mysql密碼

先授權(quán)

sudo chown -R root:root /var/lib/mysql

service mysqld restart  # 然后重啟

接著重置密碼

mysql -u root  //直接回車進(jìn)入mysql控制臺(tái)
mysql > use mysql;
mysql > update user set password=password('quinns') where user='root';
mysql > exit;

service mysqld restart  # 然后再重啟一次服務(wù)

3.8開啟遠(yuǎn)程訪問

mysql默認(rèn)是不開啟遠(yuǎn)程訪問的,想要在本地連接服務(wù)器的mysql,必須開啟:

mysql -u root -p

mysql> use mysql;
mysql> update user set host = '%' where user = 'root';

service mysqld restart  # 這里也要重啟一次服務(wù)

(過30秒或者1分鐘再測試遠(yuǎn)程連接)如果不行的話朵纷,接著重啟服務(wù)一次炭臭。

四、uwsgi服務(wù)測試

安裝好這些軟件后袍辞,需要確保獨(dú)立服務(wù)都是正常運(yùn)行的鞋仍。

在/home/quinns目錄下新建wwwroot目錄,然后在里面新建一個(gè)測試文件uwsgitest.py

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World, This uwsgi server is running"]

保存后通過命令來啟動(dòng)

uwsgi --http :8000 --wsgi-file uwsgitest.py

看到服務(wù)啟動(dòng)后搅吁,就可以在瀏覽器訪問8080端口威创,如果能夠正常顯示文字內(nèi)容,則代表uwsgi單獨(dú)服務(wù)是可以正常運(yùn)行的谎懦。如果沒有肚豺,根據(jù)報(bào)錯(cuò)找原因。

五界拦、上傳django-rest項(xiàng)目

可以在本地吸申,通過ssh對服務(wù)器進(jìn)行連接,其中也包括上傳下載服務(wù)享甸。

本地打開終端后輸入:

scp -r djangoName quinns@47.98.xxx.xxx:/home/quinns/wwwroot

將當(dāng)前目錄的djangoName文件夾通過quinns賬戶上傳到/home/quinns/wwwroot目錄內(nèi)截碴。回車執(zhí)行后輸入quinns的密碼即可看到上傳到指定的wwwroot目錄內(nèi)蛉威。

六日丹、配置django

本地開發(fā)環(huán)境下的django和服務(wù)器的設(shè)置有些許不一樣。

首先要開放ALLOWED_HOSTS瓷翻,使得程序可以遠(yuǎn)程訪問聚凹,然后再設(shè)置靜態(tài)文件,最后再通過命令來測試是否可以順利啟動(dòng)齐帚。

開啟drf遠(yuǎn)程訪問及靜態(tài)設(shè)置

找到django項(xiàng)目的settings.py文件妒牙,里面有個(gè)ALLOWED_HOSTS,是接收一個(gè)空列表对妄,現(xiàn)在要將服務(wù)器地址或者域名添加進(jìn)去(也可以放*號湘今,代表所有都可以指向這里,但是不推薦這么做):

ALLOWED_HOSTS = ['47.98.xxx.xxx']

上面就算是開啟了遠(yuǎn)程訪問剪菱,接著設(shè)置靜態(tài)(drf有一些樣式摩瞎,如果不設(shè)置,通過uwsgi啟動(dòng)是無法加載的)孝常。同樣是在settings.py文件中旗们,下部分代碼中有個(gè)STATIC_URL = '/static/',在它下面新增一行:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

保存文件构灸,然后在虛擬環(huán)境下執(zhí)行命令:

python manage.py collectstatic

這樣django就會(huì)收集靜態(tài)文件上渴,放到指定目錄內(nèi),也就是(static目錄內(nèi))

七、編寫uwsgi配置

uwsgi可以通過命令來啟動(dòng)django項(xiàng)目稠氮,也可以通過配置文件ini或者xml來啟動(dòng)曹阔。這里已ini為例。

在項(xiàng)目根目錄(manage.py同目錄隔披,其實(shí)哪個(gè)目錄都可以赃份,這里是方便尋找)新建文件夾conf,然后再在conf下新建uwsgi文件夾(這倆文件夾什么名字無所謂)奢米。接著新建uwsgi的配置文件抓韩,這里暫且叫做lagou_uwsgi.ini 里面寫上uwsgi與項(xiàng)目的配置信息:

ite_uwsgi.ini file`
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    chdir           = /home/quinns/wwwroot/GamesAPI
    # Django's wsgi file
    module          = GamesAPI.wsgi
    # the virtualenv (full path)

    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 4
    threads         = 2
    # the socket (use the full path to be safe
    socket          = 127.0.0.1:8001
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
  virtualenv = /home/quinns/anaconda3/envs/envgames
    python-autoreload=1

    logto = /home/quinns/wwwroot/GamesAPI/uwsgilog.log

    stats = %(chdir)/conf/uwsgi/uwsgi.status
    pidfile = %(chdir)/conf/uwsgi/uwsgi.pid

具體的含義在uwsgi文檔都有,這里記錄一下:

chdir # 項(xiàng)目絕對路徑

module  # 項(xiàng)目內(nèi)的uwsgi.py文件恃慧,其實(shí)與項(xiàng)目同名即可

master

processes

threads

socket # 服務(wù)啟動(dòng)地址及端口

vacuum

virtualenv # 這個(gè)就很重要了园蝠,python虛擬環(huán)境地址

python-autoreload=1 # python自啟動(dòng)

logto # 自動(dòng)生成日志文件及存放路徑

stats

pidfile

這就算是編寫好uwsgi的配置文件了渺蒿,接著編寫nginx的配置痢士。

八、單項(xiàng)目nginx配置

最好不要改動(dòng)原有的ningx茂装,來新建一個(gè)新的.conf配置文件吧怠蹂。同樣在項(xiàng)目目錄的conf目錄內(nèi)新建nginx文件夾,然后再在nginx文件夾里新建lagou.conf配置文件少态,里面寫上nginx的配置:

upstream games {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # uwsgi的端口
}
# configuration of the server

error_log  /home/quinns/wwwroot/nginxerror.log;#錯(cuò)誤日志
server {
# the port your site will be served on
listen      8080;
# 端口
server_name 47.98.xxx.xxx ; # 服務(wù)器ip或者域名
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste


# Django media
location /media  {
    alias  /home/quinns/wwwroot/GamesAPI/media;  # 指向django的media目錄
}

# Django static
location /static  {
    alias  /home/quinns/wwwroot/GamesAPI/static;  # 指向django的static目錄
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  games;
    include     uwsgi_params; # uwsgi服務(wù)
}
}

里面都有說明了城侧,我就不寫了。其的upstream games中的games是自定義名稱彼妻,但是要與下面的uwsgi_pass games中g(shù)ames名稱相同嫌佑。

注意: .conf文件建立好后,要與讓nginx知道并承認(rèn)侨歉,所以需要通過軟連接來鏈接到/etc/nginx/conf.d/目錄下屋摇,如果不知道軟連接怎么做,可以把這個(gè)文件copy到這個(gè)目錄下幽邓。

然后重啟服務(wù)器

sudo service nginx restart

如果沒有報(bào)錯(cuò)炮温,應(yīng)該就是可以了。

如果有報(bào)錯(cuò)牵舵,沒有重啟ng服務(wù)器柒啤,那肯定是配置文件寫錯(cuò)了,得去看一下畸颅。

九担巩、啟動(dòng)項(xiàng)目

既然uwsgi也配置好了,django項(xiàng)目的虛擬環(huán)境也pip install -r requirements.txt過了没炒,ng的配置文件也寫好了涛癌。那就可以啟動(dòng)服務(wù)了。

nginx的服務(wù)啟停

通過linux命令來進(jìn)行啟停

sudo service nginx restart/start/stop

如果之前啟動(dòng)過,就不用重啟了祖很。

uwsgi啟動(dòng)項(xiàng)目

找到剛才編寫的lagou_uwsgi.ini配置文件目錄笛丙,通過命令來啟動(dòng):

uwsgi -i lagou_uwsgi.init &

如果沒有報(bào)錯(cuò),就代表啟動(dòng)了假颇。就可以在瀏覽器訪問之前.conf配置文件配置的8080端口了胚鸯。

十、nginx配置靜態(tài)

后端api沒有問題后笨鸡,前端也要部署姜钳。

前端通過npm run build打包之后,將build文件通過ssh上傳到wwwroot目錄下:

scp -r build quinns@xx.xx.xx.xx:/home/quinns/wwwroot

等到上傳完成后形耗,就到nginx那里進(jìn)行靜態(tài)的部屬配置

cd /etc/nginx

然后打開nginx.conf文件進(jìn)行編輯哥桥。

首先要給nginx文件進(jìn)行訪問授權(quán),否則有些目錄是會(huì)報(bào)錯(cuò)403的激涤。其配置文件中有:

user nginx;

這里得給他改成用戶的權(quán)限拟糕,如quinns或者root

user quinns;

看到server部分的代碼:

server {
    listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }
……
    ……
}

是這樣的,訪問網(wǎng)址80端口默認(rèn)指向/usr/share/nginx/html目錄下的index.html

因?yàn)殪o態(tài)打包后build也是由index.html來作為主入口的倦踢。所以這里只需要把root的指向改過來即可:

server {
    listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        #root         /usr/share/nginx/html;
        root          /home/quinns/wwwroot/build;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }
……
    ……
}

將原來的root指向注釋掉送滞,增加build文件夾的指向

然后重啟nginx服務(wù),打開瀏覽器訪問辱挥,就可以看正常的頁面了犁嗅。

心中一陣竊喜,這個(gè)坑終于是填上了晤碘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褂微,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子园爷,更是在濱河造成了極大的恐慌宠蚂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腮介,死亡現(xiàn)場離奇詭異肥矢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叠洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門甘改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灭抑,你說我怎么就攤上這事十艾。” “怎么了腾节?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵忘嫉,是天一觀的道長荤牍。 經(jīng)常有香客問我,道長庆冕,這世上最難降的妖魔是什么康吵? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮访递,結(jié)果婚禮上晦嵌,老公的妹妹穿的比我還像新娘。我一直安慰自己拷姿,他們只是感情好惭载,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著响巢,像睡著了一般描滔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪古,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天含长,我揣著相機(jī)與錄音,去河邊找鬼灾炭。 笑死茎芋,一個(gè)胖子當(dāng)著我的面吹牛颅眶,可吹牛的內(nèi)容都是我干的蜈出。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涛酗,長吁一口氣:“原來是場噩夢啊……” “哼铡原!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起商叹,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤燕刻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剖笙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卵洗,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年弥咪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了过蹂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聚至,死狀恐怖酷勺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扳躬,我是刑警寧澤脆诉,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布甚亭,位于F島的核電站,受9級特大地震影響击胜,放射性物質(zhì)發(fā)生泄漏亏狰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一偶摔、第九天 我趴在偏房一處隱蔽的房頂上張望骚揍。 院中可真熱鬧,春花似錦啰挪、人聲如沸信不。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抽活。三九已至,卻和暖如春锰什,著一層夾襖步出監(jiān)牢的瞬間下硕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工汁胆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梭姓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓嫩码,卻偏偏與公主長得像誉尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子铸题,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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