Ubuntu16.04+python3+django1.11+uWSGI+nginx部署django項目
相信很多的小伙伴都和我遇到過同樣的問題,我們學(xué)習(xí)django后寫好項目后把代碼放到服務(wù)器上肯定不能使用django自帶的服務(wù)器給用戶來使用我們的網(wǎng)站呀,因為django自帶的服務(wù)器性能有限所以我們在真正部署的時候是不用它的,那怎么辦呢遥金?不用擔(dān)心我教大家使用nginx服務(wù)器來解決這個問題。
nginx
nginx是什么東西,就是和Apache办成,Tomcat類似的一款服務(wù)器軟件,如果你真的不知道這是什么鬼東西那就真的沒得必要往下面看了搂漠,建議先去弄弄清楚這個軟件是什么東西迂卢,再回過來看就行了。上百度,谷歌搜一搜就好了而克,其實很簡單的靶壮。
uWSGI
其實著也是一個服務(wù)器軟件啦,下面我提供了一個大佬寫的文章快去學(xué)習(xí)學(xué)習(xí)了员萍。
https://blog.csdn.net/mnszmlcd/article/details/78819237
搭建的原理示意圖
我們的目的肯定是是打通瀏覽器訪問我們django代碼的通道腾降,首先著條通道上我們要修建兩座橋梁,首先是nginx碎绎,這是提供給我們?yōu)g覽器訪問的入口螃壤,通過nginx轉(zhuǎn)發(fā)80端口進(jìn)來的數(shù)據(jù)包到本地環(huán)回地址(127.0.0.1)的8010端口上(其他端口也是闊以的,這里只是拿8010舉例子)筋帖,然后我們通過uWSGI開啟本地的8010供本地訪問奸晴,這里不理解我可以舉個例子,在這里相當(dāng)于我們運(yùn)行了
$ python manage.py runserver 127.0.0.1:8010
nginx則起到了一個轉(zhuǎn)發(fā)端口的功能日麸,說完了原理寄啼,接下來就正式開始我們的安裝過程了
配置
安裝nginx
首先進(jìn)入/etc/apt目錄下
$ cd /etc/apt
下載公鑰
$ sudo wget http://nginx.org/keys/nginx_signing.key
(如果提示找不到命令wget,那就使用命令下載這個http工具:$ sudo apt-get install wget)
加載公鑰
$ sudo apt-key add nginx_signing.key
然后把下載源添加在apt下載源的后面 如果你不會使用vim編輯器赘淮,也可以使用nano這個比較簡單一些
$ sudo vim /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
因為我使用的ubuntu系統(tǒng)是16.04版本的對應(yīng)的發(fā)行版名稱是xenial
- Version codename Supported Platforms
- 14.04 trusty x86_64, i386, aarch64/arm64
- 16.04 xenial x86_64, i386, ppc64el, aarch64/arm64
- 17.10 artful x86_64, i386
- 18.04 bionic x86_64
對應(yīng)自己系統(tǒng)的版本選擇對應(yīng)的系統(tǒng)名
配置好源以后就開始下載安裝了安裝
$ sudo apt-get update
$ sudo apt-get install nginx
安裝完成后我們就啟動它
$ sudo nginx
執(zhí)行命令后沒有任何回顯 使用ps命令可以查看進(jìn)程是否啟動
$ ps aux | grep nginx
nginx啟動后然后在瀏覽器中輸入你服務(wù)器的ip地址辕录,回車,只要不出下如下這樣無法鏈接到服務(wù)器梢卸,說明你nginx是安裝成功的
很多時候你可能是配置正確的走诞,但是就是不知道為什么訪問不了。很多情況都可能是你選擇的云服務(wù)商有個安全規(guī)則給你關(guān)閉了端口蛤高,所以你必須手動打開你需要的端口蚣旱。比如我在第一次用Azure的時候也是遇到了這個問題,而且Azure有個小坑的地方是它有入站規(guī)則和出站規(guī)則戴陡。
這個配置也是有點小坑的地方塞绿,我給大家看下我是怎么配置的:
特別是這個源端口范圍,最好是使用*不要限制源端口恤批,因為客戶端的端口是操作系統(tǒng)隨機(jī)給的异吻。
下面是出站規(guī)則的配置:
我這里是為了開啟80端口,如果你是為了開啟其他的端口則只需要把我圖中的80換成你想要的端口就行了喜庞。
安裝 uWSGI
uWSGI是python的一個第三方包诀浪,首先我們選擇用python的虛擬環(huán)境來運(yùn)行我們的項目
但是ubuntu16.04默認(rèn)的是python3.5,首先我們需要更換為python3.6
加裝含有python3.6.4的PPA
$ sudo add-apt-repository ppa:deadsnakes/ppa
如果和我一樣報錯就可以運(yùn)行如下命令延都,沒有報錯就可以不管了
$ sudo apt install software-properties-common
重新運(yùn)行如下命令雷猪,如果你是root用戶則不用加上sudo,否則會出錯
$ add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.6
這里也可以直接把python3.5卸載掉晰房,卸載的命令為:
$ sudo apt-get remove python3.5
然后再安裝Python3.6
到了這里求摇,因為源的問題射沟,可能有點慢,与境,验夯,,
查看新安裝的python版本
$ python3.6 -V
我們使用python3命令會默認(rèn)的訪問python3.5的版本嚷辅,接下來我們替換掉原先的軟連接
列出系統(tǒng)當(dāng)前存在的python版本及python默認(rèn)的版本
$ ls -l /usr/bin | grep python
我們就是要替換掉途中的這個軟連接
$ sudo rm /usr/bin/python3
$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3
重新查看文件簿姨,發(fā)現(xiàn)多了圖中的軟連接,就說明成功了
然后我們再運(yùn)行python3 就默認(rèn)進(jìn)入3.6
$ python3
接著安裝python虛擬環(huán)境
首先安裝python3的pip下載工具
$ sudo apt-get install python3-pip
$ python3 -m pip -V
$ sudo python3 -m pip install virtualenv
如果你在運(yùn)行這天命令的時候出現(xiàn)了如下報錯簸搞,
則在~/.bashrc 文件末尾加上
export PIP_REQUIRE_VIRTUALENV=false
$ sudo source ~/.bashrc
$ sudo python3 -m pip install virtualenvwrapper
這樣便安裝成功
并把:
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
添加在~/.bashrc文件末尾
然后重新讀取配置文件使得配置生效
$ source ~/.bashrc
新建
$ mkvirtualenv py3.6
進(jìn)入虛擬環(huán)境py3.5 前面出下(py3.6)表示已經(jīng)進(jìn)入虛擬環(huán)境 并安裝django扁位,uwsgi
$ workon py3.6
$ pip install django==1.11
$ pip install uwsgi
如果安裝uwsgi出現(xiàn)了如下錯誤
則安裝依賴如下
$ sudo apt-get install libpython3.6-dev
然后重新安裝uwsgi
$ pip install uwsgi
知道這里我們就把需要的東西的下載安裝好了
django hello world
接下來我們使用django寫一個簡單的helloworld
上傳項目到服務(wù)器中, 如果不知道怎么上傳可以試試pycharm的這個功能
并上傳到/var/www目錄中
配置nginx,uWSGI
配置文件 django.conf 并放到目錄 /etc/nginx/conf.d/ 中
server{
listen 8008;
# 47.106.253.190是你的服務(wù)器ip
server_name 47.106.253.190;
charset utf-8;
root /var/www/beike;
index test.html;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass localhost:8010;
}
location /static {
alias /var/www/beike/static/;
}
#location / {
# alias /var/www/beike/;
#}
}
然后配置文件 uwsgi.ini 并放到/var/www/hello中
[uwsgi]
# 作為nginx連接時使用
socket=127.0.0.1:8010
# 直接作為web服務(wù)使用
# 配置工程目錄
chdir=/var/www/beike
# 配置項目的wsgi目錄趁俊,相對于工程目錄
wsgi-file=beike/wsgi.py
#配置進(jìn)程線程信息
processes=6
threads=2
enable-threads=True
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
然后運(yùn)行uwsgi
$ uwsgi --ini /var/www/hello/uwsgi.ini
$ nginx -s stop
$ nginx
然后便配置成功域仇,可以訪問了
uwsgi的操作命令
你在以后修改了django文件保存后應(yīng)該重啟uwsgi
$ uwsgi --reload uwsgi.pid
如果要停掉uwsgi用如下命令:
$ uwsgi --stop uwsgi.pid
uwsgi.pid
文件是你在運(yùn)行uwsgi --ini /var/www/hello/uwsgi.ini
后在uwsgi.ini
同級目錄下生成的文件。
使用cat
命令可以查看uwsgi.pid 文件的內(nèi)容寺擂,在其實保存的就是運(yùn)行的uwsgi主程序的pid