在一台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会告诉你检查本机是否有mysqlclientPython-MySQL,统统装上。

配置好了之后,运行python manage.py check

dbshell 可以正常连接到mysql,然而其他命令比如checkmigraterunserver全都蜜汁挂起,不知道哪里出了问题。。

鉴于本项目没什么存储需求,而且因为403的原因浪费了许多时间,先把这个项目码完再尝试mysql吧。。(虽然每次都说以后填坑,却从来没填过坑)

[Django笔记] Apache + mod-wsgi 环境部署所遇到的各种问题总结的更多相关文章

  1. 10: Django + Uwsgi + Nginx 的生产环境部署

    1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI:  最早的协议 2. FCGI:  比CGI快 ...

  2. Django + Uwsgi + Nginx 的生产环境部署实战

    目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...

  3. 11: Django + gunicorn + Nginx 的生产环境部署

    1.1 gunicorn介绍   1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...

  4. Kettle学习笔记(一)— 环境部署及运行

    目录 Kettle学习笔记(一)-环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 Kettle简介 Ket ...

  5. Django + Uwsgi + Nginx 的生产环境部署

    使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...

  6. ubuntu Django + Uwsgi + Nginx 的生产环境部署

    一.概述 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇 ...

  7. 新手上路,django学习笔记(1) 环境部署

    很多年没写代码了,以前学的C#,用ASP.NET,但是最近几年没落了,JAVA在崛起,最近感觉Python比较火,总是在各种技术场合听到Python,或者身边的朋友在讨论Python,所以突然想学习一 ...

  8. Django + Uwsgi + Nginx 实现生产环境部署

    本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方 ...

  9. django+nginx+uwsgi的生产环境部署(Ubuntu16.04)

    一,准备工作: 代码一定要能本地跑起来! 各种基础包的安装略默认已经安装python3,nginx,uwsgi等基础依赖,注意版本问题. 本地setting.py文件修改如下(改为生产模式,把debu ...

随机推荐

  1. AngularJS学习笔记(四) 自定义指令

    指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...

  2. [原]NYOJ-子串和44

    大学生程序代写 /*子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使 ...

  3. WEBRTC基本介绍

    “WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Glob ...

  4. 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 ...

  5. Java Modifiers

    Private means this could only be seen within this class. Protected means "package private" ...

  6. bzoj 1023 [SHOI2008]cactus仙人掌图 ( poj 3567 Cactus Reloaded )——仙人掌直径模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 因为lyd在讲课,所以有 ...

  7. Mac搭建nginx+rtmp服务器

    nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 一.安装Homebrow 已经安装了brow的可以直接跳过这 ...

  8. js 函数定义的两种方式以及事件绑定(扫盲)

    一.事件(例如:onclick)绑定的函数定义放在jsp前面和放后面没影响 二. $(function() { function func(){}; }) onclick通过如下方式绑定事件到jsp中 ...

  9. [java] volatile关键字对while循环条件提升问题补充

    在java并发编程中,代码如下: volatile boolean asleep; ... while(!asleep){ countSomeSheep(); } 如果此处忘记将asleep变量设置为 ...

  10. IO系列之File

    1 File类 1.1 目录列表器 在这里我主要是参考Think in Java的内容从而做的一些总结以及扩展.Java中的IO流的设计应该说是Java中最经典的,最学院式的设计,包括它的整体架构设计 ...