设为首页 收藏本站
查看: 781|回复: 0

[经验分享] django 1.5.1 apache2 wsgi 配置教程

[复制链接]

尚未签到

发表于 2015-12-23 14:52:26 | 显示全部楼层 |阅读模式
  之前有篇文档写到,django 的 apache 部署很恶心,我没太明白什么意思,实际自己操作时,才深有体会,恶心的意思是:明明感觉很简单,看别人的文档也挺短,但如果新手可能要弄1、2天才行,而且最关键的是毫无成就感。原因是变数太多:


  • 文档的时效性
  • 平台环境
  • 软件环境
  • 目标的目录配置
  • 主机域名等的设置
      ...

  这些的不同,造成软件的部署过程总是磕磕绊绊。为了降低挫折感,本文通过分步骤试验逐渐实现最终目标。
  参考文档:

  • django+wsgi 我是照着这篇首次成功的
  •   apache 配置文档
  •   apache2 ubuntu环境配置
  软件环境


  • ubuntu 12.04 64位
  • python 2.7.3
  • django 1.5.1
  • apache 2.2
  • mod_wsgi 3.3
  目标

  • 在 ~/firstdj 中建立一个django项目
  • 使用 apache wsgi 方式提供web服务
  • 通过 http://firstdj/ 访问hello页面
准备:安装需要的软件
  这个比较简单,没什么特别注意的。

# 安装 apache2

  $ sudo apt-get -y install apache2-mpm-worker apache2-dev

# 安装 python

  $ sudo apt-get -y install python python-dev python-setuptools

# 安装 python 的辅助软件

  $ sudo easy_install virtualenv virtualenvwrapper pip
实验一、使用apache2提供静态页面
  目的:

  • 验证 apache2的安装
  • 配置虚拟主机
apache 预备知识
  可执行程序 /usr/sbin/apache2
  配置文件目录 /etc/apache2/
  网站(web)文件目录 /var/www
  这个可以配置,修改 /etc/apache2/sites-available/default 这个文件的下面的字段 DocumentRoot /var/www ,比如你改到/var/temp 那么就把这行改成:
  DocumentRoot /var/temp
  配置文件并不是在httpd.conf里面,而是apache2.conf,而这里面并没有配置所有的东西,如端口是在ports.conf这个文件里面,而网站的根目录是在
  /etc/apache2/sites-available/default
  这个文件中。 虽然也有httpd.conf这个文件,但是httpd.conf里面是空的,其实你可以在这里面加一些配置,因为apache2.conf里面会把httpd.conf加到它的文件里面。
操作思路

  • 修改主机名字为 firstdj ,作为域名
  • 禁用系统默认的 default 虚拟站点
  • 建立一个最简化的虚拟主机,使用 http://firstdj/ 访问。
具体步骤

  • 修改主机名
  通过修改/etc/hostname把主机名改为 firstdj ,为了清晰,进入root账户)。

            $ sudo su
# echo "firstdj" > /etc/hostname
# echo -e "\n127.0.0.1 firstdj.local firstdj\n" >> /etc/hosts
# hostname -F /etc/hostname

  默认这个时候已经能够在 http://firstdj/ 访问了。如果你能够看到 It works! 页面,说明 apache2 安装正常。否则检查 apache2 是否在运行:

            $ sudo su
# service apache2 status      # 查看状态
# service apache2 start       # 启动
# service apache2 stop        # 停止
# service apache2 reload      # 重新应用配置文件
# service apache2 restart     # 重新启动进程



  • 配置虚拟主机
  虽然这时候能够访问 http://firstdj/ ,但实际上是ubuntu系统本身安装后给的默认配置

            $ cd /etc/apache2                  # 进入 apache2 的配置目录
$ ls ./sites-enabled               # 查看当前生效的站点
返回 000-default , 这是ubuntu默认启动的站点

$ sudo su
# a2dissite default                # 取消默认站点 default
这时候sites-enabled目录下没有文件
# service apache2 reload           # 使配置生效

  现在刷新一下 http://firstdj/ ,应该已经不能访问了。现在 /etc/apache2/sites-available/ 目录下,建立一个名为 firstdj 的文件,为了清晰,我尽量进行了删减,具体内容如下:

               
ServerName firstdj
DocumentRoot /var/www


  配置文件建立完毕,我们让它生效。

            $ sudo su
# a2ensite firstdj                 # 激活 firstdj 站点
# ls /etc/apache2/sites-enabled/   # 查看当前生效的站点
返回 firstdj ,表示只有firstdj站点有效

# apachectl configtest             # 检查一下 apache2 配置文件语法
返回结果:
apache2: Could not reliably determine the server's
fully qualified domain name, using
127.0.0.1 for ServerName
Syntax OK

# echo -e "\nServerName firstdj\n" >> /etc/apache2/apache2.conf
在 apache2.conf 中增加主机名后解决报错问题

# apachectl configtest             # 这次结果应该只有 Syntax OK

# service apache2 reload

  现在又能够正常访问 http://firstdj/ 。
实验二、安装配置 wsgi 模块
操作思路

  • 安装 wsgi 模块
  • 配置一个简单的虚拟主机
具体步骤

  • 安装 mod_wsgi
  我为了省事,采用源安装,如果需要3.4版本,可以采用源码安装,参考这里。

  • wsgi主站
  • 编译安装wsgi

            $ sudo apt-get install libapache2-mod-wsgi   #安装 mod_wsgi

$ sudo dpkg -l libapache2-mod-wsgi           #查看wsgi的版本
结果: libapache2-mod 3.3-4build1

$ a2enmod wsgi                               #验证模块安装正常
Module wsgi already enabled



  • 验证 wsgi
  为了验证wsgi的正常使用,准备手工建一个最简单的wsgi应用,实际就是一个py脚本。

  •   在 /var/www/目录下,建立一个名为 main.wsgi 文件,内容如下:

       def application(environ, start_response):  
    status = '200 OK'  
    output = 'Hello World!\n试试中文'  
    response_headers = [('Content-type', 'text/plain'),  
    ('Content-Length', str(len(output)))]  
    start_response(status, response_headers)  
    return [output]
  •   在 /etc/apache2/sites-available/firstdj 中增加一行,同时可以取消 DocumentRoot 配置,修改后内容如下:

       
    ServerName firstdj

    WSGIScriptAlias / /var/www/main.wsgi
  •   应用配置

            $ sudo service apache2 reload

  现在刷新 http://firstdj 能够返回
  Hello World!
  说明 wsgi 解析正常
实验三、直接安装django
  在实际生产环境,通常会使用 virtualenv 来支持多版本的python应用,但是同样也增了 wsgi 的配置复杂性,所以先进行最简单的试验。
  目的:

  • 在本机安装 django
  • 配置 apache + wsgi
操作思路

  • 在系统范围安装 django (不使用 VirtualEnv)
  • 使用 wsgi 解析 django
  • 跑通 django book 的 helloworld 例子.
具体步骤

  • 安装 django

            $ sudo pip install django

  系统默认会把 django 安装到 /usr/local/lib/python2.7/dist-packages 目录中


  • 在 ~/目录建立一个 django 项目

            $ cd ~                                  # 进入home目录
$ django-admin.py startproject firstdj  # 建立一个 firstdj 项目
$ cd ~/firstdj
$ python manage.py runserver            # 启动django测试服务器

  访问 http://127.0.0.1:8000/ ,能够看到 django 的 It Worked! 页面,说明django安装正常。


  • 配置 wsgi 解析 django

         1. 修改 django 项目的 ~/firstdj/firstdj/wsgi.py 文件

  去掉注释后,默认的 wsgi.py 文件内容为:

                import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdj.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

  增加 firstdj 项目的路径到系统路径,修改后完整的 wsgi.py 文件内容如下:

                import os

import sys
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, os.path.abspath(os.path.join(root_path, 'firstdj')))
sys.path.insert(0, root_path)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdj.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

2. 修改 apache2 的配置文件 /etc/apache2/sites-available/firstdj

  更换文件中的 main.wsgi 为刚才修改的 wsgi.py , 修改后的内容是:

               
ServerName firstdj
WSGIScriptAlias / /home/bl/firstdj/firstdj/wsgi.py


3. 重新应用 apache2 配置文件

$ sudo service apache2 reload

  访问 http://firstdj/ ,能够看到 django 的 It Worked! 页面,说明django安装正常。


  • 建立一个 django 的 hello world

        1. 新建 ~/firstdj/firstdj/views.py 文件,内容如下:

# -*- coding: UTF-8 -*-
from django.http import HttpResponse

def hello(request):
return HttpResponse("This is django Hello World")

2. 修改 ~/firstdj/firstdj/urls.py 文件,增加 hello的映射,去掉注释后内容如下:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',

url(r'^$', 'firstdj.views.hello'),

)

3. 验证 hello world 正常

$ cd ~/firstdj/
$ python manage.py runserver

  访问 http://127.0.0.1:8000/ ,能够看到 This is django Hello World 页面,说明 hello 配置正常。

        4. 重新应用 apache2 配置文件

$ sudo service apache2 reload

  访问 http://firstdj/ ,能够看到 django 的 This is django Hello World 页面,说明django 被 wsgi 正常解析了。
实验四、通过 virtualenv 使用 django
  在刚才成功的基础上,使用 virtualenv 的方式使用 django,核心的问题是修改 ~/firstdj/firstdj/wsgi.py 文件,指定正确的。
  目的:

  • 配置 virtualenv 环境下的 django + apache + wsgi
  • virtualenvwrapper 方式下的配置
操作思路

  • 删除系统级的 django
  • 在 ~/firstdj/ 目录下,配置 virtualenv
  • 使 http://firstdj/ 生效
  • 使用 virtualenvwrapper 方式
具体步骤

  • 删除系统 django

            $ sudo pip uninstall django



  • 在 ~/firstdj/ 目录下建立 venv 环境

            $ cd ~/firstdj/
$ virtualenv venv

  现在 ~/firstdj/ 目录下的结构是:

    /home/bl/firstdj
|---venv
|    |---local
|    |---include
|    |---lib
|    |    |---python2.7
|    |    |        |---site-packages
|    |    |        |            |---pip-1.3.1-py2.7.egg
|    |    |        |            |                  |---EGG-INFO
|    |    |        |            |                  |---pip
|    |    |        |            |                  |    |---commands
|    |    |        |            |                  |    |---backwardcompat
|    |    |        |            |                  |    |---vcs
|    |    |        |---distutils
|    |---bin
|---firstdj



  • 在新建的 venv 环境下安装 django

            $ cd ~/firstdj/
$ ~/firstdj/venv/bin/pip install django



  • 把新建的 venv 环境下的python 包路径(~/firstdj/venv/lib/python2.7/site-packages/) 加入系统路径中。

         1. 在 ~/firstdj/firstdj/wsgi.py 文件中增加一行,修改后内容如下:

import os
import sys

root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, os.path.abspath(os.path.join(root_path, 'firstdj')))
sys.path.insert(0, root_path)

sys.path.insert(0, os.path.abspath(os.path.join(root_path, 'venv/lib/python2.7/site-packages/')))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdj.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

2. 重新应用 apache2 配置

$ sudo service apache2 reload

  现在访问 http://firstdj/ ,又能够看到 django 的 This is django Hello World 页面。


  • 最后一步就是在 virtualenvwrapper 环境下配置 wsgi , 和普通 virtualenv 的环境的唯一不同是virtualenvwrapper 的python 安装包路径默认在 ~/.virtualenvs 目录下,比如以环境名 ELC 为例,它的安装包路径是:

            /.virtualenvs/ELC/lib/python2.7/site-packages



  • 相应的修改 ~/firstdj/firstdj/wsgi.py 文件,修改后内容如下:

            import os
import sys

root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, os.path.abspath(os.path.join(root_path, 'firstdj')))
sys.path.insert(0, root_path)

sys.path.insert(0, '/home/bl/.virtualenvs/ELC/lib/python2.7/site-packages/')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdj.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

  再次重新应用 apache2 配置后,访问 http://firstdj/ ,又能够看到 django 的 This is django Hello World 页面。


  • 增加django的静态链接
  为了能够访问 django 的静态文件,比如各种模版,还需要在 /etc/apache2/sites-available/firstdj 中设置一些别名,最终完整的 apache2 虚拟站点通常是这个样子:

        
ServerAdmin root@firstdj
ServerName firstdj

Alias /site_media/ /home/bl/firstdj/site_media/
Alias /robots.txt /home/bl/firstdj/site_media/robots.txt
Alias /favicon.ico /home/bl/firstdj/site_media/favicon.ico
Alias /static/ /home/bl/.virtualenvs/ELC/lib/python2.7/site-packages/django/contrib/admin/static/

CustomLog "|/usr/sbin/rotatelogs /home/bl/firstdj/logs/access.log.%Y%m%d-%H%M%S 5M" combined
ErrorLog "|/usr/sbin/rotatelogs /home/bl/firstdj/logs/error.log.%Y%m%d-%H%M%S 5M"
LogLevel warn

WSGIDaemonProcess firstdj user=bl group=bl processes=1 threads=15 maximum-requests=10000 python-path=/home/bl/.virtualenvs/ELC/lib/python2.7/site-packages/
WSGIProcessGroup firstdj
WSGIScriptAlias / /home/bl/firstdj/firstdj/wsgi.py


Order deny,allow
Allow from all
Options -Indexes FollowSymLinks

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155331-1-1.html 上篇帖子: 13个实用的Apache Rewrite重写规则 下篇帖子: apache2配置方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表