在一台CentOS7機器上配置Django+apache運行環境
Django安裝##
python2 or python3 ?###
一般情況下Linux系統都有自帶python2,本機CentOS7上的是python2.7。曾經嘗試升級python3,然后需要修改幾個系統軟件比如yum
,也就是將 python 改成 python2 這種。考慮到這只是個小項目,在將來不會有維護,另外為了方便移植,還是選用python2來配置環境。Django的代碼是否在python2與python3通用,目前尚未確定。但是簡單的移植之后有報錯,只是沒有確認是否是版本原因導致。如果是一個生命周期長而且迭代頻繁的項目,建議從python3開始。
pip install django###
若未安裝pip,先easy_install pip
。然后簡單地pip install django
在/var/www/
下新建 webpy 項目:
django-admin.py startproject webpy
cd webpy
可以看到已經新建了一個項目/var/www/webpy
Apache 的 mod_wsgi 安裝##
Apache與Python支持###
直接
yum install httpd
,一般這樣安裝的Apache缺少 apxs 支持,因此需要再
yum install httpd-dev*
另外對於python,需要安裝開發包 python-devel
yum install python-devel
安裝mod-wsgi###
從官網下載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
# 解壓並進入目錄
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 配置##
同一個域名下已有另一個php項目,因此沒有另外配置虛擬域名,而是增加一個網站子目錄/web
django項目 配置
在webpy/wsgi.py
開頭添加環境變量
import sys
# django項目根目錄
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的靜態文件需要轉交給apache處理,
# 這個目錄里是給`python manage.py collectstatic`命令配置的靜態文件目標目錄
STATIC_ROOT = '/var/www/webpy/static/'
# django 網站的靜態文件路徑,因為django在/web子目錄
STATIC_URL = '/web/static/'
然后遷移django的默認靜態文件
python manage.py collectstatic
這個命令會把django的默認管理后台admin的相關靜態文件轉移到STATIC_ROOT
文件夾里,這樣就可以方便我們在apache中配置。
Apache 配置
Apache的配置需要注意幾個關鍵:
- 加載mod-wsgi擴展
- 告訴apache,基於什么路徑的請求轉交給wsgi處理
- 告訴apache,那些文件夾下的文件可以被訪問(默認的是all denied,因此會403)
- 被坑慘了的一點,那些靜態文件需要可執行
x
權限(不然一直403)【2017.10.30補充,文件夾目錄需要x
權限,因為需要打開。。(覺得自己好蠢)】
修改httpd.conf(或者在Include的文件夾新建xxx.conf)
參考官方文檔 https://docs.djangoproject.com/ja/1.9/howto/deployment/wsgi/modwsgi/
LoadModule wsgi_module modules/mod_wsgi.so
...
# 只是舉個例子,實際上並不重要
Alias /robots.txt /var/www/webpy/static/robots.txt
Alias /favicon.ico /var/www/webpy/static/favicon.ico
# 告訴apache從哪里找靜態文件,這里的Alias對應上面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什么樣的請求轉交wsgi.py處理
# 注意下面注釋的一行,多寫了個“/”,會有`Target WSGI script not found or unable to stat: /var/www/webpy/webpy/wsgi.pyxxx`報錯
#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,不出意外的話應該可以正常訪問后台如圖
遇到的大坑##
安裝mod-wsgi###
一般通過apxs安裝需要apxs支持,而yum install
安裝版本可能不帶,因此需要打補丁yum install httpd-dev*
,然后還需要安裝python-devel開發包
wsgi 配置網站子路徑###
多了一個“/”,參考Error: Target WSGI script not found or unable to stat when run django on apache
django admin 樣式丟失(1)-404###
通過python manage.py runserver
調試的時候,python會從django的默認目錄讀取靜態文件,但是通過mod-wsgi的時候,靜態文件需要交給apache處理。因此我們需要告訴apache從哪里去讀取這些靜態文件。一種方式是直接指定django目錄,但是為了便於管理,推薦先遷移這部分文件,再在apache中配置這個新目錄。從django的命令python manage.py collectstatic
不難發現,這顯然就是django推薦的處理方式。
django admin 樣式丟失(2)-403###
上面一個問題解決之后仍然丟失樣式,但是這次在開發者工具里看到,樣式文件由404變成了403錯誤。所以第一時間想到的是apache配置問題。但是仔細檢查 httpd.conf 已經對所在的文件夾配置了訪問權限,經過各種鬼畜的修改重啟任然束手無策,403雷打不動。
所以各種想當然是沒用的,唯一正確的途徑就是查看錯誤日志,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的權限(因為static文件夾是手動創建的)
少了個x
,這不是可執行權限嗎?不管試試看吧
chmod a+x -R static
【2017.10.30補充,文件夾目錄需要 x
權限,因為需要打開。。(覺得自己好蠢)】
然后4!0!3!就!消!失!了!!!
嘗試使用mysql###
在window使用python3成功配置過mysql存儲,沒碰到什么問題。但是在Linux嘗試的時候,就跪了。。。
首先django的配置很簡單,就是把默認的sqlite3改為mysql,並且配置其他參數
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會告訴你檢查本機是否有mysqlclient
或Python-MySQL
,統統裝上。
配置好了之后,運行python manage.py check
dbshell 可以正常連接到mysql,然而其他命令比如check
, migrate
, runserver
全都蜜汁掛起,不知道哪里出了問題。。
鑒於本項目沒什么存儲需求,而且因為403的原因浪費了許多時間,先把這個項目碼完再嘗試mysql吧。。(雖然每次都說以后填坑,卻從來沒填過坑)