[Django笔记] Apache + mod-wsgi 环境部署所遇到的各种问题总结
在一台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吧。。(虽然每次都说以后填坑,却从来没填过坑)
[Django笔记] Apache + mod-wsgi 环境部署所遇到的各种问题总结的更多相关文章
- 10: Django + Uwsgi + Nginx 的生产环境部署
1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI: 最早的协议 2. FCGI: 比CGI快 ...
- Django + Uwsgi + Nginx 的生产环境部署实战
目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...
- 11: Django + gunicorn + Nginx 的生产环境部署
1.1 gunicorn介绍 1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...
- Kettle学习笔记(一)— 环境部署及运行
目录 Kettle学习笔记(一)-环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 Kettle简介 Ket ...
- Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
- ubuntu Django + Uwsgi + Nginx 的生产环境部署
一.概述 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇 ...
- 新手上路,django学习笔记(1) 环境部署
很多年没写代码了,以前学的C#,用ASP.NET,但是最近几年没落了,JAVA在崛起,最近感觉Python比较火,总是在各种技术场合听到Python,或者身边的朋友在讨论Python,所以突然想学习一 ...
- Django + Uwsgi + Nginx 实现生产环境部署
本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方 ...
- django+nginx+uwsgi的生产环境部署(Ubuntu16.04)
一,准备工作: 代码一定要能本地跑起来! 各种基础包的安装略默认已经安装python3,nginx,uwsgi等基础依赖,注意版本问题. 本地setting.py文件修改如下(改为生产模式,把debu ...
随机推荐
- AngularJS学习笔记(四) 自定义指令
指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...
- [原]NYOJ-子串和44
大学生程序代写 /*子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使 ...
- WEBRTC基本介绍
“WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Glob ...
- 1045 Favorite Color Stripe (30)(30 分)
Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...
- Java Modifiers
Private means this could only be seen within this class. Protected means "package private" ...
- bzoj 1023 [SHOI2008]cactus仙人掌图 ( poj 3567 Cactus Reloaded )——仙人掌直径模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 因为lyd在讲课,所以有 ...
- Mac搭建nginx+rtmp服务器
nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 一.安装Homebrow 已经安装了brow的可以直接跳过这 ...
- js 函数定义的两种方式以及事件绑定(扫盲)
一.事件(例如:onclick)绑定的函数定义放在jsp前面和放后面没影响 二. $(function() { function func(){}; }) onclick通过如下方式绑定事件到jsp中 ...
- [java] volatile关键字对while循环条件提升问题补充
在java并发编程中,代码如下: volatile boolean asleep; ... while(!asleep){ countSomeSheep(); } 如果此处忘记将asleep变量设置为 ...
- IO系列之File
1 File类 1.1 目录列表器 在这里我主要是参考Think in Java的内容从而做的一些总结以及扩展.Java中的IO流的设计应该说是Java中最经典的,最学院式的设计,包括它的整体架构设计 ...