apache+django+mod_wsgi

2019年3月20日 13:22

    本网站用的阿里云服务器,部署环境是Ubuntu16.04 + nginx + django + uWSGI 配置的。但是公司新需要新部署一个website用来做我们自己部门的项目管理自动化,原来这台服务器是用来部署zabbix(其他开发服务器监控),空余的资源也还很大,所以部署在这台服务器上。环境是centOS7.6 + Apache,和之前的配置会有不太一样。特别是nginx 使用的uWSGI 配置,而Apache 使用的是mod_wsgi ,这下载安装mod_wsgi 的过程遇到了极大的坑。下面就简单记录一下基本的配置过程。

    使用Apache代理不像Nginx下载uwsg来处理而是下载mod_wsgi,然后下载无论使用什么鬼办法都会报一个错误,非常烦,怎么都不好使。
error: command 'gcc' failed with exit status 1或
Error : “apxs:Error: Command failed with rc=65536
    解决放方式如下:

 重新安装Python:

参考:https://www.jianshu.com/p/6792d79ccdb0 
安装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依赖:

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel
安装Python3.6.7(一定使用这种方式安装,不然在安装mod_wsgi的时候就会出现上面那个错误)

env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.7 -v  #尤其重要的是"--enable-shared" 在django的官网上有介绍
默认使用Python3.6.7

pyenv global 3.6.7
这个时候需要重新建立虚拟环境,但是如果不指定Python版本会直接从/usr/bin/python 这里获取,这个是我们链接的Python3.7的,所以一定要指定Python的链接
find / -name "python"
mkvirtualenv --python=/root/.pyenv/versions/3.6.7/bin/python venv
虚拟环境安装:

pip3 install virtualenv
pip3 install virtualenvwrapper

vim ~/.bashrc 加入这两行
    
    export WORKON_HOME=/root/.virtualenvs
    source /usr/local/python3Dir/bin/virtualenvwrapper.sh
    
执行生效:source  ~/.bashrc
    
加入path
    find / -name "virtualenv"
    ln -s /usr/local/python3Dir/bin/virtualenv /usr/bin/virtualenv
    
virtualenv 的基本操作:
    mkvirtualenv venv #创建虚拟环境
    mkvirtualenv --python=/usr/local/python3.5.3/bin/python venv #可以指定Python版本
    workon #查看当前所有的虚拟环境
    workon venv #切换虚拟环境
    deactivate #退出虚拟环境
    rmvirtualenv venv #删除虚拟环境
    pip list #查看当前pip安装的包   
完成部署:

    cd /var/www/html
    mkdir _django
    cd _django 
    mkvirtualenv --python=/root/.pyenv/versions/3.6.7/bin/python _django #建立虚拟环境
    pip install mod_wsgi 
    pip install django 
    pip install mysqlclient
Apache配置:

    1.导出apache所需的mod_wsgi模块

mod_wsgi-express install-module 
#LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
#WSGIPythonHome "/root/.virtualenvs/_django"
    2.配置Apache配置文件

#vim /etc/httpd/conf/httpd.conf #末尾追加这一行
LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
    3.新建website的配置文件(配置完后需要重启Apache服务 systemctl restart httpd)

    #vim /etc/httpd/conf.d/django.conf

WSGIPythonHome "/root/.virtualenvs/_django"
Listen 8080        #使用8080端口来监听django服务 
 #这里使用Apache80端口来代理

ServerName 172.20.30.11 #服务器名称,也可以是域名

Alias /static /var/www/html/django/myproject/myproject/static #静态文件配置Require all granted#django下wsgi.py文件所在目录
  
    Require all granted#此django虚拟环境的包位置 ,使用 find / -name "site-packages" 来查找,必须是_django 该虚拟环境
WSGIDaemonProcess myproject python-path=/root/.virtualenvs/_django/lib/python3.6/site-packages
WSGIScriptAlias / /var/www/html/django/myproject/myproject/wsgi.py # django下wsgi.py文件所在全路径
    4.部署django

        1.新建一个django的project

django-admin startproject myproject

        2.添加静态static目录

vim myproject/myproject/settings.py

追加一行:
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
    #如果static的路径不对,在前端渲染的时候是不起作用的
    #我的STATIC_ROOT = os.path.join(BASE_DIR, "myproject/static/")
         3.配置mysql
DATABASES = {
    "default": {
        # Ends with "postgresql_psycopg2", "mysql", "sqlite3" or "oracle".
        "ENGINE": "django.db.backends.mysql",
        # DB name or path to database file if using sqlite3.
        "NAME": "XMASCD", #一定不要在已经是django项目的数据库下,最好就是新建一个数据库
        # Not used with sqlite3.
        "USER": "root",
        # Not used with sqlite3.
        "PASSWORD": "",
        # Set to empty string for localhost. Not used with sqlite3.
        "HOST": "127.0.0.1",
        # Set to empty string for default. Not used with sqlite3.
        "PORT": "3306",
    }
}
          4.创建django默认表
python manage.py makemigrations
python manage.py migrate
         5.创建管理员用户
python manage.py createsuperuser
         6.打开允许访问的域名
#vim myproject/myproject/settings
ALLOWED_HOSTS = ['*']

        7.生成django静态文件

python manage.py collectstatic
          8.修改wsgi入口文件
#vim myproject/wsgi.py

#添加两行
import sys
sys.path.append('/var/www/html/django/myproject') #manage.py同一级下pwd 的路径
         9.修改项目属主权限(貌似不执行也可以
# chmod -R 755 /var/www/html
# chown -R apache:apache /var/www/html
         10.打开浏览器测试
http://172.20.30.11/ (这应该就是django的主页)

总结:

    每个人的环境都或大或小会有不一样,这是我自己搭建的过程,能够适用。遇到的坑一个一个解决,花了应该有一天半时间,特别是解决mod_wsgi这个坑的时候,可把我气的都想砸电脑了。后面偶然看到一个可以解决的办法,试了下可用。一下子就高兴了。如果有什么疑问或者不懂的可以加我QQ或者发邮件到我邮箱,邮箱可能会不容易看到,因为这个邮箱平时也比较少打开。就先这样吧,这才完成了第一小步,后面才是主要事情,开始写系统了。




评论

ming.zhong(2019-04-08 15:03:55)#1楼
业精于勤荒于嬉回复

kit(2019-06-11 10:34:36)#2楼
          @ ming.zhong #1
千里之行始于足下回复