如何將本地的Django項(xiàng)目部署到云服務(wù)器

如何將本地的Django項(xiàng)目部署到云服務(wù)器

項(xiàng)目代碼見GitHub
博客網(wǎng)址

開發(fā)環(huán)境

  • 開發(fā)語言: Python
  • 后臺(tái)框架:Django
  • 前端框架:bootstrap
  • web服務(wù)器:nginx
  • wsgi服務(wù)器:uwsgi

查看本地項(xiàng)目Django和Python版本:

(可以直接安裝Django最新版本就可以了绽左,Python版本不能低于3.4)
Django2.0.4
Python3.6.5

首先python3的安裝

[參考鏈接]
linux安裝python3
從零開始配置阿里云服務(wù)器centos7.4

  1. 首先在官網(wǎng)下載安裝包 python-3.6.5
    (直接使用wget命令下載,速度也賊快推汽,下載完成后發(fā)現(xiàn)在根目錄下多了一個(gè)Python-3.6.5.tgz的壓縮包)

  2. 安裝相關(guān)包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

  3. 服務(wù)器自帶的python2安裝在usr/bin/目錄中,可以通過which python命令來查看python的安裝目錄酪耳。
    然后進(jìn)入該目錄,用我們熟悉的python -v來查看python版本并闲。(其實(shí)直接在根目錄下用python -v也是可以的萤捆,但which這個(gè)命令是真的可不錯(cuò))

  4. 利用tar xf Python-3.6.5.tgz命令解壓

  5. 解壓完成后枪向,(進(jìn)入解壓后的目錄)绢涡,編輯安裝命令。

./configure --prefix=/usr/local/python3/ # 安裝目錄為/usr/local/python3(可以自定義安裝目錄)
make && make install # 編譯并安裝

  • 提示bug: ./configure: No such file or directory
  • 是因?yàn)闆]有進(jìn)入解壓后的目錄遣疯,configure是安裝文件里面的配置工具。
  1. 設(shè)置軟連接
    一條命令解決凿傅,再也不用配環(huán)境變量了。linux的軟鏈接相當(dāng)于windows里的快捷方式,快捷方式刪了就刪了滔迈,原來文件還是存在的敬惦。軟連接后面也有大用俄删。

ln -s /usr/local/python3/bin/python3 /usr/bin/python3.6

即在/usr/bin里面創(chuàng)建一個(gè)快捷方式python3.6奏路,該快捷方式指向python3的安裝路徑鸽粉。
輸入python3.6 -v測(cè)試帚戳,成功

  • 可以通過以下命令查看所有的軟連接:

cd usr/bin/
ls -l

可以看到python,python2,連接的都是python2.7笔宿,而python3.6連接的就是剛安裝的版本

參考鏈接:百度經(jīng)驗(yàn)-怎么修改軟連接

  • 也可以將python3.6直接改為python犁钟。
  • 備份原連接為:python -> python2
  • 使用ln -s /usr/local/python3/bin/python3 /usr/bin/python醋粟,建立失敗鼻吮,發(fā)現(xiàn)python已經(jīng)存在违柏。
  • 刪除原連接 rm /python2
  • 再次建立成功闲孤。

安裝各種軟件

  1. 安裝數(shù)據(jù)庫
    安裝sqlite讼积,mysql
yum install mysql mysql-devel
yum install sqlite-devel
  1. 安裝pip

yum -y install python-pip

報(bào)錯(cuò)

[root@VM_0_12_centos bin]# yum -y install python-pip
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

先安裝get-pip

wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py

安裝成功吕朵。再用python命令安裝pip

python get-pip.py

安裝成功,pip版本為:
Successfully installed pip-10.0.1 wheel-0.31.0

但此時(shí)未配置軟連接的情況下第队,需要使用python -m pip來使用python3的pip。

  1. 安裝Django

pip install django

安裝失斉俑选:
This version of Django requires Python 3.4, but you're trying to
install it on Python 2.7.

This may be because you are using a version of pip that doesn't
understand the python_requires classifier. Make sure you
have pip >= 9.0 and setuptools >= 24.2, then try again:

    $ python -m pip install --upgrade pip setuptools
    $ python -m pip install django

This will install the latest version of Django which works on your
version of Python. If you can't upgrade your pip (or Python), request
an older version of Django:

    $ python -m pip install "django<2"

2.0.5版本需要python3.4以上版本

這里因?yàn)槭褂玫氖莗ython2的pip凳谦,為了解決這個(gè)問題可以修改軟連接,也可以直接使用python -m pip install django來指定pip為python3的衡未。
我這里使用了第二種方法尸执。

  1. 安裝mysqlclient(連接器)

python -m pip install mysqlclient

報(bào)錯(cuò):
OSError: mysql_config not found

加入環(huán)境變量:
PATH="$PATH":/usr/local/mysql/bin

重新安裝,成功缓醋。
版本:mysqlclient-1.3.12

  1. 安裝uwsgi

python -m pip install uwsgi

Successfully installed uwsgi-2.0.17

  1. 安裝nginx

在線項(xiàng)目部署

在服務(wù)器上創(chuàng)建簡(jiǎn)單Django項(xiàng)目hello剔交,結(jié)合uwsgi+Django+nginx。

測(cè)試uwsgi

測(cè)試uwsgi -version

顯示環(huán)境變量未配置好 -bash: uwsgi: command not found

建立軟連接:(好用的一匹改衩,順便把其他的都配了)

ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin.py
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn

查看軟連接:

cd /usr/bin
ls -l

建立好軟連接后,查看uwsgi是否安裝成功:

uwsgi --version

成功,顯示:

[root@VM_0_12_centos projects]# uwsgi --version
2.0.17

繼續(xù)測(cè)試驯镊,創(chuàng)建test.py:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3

使用uwsgi運(yùn)行test.py:

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

訪問http://127.0.0.1:8000/

訪問失敽健:

localhost拒絕了我們的請(qǐng)求竭鞍。
有毒,這些教程是真的有毒橄镜。在本地瀏覽器訪問云服務(wù)器的時(shí)候一定要用IP地址或者域名偎快。

訪問http://www.zosurn.xyz:8000
訪問成功,但出現(xiàn)的是seafile登錄頁面洽胶,說明該端口被占用了晒夹,可以釋放8000端口,也可以換其他的端口姊氓。

修改端口為8002:

uwsgi --http :8002 --wsgi-file test.py
成功訪問到hello world丐怯。

創(chuàng)建Django項(xiàng)目hello
在/home/projects/目錄下,使用Django創(chuàng)建一個(gè)簡(jiǎn)單hello項(xiàng)目后翔横,配置setting.py中的allowed_host設(shè)置為:

ALLOWED_HOSTS = ['.zosurn.xyz', 'localhost', '127.0.0.1']

將uwsgi與Django連接:

參考鏈接

uwsgi --http :8008 --chdir /home/projects/hello --wsgi-file hello/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192

訪問http://www.zosurn.xyz:8008成功读跷,出現(xiàn)Django歡迎頁面。

參數(shù)太多禾唁,可以將其寫入ini文件中
在hello項(xiàng)目的目錄下創(chuàng)建uwsgi.ini文件效览,寫入如下內(nèi)容(采用字典格式):

# hello_uwsgi.ini file
[uwsgi]

# Django-related settings

http = :8008

# the base directory (full path)
chdir           = /home/projects/hello

# Django s wsgi file
module          = hello.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

然后使用如下命令啟動(dòng)uwsgi:

uwsgi --ini uwsgi.ini

再次測(cè)試,訪問http://www.zosurn.xyz:8008成功荡短。

測(cè)試nginx:

查看nginx是否安裝成功丐枉,查看nginx的版本:

[root@VM_0_12_centos hello]# nginx -v
nginx version: nginx/1.12.2

在/home/projects目錄下新建一個(gè)test目錄,在里面添加一個(gè)簡(jiǎn)單的html文件掘托。然后在nginx.conf中簡(jiǎn)單配置:

events{}
http{
    server{
        server_name www.zosurn.xyz;
        root /home/projects/test;
        index index.html;
    }
}

啟動(dòng)該nginx:(啟動(dòng)之前瘦锹,要將/usr/local/nginx/mime.types文件復(fù)制到該nginx.conf所在目錄,并且必須使用絕對(duì)路徑

nginx -c /home/projects/test/nginx.conf

如果端口被占用烫映,則先釋放該端口,則使用lsof -i :8082查看占用端口進(jìn)程的pid沼本,并使用kill -9 [pid]關(guān)閉相應(yīng)的進(jìn)程。

在瀏覽器中訪問自己的域名http://www.zosurn.xyz锭沟,訪問成功抽兆。

將nginx和uwsgi以及Django結(jié)合

在hello項(xiàng)目的目錄下創(chuàng)建nginx.conf

vim nginx.conf

添加如下內(nèi)容:

events{}
http{
    server{
        listen 8082;    # 如果不加的話,會(huì)默認(rèn)為80族淮,這里也可以不改
        server_name www.zosurn.xyz;
        root /home/projects/hello;
        index index.html;
        
        location /{
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8008; # 需要和ini文件中的端口保持一致辫红,這樣才能實(shí)現(xiàn)兩者的通信。
            uwsgi_read_timeout 2;
        }
    }
}
    

啟動(dòng)nginx:

nginx -c /home/projects/hello/nginx.conf

啟動(dòng)uwsgi:

uwsgi --ini /home/projects/hello/uwsgi.ini

使用域名訪問祝辣,成功訪問到該hello項(xiàng)目的Django歡迎頁面贴妻。

部署本地項(xiàng)目到服務(wù)器

clone本地項(xiàng)目代碼到服務(wù)器/通過ftp復(fù)制項(xiàng)目到服務(wù)器

在我的項(xiàng)目目錄/home/projects里創(chuàng)建一個(gè)blog目錄,并在里面創(chuàng)建一個(gè)conf目錄蝙斜,用來存放配置文件,這樣分離開來名惩,方便更新維護(hù)項(xiàng)目代碼。

  • home/
    • projects/
      • blog/
        • conf/
          • nginx.conf
          • uwsgi.ini
          • uwsgi.log
        • mysite/ # 你的Django項(xiàng)目目錄孕荠,假設(shè)為mysite
          • blog/
          • mysite/
            • urls.py
            • settings.py
          • static/
          • template/
          • manage.py
          • ...

修改項(xiàng)目代碼

修改settings.py:

DEBUG = False   # Django是否加載靜態(tài)資源
ALLOWED_HOSTS = ['localhost','127.0.0.1','.zosurn.xyz'] # 允許訪問的主機(jī)地址

STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 收集Django的靜態(tài)文件到同一個(gè)static中

創(chuàng)建uwsgi.ini和uwsgi.log

uwsgi.ini不變娩鹉,依舊為:

# myblog uwsgi.ini file
[uwsgi]

socket = 127.0.0.1:8002
# http = :8002 如果不通過nginx可以直接用http攻谁,但要通過web服務(wù)器就必須要用socket

# the base directory (full path)
chdir           = /home/projects/blog/mysite

# Django s wsgi file
module          = mysite.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# clear environment on exit
vacuum          = true

創(chuàng)建nginx.conf


# worker_rlmit_nofile 65500; # 提升nginx的進(jìn)程文件打開數(shù)

events{}

http{
    include       mime.types;
    server{

        listen 80;
        server_name www.zosurn.xyz;
        index index.html ;
        root  /home/projects/blog/mysite;

            location /static {
                alias /home/projects/blog/mysite/static; # your Django project's static files - amend as required
            }

            # Finally, send all non-media requests to the Django server.
            location / {
                include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
                uwsgi_pass 127.0.0.1:8002;
            }
        }
}

創(chuàng)建數(shù)據(jù)庫、收集靜態(tài)文件

python manage.py migrate
python manage.py collectstatic

啟動(dòng)服務(wù)

  • 啟動(dòng)nginx

nginx -c /home/projects/blog/conf/nginx.conf

  • 后臺(tái)啟動(dòng)uwsgi

uwsgi /home/projects/blog/conf/uwsgi.ini -d /home/projects/blog/conf/uwsgi.log

如此就可以通過域名訪問自己的Django項(xiàng)目了弯予。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戚宦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锈嫩,更是在濱河造成了極大的恐慌受楼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呼寸,死亡現(xiàn)場(chǎng)離奇詭異艳汽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)等舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門骚灸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慌植,你說我怎么就攤上這事甚牲。” “怎么了蝶柿?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵丈钙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我交汤,道長(zhǎng)雏赦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任芙扎,我火速辦了婚禮星岗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戒洼。我一直安慰自己俏橘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布圈浇。 她就那樣靜靜地躺著寥掐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷蜀。 梳的紋絲不亂的頭發(fā)上召耘,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音褐隆,去河邊找鬼污它。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轨蛤。 我是一名探鬼主播蜜宪,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祥山!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掉伏,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤缝呕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后斧散,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供常,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年鸡捐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栈暇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箍镜,死狀恐怖源祈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色迂,我是刑警寧澤香缺,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站歇僧,受9級(jí)特大地震影響图张,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诈悍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一祸轮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侥钳,春花似錦适袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冕房,卻和暖如春躏啰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耙册。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工给僵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓帝际,卻偏偏與公主長(zhǎng)得像蔓同,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹲诀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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