Python Django 生產(chǎn)環(huán)境部署到 Ucloud

使用 Django 搭建了一個網(wǎng)站,在部署到生產(chǎn)環(huán)境 Ucloud 時遇到了神坑無數(shù),花費(fèi)了4個夜晚才算是解決。這里盡可能記錄部署的過程,遇到的問題,以及解決辦法,希望能幫助像我一樣的后端開發(fā)小白,少踩一些坑。

前提條件

  1. 本地可以正常運(yùn)行的 Django 項(xiàng)目,哪怕是一個 Hello World
  2. Ucloud 云主機(jī) 或者其他平臺的云主機(jī)
  3. 域名(沒有也可以)

云主機(jī)服務(wù)器創(chuàng)建

這個沒什么難度,按照第三方給的文檔,一步步走下去就可以。關(guān)鍵是云主機(jī)創(chuàng)建完成之后,會有一個內(nèi)網(wǎng) IP,還有一個外網(wǎng) IP。這兩個 IP 后面做 DNS 解析要用到。我這里創(chuàng)建的服務(wù)器的系統(tǒng)是 Ubuntu 12.04。建議使用 Linux 系列的。

有一個技巧是,創(chuàng)建完系統(tǒng),登陸時,Ubuntu 的默認(rèn)登陸名是 ubuntu,密碼是自己設(shè)置的。為什么之前沒人告訴我呢,害我找了好久,通過客服才解決這個問題。

默認(rèn)的系統(tǒng)中,安裝的是有 ssh 的,這樣就可以通過 ssh 連接到服務(wù)器。命令如下

ssh user@ip_address

user 是登陸的用戶名,默認(rèn)是 ubuntu。
ip_address 就是創(chuàng)建云主機(jī)指定的外網(wǎng) ip。之后會讓輸入密碼,就是主機(jī)設(shè)置的登陸密碼。

下面就可以把這個當(dāng)做本地的一臺 Ubuntu 系統(tǒng)的電腦使用,安裝必要的軟件,唯一不同的是,這個是真的沒有 GUI 界面。

Python 相關(guān)軟件安裝

Ubuntu 系統(tǒng)中默認(rèn)安裝 Python 2.7 版本,生產(chǎn)環(huán)境中,就使用這個版本。下面會安裝 pip

apt-get update
apt-get install python-pip

基本都是傻瓜式的,不用做什么操作。
pip 安裝之后,在安裝 Python 開發(fā)必須使用的兩個擴(kuò)展 virtualenvvirtualenvwrapper

pip install virtualenv

默認(rèn)安裝在 /usr/local/bin 目錄下的

安裝 virtualenvwrapper 管理 vritualenv

pip install virtualenvwrapper

在 .bashrc 中添加如下代碼

export VIRTUALENV_USE_DISTRIBUTE=1        #  總是使用 pip/distribute
export WORKON_HOME=$HOME/Envs       # 所有虛擬環(huán)境存儲的目錄
if [ -e $HOME/Envs/bin/virtualenvwrapper.sh ];then
   source $HOME/Envs/bin/virtualenvwrapper.sh
else if [ -e /usr/local/bin/virtualenvwrapper.sh ];then
         source /usr/local/bin/virtualenvwrapper.sh
    fi
fi
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true

添加后執(zhí)行下面命令

source .bashrc

這個時候就可以使用 virtualenvwrapper 管理 virtualenv 了。virtualenvwrapper 的常用命令,可以使用 virtualenvwrapper --help 查看。為了使用方便,我配置了幾個別名

alias lsenv='lsvirtualenv'
alias mkenv='mkvirtualenv'
alias rmenv='rmvirtualenv'

上面三個命令,再加上一個 workon 基本就夠用了。
如果關(guān)于 virtualenv 和 virtualenvwrapper 配置有不明白的地方,可以參考這篇文章
python 虛擬環(huán)境設(shè)置參考1
python 虛擬環(huán)境設(shè)置參考2

配置完虛擬環(huán)境之后,我們就創(chuàng)建一個虛擬環(huán)境

mkenv django

創(chuàng)建完之后,默認(rèn)會切換到 django 環(huán)境中。

上傳代碼到服務(wù)端

平常也經(jīng)常聽我們服務(wù)端的開發(fā)說,發(fā)布代碼,功能上線,至于怎么發(fā)布代碼,如何上線卻不了解。我這里使用了一個簡單的方法,我的代碼原本托管在 coding 上 。我就在服務(wù)器上把最新的代碼拉下來,不久可以了嗎,實(shí)現(xiàn)了曲線發(fā)布。
Ubuntu 上默認(rèn)安裝有 Git ,要想使用 ssh 拉取代碼,還需要配置下 ssh key。不然每次輸入用戶名,密碼絕壁要煩死。

ssh key 公鑰 配置,可以參考整
下面就是找個目錄,把代碼拉到服務(wù)器上。

安裝第三方依賴庫

項(xiàng)目中,添加第三方依賴之后,一般都會通過 pip freeze 命令及時的更新依賴列表 requirement.txt

pip freeze -> requirement.txt

這個命令會將依賴的第三方庫信息保存在requirement.txt 中。

pip install -r requirement.txt

這個命令會將 requirement.txt 上的所有第三方庫全部安裝。

Mysql 安裝和配置

安裝 Mysql 以及相關(guān)的依賴工具

apt-get install mysql-server mysql-client libmysqld-dev

Mysql 安裝過程中會讓設(shè)置一個秘密,這里就默認(rèn)為 root

安裝成功之后,登陸 Mysql,命令為

mysql -u root -p

使用 root 賬號登陸 mysql
創(chuàng)建個新用戶 imeosng

CREATE USER 'imesong'@'%' IDENTIFIED BY 'imesong'

創(chuàng)建一個 用戶 imesong,密碼為 imesong

GRANT ALL ON *.* TO 'imesong'@'%';

對 imesong 用戶授權(quán) 完全的讀寫權(quán)限。 ON 后面的 . 表示 所有數(shù)據(jù)庫,所有表 @ 后面的 % 表示所有主機(jī),All 表示所有的權(quán)限,包括 SELECT,INSERT等。

數(shù)據(jù)庫用戶的創(chuàng)建,還請大家參考這篇文字 MySQL創(chuàng)建用戶與授權(quán)

創(chuàng)建數(shù)據(jù)庫

CREATE databases 11it

創(chuàng)建一個名稱為 11it 的數(shù)據(jù)庫。
使用 show databases可以查看當(dāng)前有哪些數(shù)據(jù)庫
使用 use 11it 使用 11it 數(shù)據(jù)庫
show tables 查看當(dāng)前的數(shù)據(jù)庫表

uwsgi 安裝配置

uwsgi 使用 pip 安裝

apt-get install uwsgi uwsgi-plugin-python

配置 uwsgi

vim /etc/uwsgi/apps-available/11it.ini

創(chuàng)建 11it.ini 配置文件,文件名可以自己任意修改,只有符合命名規(guī)范

文件內(nèi)容如下

[uwsgi]
# Django 項(xiàng)目的 project name
project = mxonline
# project 的目錄地址,這個目錄要修改為自己的項(xiàng)目對應(yīng)的目錄
base = /home/ubuntu/coding
# 代碼根目錄
chdir = %(base)/%(project)
# Model 名稱
module = MxOnline.wsgi
vhost = true
plugins = python
# socket 連接文件地址,這個很重要
socket = /tmp/11it.sock
master = true
vacuum = true
enable-threads = true
#開啟4個進(jìn)程
process = 4
#socket 文件連接的權(quán)限
chmod-socket = 666
# 虛擬環(huán)境目錄
virtualenv = /home/ubuntu/Envs/11it
# 這個不知道做什么的,會在指定目錄下創(chuàng)建一個文件,這個目錄要保證有讀寫權(quán)限
touch-reload = %(base)/%(project)/reload

然后將 apps-available 中的配置文件 ln 到 apps-enabled 文件夾中

ln -s /etc/uwsgi/apps-available/11it.ini /etc/uwsgi/apps-enabled/

nginx 安裝配置

安裝 Nginx

apt-get install nginx

配置 Nginx

vim /etc/nginx/sites-available/11it

配置文件如下

server {
    # 監(jiān)聽的端口
    listen 80;
    #解析的域名
    server_name www.xxx.com xxx.com;
    #訪問日志存放路徑
    access_log  /var/log/nginx/11it.access.log;
    #錯誤日志存放路徑
    error_log  /var/log/nginx/11it.error.log;
    location / {
    # uwsgi 連接 nginx
    include  uwsgi_params;
        # 通過 socket 連接 uwsgi 。后面對應(yīng)的就是在 uwsgi 配置文件中創(chuàng)建的 sock 文件 ,添加 上 unix:/ 。
        uwsgi_pass unix:///tmp/11it.sock;
    }
    location /media/ {
        # 解析 media 目錄。這個目錄在 Django 項(xiàng)目中用于用戶上傳的媒體文件,具體的路徑,以自己的項(xiàng)目中路徑為準(zhǔn)
        alias /home/ubuntu/coding/mxonline/media/;
    }
    location /static/ {
        # static 文件路徑。這個目錄也是在Django 項(xiàng)目中生成的,并且配置的這個目錄,還要在 Django 的 setting.py 文件中保持一致,不然會出現(xiàn)無法加載靜態(tài)文件,導(dǎo)致 css,js 文件無法加載。
        alias /home/ubuntu/coding/mxonline/static/;
    }
}

接下來將 sites-available 文件夾中剛才添加的文件 ln 到 sites-enabled 文件夾中

ln -s /etc/nginx/sites-available/11it /etc/nginx/sites-enabled/

配置完成之后,我們驗(yàn)證下 nginx 的配置是否成功

sudo service nginx configtest

如果顯示 ok ,證明配置沒有問題。
啟動 nginx 和 uwsgi

sudo service nginx restart
sudo service uwsgi restart

在瀏覽器中,使用云主機(jī)的 外網(wǎng) ip 訪問下,可以看到 nginx 的歡迎頁面。

靜態(tài)文件代理

nginx 主要做靜態(tài)文件的處理,我們在配置文件中指定了靜態(tài)文件的路徑,但是我們并不是所有的文件都在static 目錄中。開發(fā)環(huán)境和生產(chǎn)環(huán)境中 ,對靜態(tài)文件的路徑配置還不同。
生產(chǎn)環(huán)境中做如下修改
setting.py 中

# 新增 static 目錄,存放項(xiàng)目所有的靜態(tài)資源
STATIC_ROOT = os.path.join(BASE_DIR, "static")
# 這個注釋掉
#STATICFILES_DIRS = (
#    os.path.join(BASE_DIR, "static"),
#)

在項(xiàng)目根目錄運(yùn)行命令

python manage.py collectstatic

Django 會將所有用到的靜態(tài)文件,包括第三方庫中的,copy 一份放在 setting.py 中配置的 STATIC_ROOT 中。

啟動 uwsgi

uwsgi --ini /etc/uwsgi/apps-available/11it.ini

域名解析配置

域名解析看自己的域名服務(wù)商,主要配置 A 記錄和 www 記錄

dns.png

以上,基本上完成了我們 Django 生產(chǎn)環(huán)境的部署,當(dāng)然還有很多細(xì)節(jié)問題沒有記錄。
下面是一些參考鏈接

https://foofish.net/django-deploy.html
http://m.itdecent.cn/p/d7b9c468f20d
https://www.doraemonext.com/archives/552.html
http://stackoverflow.com/questions/21820444/nginx-error-13-permission-denied-while-connecting-to-upstream
http://pengjunjie.com/blog/single/83/
http://projectsedu.com/2017/02/07/centos7-%E4%B8%8B%E9%80%9A%E8%BF%87nginx-uwsgi%E9%83%A8%E7%BD%B2django%E5%BA%94%E7%94%A8/
http://www.cnblogs.com/jhao/p/6071790.html
https://zhuanlan.zhihu.com/p/25080236

看到這么多參考鏈接,你就該想到,我在部署時遇到了多少坑吧。

祝大家部署順利!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容