Django + Apache/mod-wsgi 環(huán)境部署所遇到的各種問題總結(jié)

在一臺(tái)CentOS7機(jī)器上配置Django+apache運(yùn)行環(huán)境

Django安裝##

python2 or python3 ?###

一般情況下Linux系統(tǒng)都有自帶python2,本機(jī)CentOS7上的是python2.7。曾經(jīng)嘗試升級(jí)python3,然后需要修改幾個(gè)系統(tǒng)軟件比如yum,也就是將 python 改成 python2 這種??紤]到這只是個(gè)小項(xiàng)目,在將來(lái)不會(huì)有維護(hù),另外為了方便移植,還是選用python2來(lái)配置環(huán)境。Django的代碼是否在python2與python3通用,目前尚未確定。但是簡(jiǎn)單的移植之后有報(bào)錯(cuò),只是沒有確認(rèn)是否是版本原因?qū)е隆H绻且粋€(gè)生命周期長(zhǎng)而且迭代頻繁的項(xiàng)目,建議從python3開始。

pip install django###

若未安裝pip,先easy_install pip。然后簡(jiǎn)單地pip install django
/var/www/下新建 webpy 項(xiàng)目:

django-admin.py startproject webpy
cd webpy

可以看到已經(jīng)新建了一個(gè)項(xiàng)目/var/www/webpy

Apache 的 mod_wsgi 安裝##

Apache與Python支持###

直接

yum install httpd

,一般這樣安裝的Apache缺少 apxs 支持,因此需要再

yum install httpd-dev*

另外對(duì)于python,需要安裝開發(fā)包 python-devel

yum install python-devel

安裝mod-wsgi###

從官網(wǎng)下載wsgi,https://pypi.python.org/pypi?%3Aaction=search&term=mod+wsgi&submit=search

# 建議替換最新包
wget https://pypi.python.org/packages/28/a7/de0dd1f4fae5b2ace921042071ae8563ce47dac475b332e288bc1d773e8d/mod_wsgi-4.5.7.tar.gz
# 解壓并進(jìn)入目錄
tar -zxvf mod_wsgi-4.5.7.tar.gz && cd mod_wsgi-4.5.7
# 配置路徑
./configure --with-apxs=/[Your path]/apxs --with-python=/[Your path]/python
make && make install

apxs和python具體路徑可以通過 whereis xxx 獲取

Apache 配置 和 wsgi 配置##

同一個(gè)域名下已有另一個(gè)php項(xiàng)目,因此沒有另外配置虛擬域名,而是增加一個(gè)網(wǎng)站子目錄/web

django項(xiàng)目 配置

webpy/wsgi.py開頭添加環(huán)境變量

import sys
# django項(xiàng)目根目錄
sys.path.append('/var/www/webpy')

然后配置 webpy/settings.py

# 配置ip或域名
ALLOWED_HOSTS = ['192.168.0.100', 'test.vhost.com']
...
TIME_ZONE = 'Asia/Chongqing'

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

# django的靜態(tài)文件需要轉(zhuǎn)交給apache處理,
# 這個(gè)目錄里是給`python manage.py collectstatic`命令配置的靜態(tài)文件目標(biāo)目錄
STATIC_ROOT = '/var/www/webpy/static/'
# django 網(wǎng)站的靜態(tài)文件路徑,因?yàn)閐jango在/web子目錄
STATIC_URL = '/web/static/'

然后遷移django的默認(rèn)靜態(tài)文件

python manage.py collectstatic

這個(gè)命令會(huì)把django的默認(rèn)管理后臺(tái)admin的相關(guān)靜態(tài)文件轉(zhuǎn)移到STATIC_ROOT文件夾里,這樣就可以方便我們?cè)赼pache中配置。

Apache 配置

Apache的配置需要注意幾個(gè)關(guān)鍵:

  • 加載mod-wsgi擴(kuò)展
  • 告訴apache,基于什么路徑的請(qǐng)求轉(zhuǎn)交給wsgi處理
  • 告訴apache,那些文件夾下的文件可以被訪問(默認(rèn)的是all denied,因此會(huì)403)
  • 被坑慘了的一點(diǎn),那些靜態(tài)文件需要可執(zhí)行x權(quán)限(不然一直403)【2017.10.30補(bǔ)充,文件夾目錄需要 x 權(quán)限,因?yàn)樾枰蜷_。。(覺得自己好蠢)】

修改httpd.conf(或者在Include的文件夾新建xxx.conf)
參考官方文檔 https://docs.djangoproject.com/ja/1.9/howto/deployment/wsgi/modwsgi/

LoadModule wsgi_module modules/mod_wsgi.so
...
# 只是舉個(gè)例子,實(shí)際上并不重要
Alias /robots.txt /var/www/webpy/static/robots.txt
Alias /favicon.ico /var/www/webpy/static/favicon.ico

# 告訴apache從哪里找靜態(tài)文件,這里的Alias對(duì)應(yīng)上面settings.py的STATIC_URL
Alias /web/media/ /var/www/webpy/media/
Alias /web/static/ /var/www/webpy/static/
# 避免403,很重要
<Directory "/var/www/static">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/webpy/media">
    AllowOverride None
    Require all granted
</Directory>

# 最重要的配置只有這一句,告訴apache什么樣的請(qǐng)求轉(zhuǎn)交wsgi.py處理
# 注意下面注釋的一行,多寫了個(gè)“/”,會(huì)有`Target WSGI script not found or unable to stat: /var/www/webpy/webpy/wsgi.pyxxx`報(bào)錯(cuò)
#WSGIScriptAlias /web/ "/var/www/webpy/webpy/wsgi.py"
WSGIScriptAlias /web "/var/www/webpy/webpy/wsgi.py"

<Directory "/var/www/webpy/webpy">
    <Files "wsgi.py">
        AllowOverride None
        Require all granted
    </Files>
</Directory>

重啟Apache,不出意外的話應(yīng)該可以正常訪問后臺(tái)如圖


image

遇到的大坑##

安裝mod-wsgi###

一般通過apxs安裝需要apxs支持,而yum install安裝版本可能不帶,因此需要打補(bǔ)丁yum install httpd-dev*,然后還需要安裝python-devel開發(fā)包

wsgi 配置網(wǎng)站子路徑###

多了一個(gè)“/”,參考Error: Target WSGI script not found or unable to stat when run django on apache

django admin 樣式丟失(1)-404###

通過python manage.py runserver調(diào)試的時(shí)候,python會(huì)從django的默認(rèn)目錄讀取靜態(tài)文件,但是通過mod-wsgi的時(shí)候,靜態(tài)文件需要交給apache處理。因此我們需要告訴apache從哪里去讀取這些靜態(tài)文件。一種方式是直接指定django目錄,但是為了便于管理,推薦先遷移這部分文件,再在apache中配置這個(gè)新目錄。從django的命令python manage.py collectstatic不難發(fā)現(xiàn),這顯然就是django推薦的處理方式。

django admin 樣式丟失(2)-403###

上面一個(gè)問題解決之后仍然丟失樣式,但是這次在開發(fā)者工具里看到,樣式文件由404變成了403錯(cuò)誤。所以第一時(shí)間想到的是apache配置問題。但是仔細(xì)檢查 httpd.conf 已經(jīng)對(duì)所在的文件夾配置了訪問權(quán)限,經(jīng)過各種鬼畜的修改重啟任然束手無(wú)策,403雷打不動(dòng)。
所以各種想當(dāng)然是沒用的,唯一正確的途徑就是查看錯(cuò)誤日志,apache error_log 顯示:
AH00035: access to /web/static/admin/css/login.css denied (filesystem path '/var/www/webpy/static/admin') because search permissions are missing on a component of the path, referer: http://183.2.213.53/web/admin/login/?next=/web/admin/
search permissions ? 重新看了一下static的權(quán)限(因?yàn)閟tatic文件夾是手動(dòng)創(chuàng)建的)

image

少了個(gè)x,這不是可執(zhí)行權(quán)限嗎?不管試試看吧
chmod a+x -R static【2017.10.30補(bǔ)充,文件夾目錄需要 x 權(quán)限,因?yàn)樾枰蜷_。。(覺得自己好蠢)】
然后4!0!3!就!消!失!了?。?!

image

嘗試使用mysql###

在window使用python3成功配置過mysql存儲(chǔ),沒碰到什么問題。但是在Linux嘗試的時(shí)候,就跪了。。。
首先django的配置很簡(jiǎn)單,就是把默認(rèn)的sqlite3改為mysql,并且配置其他參數(shù)

DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'HOST': '127.0.0.1',
        'NAME': 'dbname',
        'USER': 'user',
        'PASSWORD': 'password',
        'CONN_MAX_AGE': None,
    }    
}

然后安裝mysql支持,django會(huì)告訴你檢查本機(jī)是否有mysqlclientPython-MySQL,統(tǒng)統(tǒng)裝上。
配置好了之后,運(yùn)行python manage.py check

image

dbshell 可以正常連接到mysql,然而其他命令比如check, migrate, runserver全都蜜汁掛起,不知道哪里出了問題。。
鑒于本項(xiàng)目沒什么存儲(chǔ)需求,而且因?yàn)?03的原因浪費(fèi)了許多時(shí)間,先把這個(gè)項(xiàng)目碼完再嘗試mysql吧。。(雖然每次都說(shuō)以后填坑,卻從來(lái)沒填過坑)

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

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

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