美文网首页我爱编程王喂码
Django + Apache/mod-wsgi 环境部署所遇到

Django + Apache/mod-wsgi 环境部署所遇到

作者: Dapianzi_灰灰鸽 | 来源:发表于2017-11-08 16:30 被阅读0次

    在一台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,不出意外的话应该可以正常访问后台如图


    image

    遇到的大坑##

    安装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文件夹是手动创建的)

    image

    少了个x,这不是可执行权限吗?不管试试看吧
    chmod a+x -R static【2017.10.30补充,文件夹目录需要 x 权限,因为需要打开。。(觉得自己好蠢)】
    然后4!0!3!就!消!失!了!!!

    image

    尝试使用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会告诉你检查本机是否有mysqlclientPython-MySQL,统统装上。
    配置好了之后,运行python manage.py check

    image

    dbshell 可以正常连接到mysql,然而其他命令比如checkmigraterunserver全都蜜汁挂起,不知道哪里出了问题。。
    鉴于本项目没什么存储需求,而且因为403的原因浪费了许多时间,先把这个项目码完再尝试mysql吧。。(虽然每次都说以后填坑,却从来没填过坑)

    相关文章

      网友评论

        本文标题:Django + Apache/mod-wsgi 环境部署所遇到

        本文链接:https://www.haomeiwen.com/subject/midymxtx.html