Apache Mod_wsgi Django Anaconda Python3 配置

Posted Simon Yang Project

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Mod_wsgi Django Anaconda Python3 配置相关的知识,希望对你有一定的参考价值。

本文假设读者具有一定的Linux命令行和python基础

运行环境

Centos-7.4
Anaconda-Python3.6.4
Django-2.0.4
httpd-2.4.33

服务器为腾讯云服务器,httpd是Apache中的服务,安装httpd需要依赖apr、apr-util、pcre
python选用anaconda并且使用conda虚拟环境

首先安装gcc编译器,gcc为编译必须,c++编译器和expat-devel依赖为pcre安装所必须

yum install gcc
yum install gcc-c++
yum install expat-devel

下载源码安装包,注意当使用apr-util,apr1.6版本编译安装httpd时出现xml错误,在/usr/local/httpd/目录下只有modules文件夹。因此1.6版本不适用于httpd的最新版,因此选用1.5版本
选用清华镜像下载速度更快

wget http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz
wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.33.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Linux-x86_64.sh

解压

tar -xzf pcre-8.40.tar.gz
tar -xzf httpd-2.4.33.tar.gz
tar -xzf apr-util-1.5.4.tar.gz
tar -xzf apr-1.5.2.tar.gz

安装

cd apr-1.5.2
./configure --prefix=/usr/local/apr
make
make install

cd ../apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

cd ../pcre-8.40
./configure --prefix=/usr/local/pcre --with-apr=/usr/local/apr

cd ../httpd-2.4.33
./configure --prefix=/usr/local/httpd --with-pcre=/usr/local/pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
make 
make install 

cd ..
bash Anaconda3-5.1.0-Linux-x86_64.sh

将Anaconda命令和httpd启动命令添加到path

vim /etc/profile

在最后添加两行

export PATH=/usr/local/httpd/bin:$PATH
export PATH=/root/anaconda3/bin:$PATH

使profile文件起作用

. /etc/profile

注意.和/之间有个空格
试一下httpd行不行
输入

httpd -k start

相应的,重新启动和停止的命令为

httpd -k restart
httpd -k stop

下面开始配置python django

conda添加清华源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

创建django安装的python3.6环境

conda create -n django python=3.6
source activate django
pip install django

安装mod_wsgi

pip install mod_wsgi

获取mod_wsgi

mod_wsgi-express module-config
LoadModule wsgi_module "/root/anaconda3/envs/django/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/root/anaconda3/envs/django"

修改httpd配置文件

cd /usr/local/httpd/conf
vim httpd.conf

LoadModule中添加一行

LoadModule wsgi_module "/root/anaconda3/envs/django/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"

将这一行

Include conf/extra/httpd-vhosts.conf

取消注释
相应的修改httpd-vhosts.conf文件

cd extra
vim httpd-vhosts.conf

全部注释掉之后添加下面部分

WSGIPythonPath /root/anaconda3/envs/django/lib/python3.6/site-packages:/home/website
WSGIPythonHome /root/anaconda3/envs/django
<VirtualHost *:80>
DocumentRoot /home/website/website
ServerName localhost:80
ServerAdmin jstsyhyjk@163.com

WSGIScriptAlias / /home/website/website/wsgi.py
Alias /static/ /home/website/static/
<Directory "/home/website">
Require all granted
</Directory>
</VirtualHost>

先来看下我django项目的目录结构
这是/home/website内的文件树形图(已省略一部分无关内容)

.
|-- db.sqlite3
|-- manage.py
|-- static
|-- templates
|   `-- index.html
|-- website
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   |-- view.py
|   `-- wsgi.py

配置wsgi.py

import os
from django.core.wsgi import get_wsgi_application
os.environ['PYTHON_EGG_CACHE'] = '/tmp/.python-eggs'
os.environ.setdefault("DJANGO_SETTINGS_MODULE""website.settings")
application = get_wsgi_application()

同时在settings.py中修改这一部分,如果不修改,django会拒绝外部的访问

ALLOWED_HOSTS = ["your server ip"]

一切就绪之后,重新启动

httpd -k restart

访问域名,发现没成功

查看error_log,默认位置在logs内

cat /usr/local/httpd/logs/error_log

可以看到

Permission denied: mod_wsgi (pid=6696): Unable to stat Python home /root/anaconda3/envs/django. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

表示权限不够。因此提升权限,亲测仅提升anaconda文件夹权限不能解决,因此

chmod 755 /root
httpd -k start

访问成功
error_log在网站内部代码运行错误时还会存放错误信息,用于查到代码运行中可能出现的bug
(注意配置中的所有路径信息,如果其中包含括号,则需要在两侧加上引号)


以上是关于Apache Mod_wsgi Django Anaconda Python3 配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_wsgi 在 apache 上设置 Django

Django,apache,mod_wsgi - 错误:脚本头过早结束

Apache + mod_wsgi + django:为积压的请求发送默认响应

Django/Apache 使用 mod_wsgi 冻结

使用 Apache 和 mod_wsgi 在 Centos 上设置 Django

Django + mod_wsgi + apache:ImportError at / No module named djproj.urls