Django部署到線上(修改版)

前言

《Django部署到線上》一文中箱吕,很多步驟不是必須的,有些部分甚至是錯誤的柿冲,本文就精簡修改一下茬高。
目標:把djsite項目部署到/home/web目錄中,并且給它分配一個域名為djsite.voidking.com假抄。

環(huán)境準備

supervisor

1怎栽、安裝

yum install python-pip
yum install supervisor
pip install supervisor

2、創(chuàng)建sock

touch /tmp/supervisor.sock
chmod 777 /tmp/supervisor.sock

python虛擬機

1宿饱、安裝pyenv套裝
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
內(nèi)容除了包含 pyenv 以外熏瞄,還包含如下插件:

  • pyenv-doctor
  • pyenv-installer
  • pyenv-update
  • pyenv-virtualenv
  • pyenv-which-ext

2、路徑添加
vim ~/.bash_profile谬以,添加:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

3强饮、使配置立即生效
source ~/.bash_profile

4、查看安裝情況
pyenv -v

5蛉签、常用命令

  • 查看可安裝的python版本列表:pyenv install -l
  • 安裝指定版本的python:pyenv install 3.6.1
  • 查看已安裝的python:pyenv versions
  • 查看當前設為默認的python版本:pyenv version

安裝python3.6

1胡陪、配置pyenv下載源為本地目錄(可選操作沥寥,不做的話下載速度會很慢)

mkdir /root/python/ && cd /root/python/

# 設置變量
export PYTHON_BUILD_CACHE_PATH=/root/python

# 設置變量
export PYTHON_BUILD_MIRROR_URL=/root/python

# 查看變量設置
env | grep PYTHON_BUILD_MIRROR_URL

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz

2、安裝python3.6.1柠座,pyenv install 3.6.1
報錯邑雅,ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? 需要安裝依賴包:

yum install readline readline-devel readline-static -y
yum install openssl openssl-devel openssl-static -y
yum install sqlite-devel -y
yum install bzip2-devel bzip2-libs -y

3、改變?nèi)职姹?br> pyenv global 3.6.1妈经,python -V

附:改變回原版本
pyenv global system淮野,python -V

4、刷新數(shù)據(jù)庫
python rehash

項目部署

代碼準備

1吹泡、在/home/web目錄中骤星,執(zhí)行命令克隆項目
git clone https://github.com/voidking/djsite.git

2、安裝django
pip install django==1.11.7

3爆哑、安裝pymysql
pip install pymysql

數(shù)據(jù)庫準備

1洞难、創(chuàng)建數(shù)據(jù)庫

# mysql -uroot -p
mysql> create database `djsite` default character set utf8 collate utf8_general_ci; 

2、修改mysql的binlog格式為混合模式:

mysql> set global binlog_format=mixed;
mysql> exit;

3揭朝、修改djsite/djsite/settings.py中的數(shù)據(jù)庫配置
vim djsite/djsite/settings.py

4队贱、創(chuàng)建表結(jié)構(gòu)

python manage.py makemigrations
python manage.py migrate

啟動項目

1、啟動命令
python manage.py runserver

2潭袱、服務器測試訪問
curl localhost:8000/blog/index

3柱嫌、本地測試訪問
使用瀏覽器查看 http://ip:8000/blog/index ,無法訪問屯换。
啟動命令改為:python manage.py runserver 0.0.0.0:8000编丘,此時即可在瀏覽器看到部署好的項目。

如果還是不能訪問彤悔,嘗試先關(guān)閉防火墻:systemctl stop firewalld

nginx配置

1嘉抓、首先,在萬網(wǎng)上配置域名解析蜗巧,添加A記錄掌眠,解析到阿里云服務器IP。假設解析好的域名為django.voidking.com幕屹。

2蓝丙、在nginx的vhost中,添加django.voidking.com.conf望拖,內(nèi)容為:

server {
    listen 80;
    server_name django.voidking.com;
    charset utf-8;
    location /{
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size       1024m;
        client_body_buffer_size    128k;
        client_body_temp_path      data/client_body_temp;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
        proxy_temp_path            data/proxy_temp;

        proxy_pass http://127.0.0.1:8000;
    }
}

3渺尘、重啟nginx,./nginx -s reload

4说敏、測試訪問
服務器:curl django.voidking.com/blog/index
本地瀏覽器:http://django.voidking.com/blog/index

至此鸥跟,django項目已經(jīng)部署成功,沒有用到uwsgi。如果給django添加守護進程医咨,那么我們的部署就接近完美了枫匾。那么,uwsgi又能干什么呢拟淮,我們繼續(xù)研究干茉。

uwsgi

安裝uwsgi

pip install uwsgi

編寫測試:

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

啟動測試:
uwsgi --http :8001 --wsgi-file test.py

訪問 http://ip:8001 ,即可看到Hello World 很泊。

一般啟動

1角虫、編寫wsgi.py文件
編寫django_wsgi.py文件,將其放在與文件manage.py同一個目錄下委造。

#!/usr/bin/env python
# coding: utf-8

import os,django
from django.core.handlers.wsgi import WSGIHandler

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djsite.settings")
django.setup()
application = WSGIHandler()

2戳鹅、啟動項目
uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi

3、查看啟動結(jié)果
lsof -i :8000昏兆,ps aux | grep uwsgi

4枫虏、測試訪問
http://ip:8000/blog/index
此時,頁面是沒有樣式的亮垫,也就是說靜態(tài)資源加載失敗模软。

5伟骨、配置靜態(tài)資源
uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi --static-map=/static=static
此時饮潦,頁面樣式就正常了。

高級啟動

1携狭、新建uwsgi.ini继蜡,與manage.py在同一級目錄。

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=static

2逛腿、啟動uwsgi
uwsgi uwsgi.ini

3稀并、測試訪問
http://ip:8000/blog/index

supervisor

配置supervisor

1、開機啟動
systemctl enable supervisord

2单默、生成配置文件

mkdir -p /etc/supervisor/
echo_supervisord_conf > /etc/supervisord.conf

3碘举、修改配置文件
vim /etc/supervisord.conf,添加:

[include]
files = /etc/supervisor/*.conf

4搁廓、運行
supervisord -c /etc/supervisord.conf

守護uwsgi

1引颈、在/etc/supervisor中新建djsite.conf文件:

[program:djsite]
command=/root/.pyenv/versions/3.6.1/bin/uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi --static-map=/static=static
directory=/home/web/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

2、重啟supervisor

ps aux | grep supervisord
systemctl stop supervisord
systemctl start supervisord

附:重啟djsite命令

supervisorctl -c /etc/supervisord.conf restart djsite

3境蜕、測試訪問
http://ip:8000/blog/index
頁面顯示正常蝙场,至此守護進程配置成功。

4粱年、djsite.conf可以精簡修改為:

[program:djsite]
command=/root/.pyenv/versions/3.6.1/bin/uwsgi --ini uwsgi.ini
directory=/home/web/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

靜態(tài)資源問題(可忽略)

假設售滤,uwsgi.ini為:

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py

靜態(tài)資源就無法訪問了。在不添加static-map的情況下,需要修改兩個文件:
(1)修改djsite/djsite/settings.py文件完箩,添加:

STATIC_ROOT = '/home/web/djsite/static/'

(2)修改djsite/djsite/settings.py文件為:

from django.conf.urls import url,include
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include('blog.urls', namespace='blog')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

admin靜態(tài)資源問題

如果以python manage.py runserver啟動django赐俗,那么靜態(tài)資源沒有問題。

如果以uwsgi啟動django弊知,靜態(tài)資源看起來沒有問題秃励,但是,如果訪問 http://ip:8000/admin 吉捶,就會發(fā)現(xiàn)這個頁面的靜態(tài)資源無法獲取夺鲜。

一個Django應用,一般有兩類靜態(tài)文件呐舔。一是應用內(nèi)的靜態(tài)文件币励,二是Django自帶的靜態(tài)文件。應用內(nèi)的靜態(tài)文件在djsite/static目錄下珊拼。此外食呻,在INSTALLED_APPS中配置了django.contrib.admin, 則還會有另外一組靜態(tài)文件澎现,在Django安裝位置里仅胞。

例如,一個root在Python 3.6版本安裝的Django剑辫,admin的靜態(tài)文件在: /usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/干旧。

最終,在STATIC_URL里妹蔽,會有兩類靜態(tài)文件椎眯, /static/*/static/admin/*

了解原理胳岂,原因就很顯然了编整。python manage.py runserver知道靜態(tài)文件的位置,而uWSGI不知道靜態(tài)文件在什么位置乳丰。

解決辦法如下:
(1)修改djsite/djsite/settings.py文件:

SITE_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../'))
STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic')

(2)收集所有靜態(tài)文件到collectedstatic目錄
python manage.py collectstatic

(3)修改uwsgi.ini配置

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=collectedstatic

nginx+uwsgi

以上掌测,我們的djsite項目已經(jīng)通過uwsgi方式啟動起來,并且可以保持后臺運行产园。nginx配置不改變的情況下汞斧,我們可以正常訪問 http://django.voidking.com/blog/index 。此時淆两,nginx作為反向代理断箫,和uwsgi間通過http交互。

接下來秋冰,就配置下nginx和uwsgi通過socket結(jié)合的方式仲义。原理:用戶發(fā)送http請求到nginx,nginx通過socket把請求交給uwsgi,uwsgi拿到django的處理結(jié)果埃撵,通過socket返還給nginx赵颅,nginx通過http返回結(jié)果給用戶。

1暂刘、因為nginx和uwsgi通過socket方式交互饺谬,我們需要修改uwsgi.ini的配置為:

[uwsgi]
socket = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=collectedstatic
master = true
processes = 2
enable-threads = true
daemonize = /home/web/djsite/uwsgi.log

2、重啟supervisor
systemctl stop supervisord
systemctl start supervisord

3谣拣、修改nginx配置djsite.voidking.com.conf:

server {
    listen      80;
    server_name djsite.voidking.com;
    charset     utf-8;

    location / {
        uwsgi_pass     127.0.0.1:8000;
        include        uwsgi_params;
    }
}

5募寨、重啟nginx
./nginx -s reload

6、測試訪問
此時森缠,訪問 http://ip:8000/blog/index 失敗拔鹰,訪問 http://django.voidking.com/blog/index 正常。因為8000端口不再提供http服務贵涵,而是一個和nginx連接的socket列肢。

加速靜態(tài)資源

1、修改nginx配置djsite.voidking.com.conf:

server {
    listen      80;
    server_name djsite.voidking.com;
    charset     utf-8;

    location / {
        uwsgi_pass     127.0.0.1:8000;
        include        uwsgi_params;
    }

    location /static {
        alias /root/djsite/collectedstatic;
    }
}

2宾茂、修改nginx.conf

user root;

3瓷马、重啟nginx
./nginx -s reload

小結(jié)

至此,django部署完畢跨晴,我們實現(xiàn)了三種部署方法:

  • nginx + django(http方式)
  • nginx + uwsgi(http方式)
  • nginx + uwsgi(socket方式)

書簽

使用uWSGI提供靜態(tài)文件 (更新至1.9)

解決uWSGI里的Django靜態(tài)文件丟失

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欧聘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坟奥,更是在濱河造成了極大的恐慌树瞭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱谁,死亡現(xiàn)場離奇詭異,居然都是意外死亡孝偎,警方通過查閱死者的電腦和手機访敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣盾,“玉大人寺旺,你說我怎么就攤上這事∈凭觯” “怎么了阻塑?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長果复。 經(jīng)常有香客問我陈莽,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任走搁,我火速辦了婚禮独柑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘私植。我一直安慰自己忌栅,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布曲稼。 她就那樣靜靜地躺著索绪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贫悄。 梳的紋絲不亂的頭發(fā)上者春,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音清女,去河邊找鬼与境。 笑死,一個胖子當著我的面吹牛逻锐,可吹牛的內(nèi)容都是我干的快鱼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼曙博,長吁一口氣:“原來是場噩夢啊……” “哼拥刻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起父泳,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤般哼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惠窄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸眠,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年杆融,在試婚紗的時候發(fā)現(xiàn)自己被綠了楞卡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脾歇,死狀恐怖蒋腮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藕各,我是刑警寧澤池摧,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站激况,受9級特大地震影響作彤,放射性物質(zhì)發(fā)生泄漏膘魄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一宦棺、第九天 我趴在偏房一處隱蔽的房頂上張望瓣距。 院中可真熱鬧,春花似錦代咸、人聲如沸蹈丸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逻杖。三九已至,卻和暖如春思瘟,著一層夾襖步出監(jiān)牢的瞬間荸百,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工滨攻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留够话,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓光绕,卻偏偏與公主長得像女嘲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诞帐,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353