原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處繁疤,謝謝!
前言
最近想要在阿里云服務(wù)器通過(guò)mod_wsgi將django部署在apache(httpd)上躁染。由于本身不是學(xué)習(xí)后端架忌,耗費(fèi)了幾天時(shí)間才真正部署好(網(wǎng)上教程有很多坑)。因此寫(xiě)出完整教程以供后人免于進(jìn)坑叹放。本教程以root用戶進(jìn)行操作(更新于2018年10月28日)。
各工具版本
centos7.4
python3.6.7
django2.1.2
mod_wsgi4.6.4
apache(httpd)2.4.6
安裝pyenv
1. 安裝git
sudo yum install git
2. 安裝pyenv
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l
安裝python依賴(lài)
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel
安裝相應(yīng)版本python埋嵌,我這里使用的是3.6.7版本俱恶。pyenv支持的版本可以通過(guò)如下命令查看:
pyenv install -l
由于pyenv下載python比較慢雹嗦,可以手動(dòng)下載想要安裝的python了罪,這里以3.6.7版本為例(https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz)
新建cache文件夾,
mkdir ~/.pyenv/cache
將下載的Python-3.6.7.tar.xz文件放入cache文件夾里捶惜。
接下來(lái)安裝python
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.7 -v
注意!一定要使用如上命令安裝,否則在安裝mod_wsgi時(shí)會(huì)出現(xiàn)如下錯(cuò)誤
/usr/bin/ld: final link failed: Nonrepresentable section on output
或
error: command 'gcc' failed with exit status 1
或
Error : “apxs:Error: Command failed with rc=65536
之后鹤竭,設(shè)置默認(rèn)python版本為3.6.7
pyenv global 3.6.7
安裝httpd(apache)
sudo yum install httpd httpd-devel
重啟httpd并設(shè)置開(kāi)機(jī)自啟
systemctl restart httpd
systemctl enable httpd
這時(shí)訪問(wèn)localhost或ip應(yīng)該可以看到 Testing 123... 的頁(yè)面,表示httpd安裝成功吝岭。
安裝virtualenv和mod_wsgi
首先安裝virtualenv
pip install virtualenv
創(chuàng)建項(xiàng)目目錄(隨意命名我這里取名wiikvenv)并進(jìn)入
mkdir /home/wiikvenv
cd /home/wiikvenv
創(chuàng)建獨(dú)立環(huán)境并進(jìn)入
virtualenv venv
source venv/bin/activate
這時(shí)安裝mod_wsgi吧寺,這里我們通過(guò)pip方式安裝(PS:網(wǎng)上一大堆安裝mod_wsgi的教程都是天坑啊,比如sudo yum install libapache2-mod-wsgi 或 sudo yum install libapache2-mod-wsgi-py3稚机,這樣安裝會(huì)導(dǎo)致后續(xù)配置遍地是坑!)
mod_wsgi的正確安裝方式如下:
pip install mod_wsgi
最關(guān)鍵一步失乾,分別輸入如下語(yǔ)句:
mod_wsgi-express module-config
會(huì)返回下列語(yǔ)句纬乍,
LoadModule wsgi_module "/home/wiikvenv/venv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/wiikvenv/venv"
復(fù)制這兩句,將其粘貼到/etc/httpd/conf/httpd.conf的最后纽竣。
然后執(zhí)行
chmod 755 -R /root
否則訪問(wèn)域名時(shí)不會(huì)出現(xiàn) Testing 123...茧泪,并且 /var/log/http/error_log 會(huì)出現(xiàn)如下錯(cuò)誤。至于為何出現(xiàn)此問(wèn)題调炬,我也不清楚。刀荒。。
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
安裝django
運(yùn)行下列命令
pip install django
然后創(chuàng)建django項(xiàng)目缠借,具體教程這里不再贅述,不知道的可以百度一下硝逢。
這里假設(shè)已經(jīng)在 /home/wiikvenv 目錄下創(chuàng)建了django項(xiàng)目wiik绅喉,以及創(chuàng)建了應(yīng)用wiikapp,并使用django自帶的runserver命令可以正常訪問(wèn)柴罐。具體目錄結(jié)構(gòu)如下:
/home/wiikvenv/wiik
├── wiikapp
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── tests.py
│ ├── static/
│ ├── templates/
│ └── views.py
├── manage.py
└── wiik
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
接下來(lái)創(chuàng)建httpd配置文件革屠,如下在 /etc/httpd/conf.d 下新建一個(gè)wiik.conf(命名隨意)配置文件:
vim /etc/httpd/conf.d/wiik.conf
并且在新文件中輸入如下內(nèi)容:
<VirtualHost *:80>
ServerName 100.100.100.100 # 你的服務(wù)器 ip 地址
#ServerAlias
#ServerAdmin
Alias /static/ /home/wiikvenv/wiik/wiikapp/static/ #如果有靜態(tài)文件的話,沒(méi)有則注釋掉
<Directory /home/wiikvenv/wiik/wiikapp/static/> # 同上似芝,沒(méi)有則注釋掉
Require all granted
</Directory>
WSGIScriptAlias / /home/wiikvenv/wiik/wiik/wsgi.py #django項(xiàng)目中的wsgi.py文件
WSGIDaemonProcess www-data python-path=/home/wiikvenv/wiik/:/home/wiikvenv/venv/lib/python3.6/site-packages
#這句一定要有(因?yàn)閣sgi.py文件沒(méi)有修改)党瓮,
#并且根據(jù)我的目錄結(jié)構(gòu),換成你自己的目錄結(jié)構(gòu)麻诀,其中 www-data 表示用戶(一般不需要修改)
WSGIProcessGroup www-data # 同樣必須有
<Directory /home/wiikvenv/wiik/wiik>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
最后注意輸入
chmod 755 -R /home # 即將使用virtualenv創(chuàng)建的獨(dú)立環(huán)境的父目錄權(quán)限設(shè)置為755
否則會(huì)出現(xiàn)權(quán)限錯(cuò)誤:
Forbidden
You don't have permission to access / on this server.
完!
總結(jié)
由于python呻率、httpd呻引、django等版本的不同,尤其是httpd以及權(quán)限問(wèn)題逻悠,配置中會(huì)出現(xiàn)很多坑。同時(shí)網(wǎng)上的資料比較老且零散单旁,所以整個(gè)流程順利完成花費(fèi)了我挺長(zhǎng)時(shí)間的饥伊。這一教程是我完整走完并且可以成功運(yùn)行的蔫饰,大家根據(jù)這一教程可以少踩很多坑愉豺!初次發(fā)教程,如有不足還請(qǐng)指正蚪拦。轉(zhuǎn)載請(qǐng)注明出處!