zoukankan      html  css  js  c++  java
  • 如何将Django部署到Apache服务器上

    操作环境:

    • Ubuntu 16.04
    • Apache 2.4
    • Django 1.9
    • Python 2.7
    • mod_wsgi

     前言:本教程纯自己查阅资料后整理,望对大家有帮助!

    1. 安装 mod_wsgi

    这里默认大家已经会如何安装 Apache、Django、Python 了,直接教如何安装mod_wsgi。

    需知:网上有很多用mod_python的,但是mod_python部署的方式在django的1.4及1.4之前是可以的,但是从django1.5开始,废弃了这种方式,django官网推荐使用wsgi方式,也就是我们用的mod_wsgi。

    官方声明如下:

    If you’re new to deploying Django and/or Python, we’d recommend you try mod_wsgi first. In most cases it’ll be the easiest, fastest, and most stable deployment choice.

    安装:

    sudo apt-get install libapache2-mod-wsgi      #Python2
    sudo apt-get install libapache2-mod-wsgi-py3  #Python3

    官方文档:http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/

    2. 建立一个Django工程

     我们在 /var/www 下创建文件夹 mysite,然后键入mysite文件夹

    cd /var/www

    创建Django工程,我们命名为:testproject

    django-admin startproject testproject

    我的目录:(因为我的项目名是wangcwblog,所以就没做更改,如果按照教程来是testproject)

    3. 修改Apache配置文件

    ubuntu的apache2配置文件在 /etc/apache2/ 下。

    新建一个网站配置文件:

    sudo vi /etc/apache2/sites-available/testdjango.conf
    #testdjango.conf名字可以随意换,这里为了直观

     内容如下:

    <VirtualHost *:80>
    ServerName www.yourdomain.com 
    #ServerAlias otherdomain.com
    #ServerAdmin youremail@gmail.com 
    
    # 存放用户上传图片等文件的位置,注意去掉#号
    #Alias /media/ /var/www/wangcwblog/media/
    
    # 静态文件(js/css/images)的存放位置
    #Alias /static/ /var/www/wangcwblog/collected_static/
                    
    # 允许通过网络获取static的内容
    <Directory /var/www/ProjectName/static/>                  
        Require all granted
    </Directory>
    
    # 最重要的!通过wsgi.py让Apache识别这是一个Django工程,别漏掉前边的 /
    WSGIScriptAlias / /var/www/wangcwblog/wangcwblog/wsgi.py   
    # wsgi.py文件的父级目录,第一个ProjectName为Django工程目录,第二个ProjectName为Django自建的与工程同名的目录
    <Directory /var/www/wangcwblog/wangcwblog/>               
    <Files wsgi.py>
        Require all granted
    </Files>
    </Directory>
    
    </VirtualHost>

    通过修改上面的文件,你就可以让Apache找到你的Django工程,上边可以修改的内容包括:

    • 80:修改80为其他数字,可以更改你的端口号,国内的电信貌似把80端口给封了(如果你的域名没有备案的话)。注意,还要修改/etc/apache2/port.conf文件中的Listen *port*
    • ServerName:后边改成你自己的域名,如果没有的话就用IP代替。注意,如果改成了域名,还需要修改Django工程下的seeting.py文件,将其ALLOWED_HOSTS=[]改为ALLOWED_HOSTS=['www.yourdomain.com'],多个域名可以通过逗号隔开。
    • ServerAlias:你的其他域名或IP。

    最后要让这个配置文件生效,你需要运行

     sudo a2ensite testdjango.conf

    有时候,你可能需要让它失效(因为你将yoursite.conf改名为其他名字?),可以运行

    sudo a2dissite testdjango.conf

    做完以上步骤,Apache会提醒你要执行sudo service apache2 relaod,这条命令主要是你手动命令Apache根据你刚才配置的yoursite.conf去寻找Django工程,当然我一般都是restart,如果你的Apache不为其他的网站提供服务,那么你也restart吧,因为重启大法好!每次你修改Django工程文件之后,都要restart一下,它才会生效。

    4. 修改Django的wsgi.py文件

    上面的配置中写的 WSGIScriptAlias 就是把apache2和你的网站Django project联系起来了。

    切换到我们刚刚建立的django项目目录:

    cd /var/www/wangcwblog

    编辑 testproject/wsgi.py 文件:

    sudo vi wangcwblog/wsgi.py

    内容:

    import os
    import sys
    from os.path import join,dirname,abspath
    from django.core.wsgi import get_wsgi_application
     
    PROJECT_DIR = dirname(dirname(abspath(__file__)))
    
    sys.path.insert(0,PROJECT_DIR)
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wangcwblog.settings")
    
    application = get_wsgi_application()

    这个配置文件的作用也是让Apache找到Djanog,毕竟不能一厢情愿吗,Apache同意和Django“交往”了,但是万一人家Django不乐意呢?
    最后,还记得我说的嘛?

    6. 调试错误

    1.如果你的网站没有加载静态文件(js/css/images),请检查你的静态文件是不是在ProjectName/static下,而不是在ProjectName/AppName/static下(改这里边的文件是不用重启Apache的)。

    2.不知道啥问题,就是不管用,请查看Apache的错误文档。
    cat /var/log/apache2/error.log

    3.No module named xxxx。首先检查一下你所依赖的库是否安装全了,没有的话就pip install

    4.No module named django或者其他含django的错误。这说明你的环境搭错了。往上翻error.log,找到AH00489开头的错误,看看你到底用的是什么环境。一般都是你第二步Apache的Python解释器安装错误。

    这里根据可根据提示重启Apache,此时已经成功,访问云服务器的公网IP,或者打开本地IP(127.0.0.1)可以看到如下界面:

    表示Django工程已经成功与Apache链接~~~

    7. 设置目录和文件权限

    一般目录权限设置为 755,文件权限设置为 644 

    假如项目位置在 /home/tu/zqxt (在zqxt 下面有一个 manage.py,zqxt 是项目名称)

    cd /home/tu/
    sudo chmod -R 644 zqxt
    sudo find zqxt -type d -exec chmod 755 {} ;

    apache 服务器运行用户可以在 /etc/apache2/envvars 文件里面改,这里使用的是默认值,当然也可以更改成自己的当前用户,这样的话权限问题就简单很多,但在服务器上推荐有 www-data 用户,更安全。以下是默认设置:

    # Since there is no sane way to get the parsed apache2 config in scripts, some
    # settings are defined via environment variables and then used in apache2ctl,
    # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
     
    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data

    上传文件夹权限

    media 文件夹一般用来存放用户上传文件,static 一般用来放自己网站的js,css,图片等,在settings.py中的相关设置

    STATIC_URL 为静态文件的网址 STATIC_ROOT 为静态文件的根目录,

    MEDIA_URL 为用户上传文件夹的根目录,MEDIA_URL为对应的访问网址

    在settings.py中设置:

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/dev/howto/static-files/
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR,'static')
     
    # upload folder
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR,'media')

    在 Linux 服务器上,用户上传目录还要设置给 www-data 用户的写权限,下面的方法比较好,不影响原来的用户的编辑。

    假如上传目录为 zqxt/media/uploads 文件夹,进入media文件夹,将 uploads 用户组改为www-data,并且赋予该组写权限:

    cd media/ # 进入media文件夹
    sudo chgrp -R www-data uploads
    sudo chmod -R g+w uploads

    备注:这两条命令,比直接用sudo chown -R www-data:www-data uploads 好,因为下面的命令不影响文件原来所属用户编辑文件,fedora系统应该不用设置上面的权限,但是个人强烈推荐用ubuntu,除非你对linux非常熟悉,你自己选择。

    如果你使用的是sqlite3数据库,还会提示 Attempt to write a readonly database,同样要给www-data写数据库的权限

    进入项目目录的上一级,比如project目录为 /home/tu/blog 那就进入 /home/tu 执行下面的命令(和修改上传文件夹类似)

    sudo chgrp www-data blog
    sudo chmod g+w blog
    sudo chgrp www-data blog/db.sqlite3  # 更改为你的数据库名称
    sudo chmod g+w blog/db.sqlite3

    备注:上面的不要加 -R ,-R是更改包括所有的子文件夹和文件,这样不安全。个人建议可以专门弄一个文件夹,用它来放sqlite3数据库,给该文件夹www-data写权限,而不是整个项目给写权限,有些文件只要读的权限就够了,给写权限会造成不安全。


    以上皆参考涂伟忠老师的自强学堂,我自己搭建Django+Apache2时的心得,如果还不明白,可以去自强学堂看看。

  • 相关阅读:
    System.Web.Security下提供了非常简单的MD5加密算法,但处在非Web层的项目要怎么使用MD5加密呢?
    切换用户账户访问共享 记
    从盛大通行证上摘下来的身份证验证代码
    HA_Xenu1.3.6 使用手记
    asp.net跨域共享session(不能跨主机名)
    应用程序池自动关闭
    忘记 win2003 密码 记
    Ajax 入门 【学习手记】
    转载 防盗链
    超链接的 target
  • 原文地址:https://www.cnblogs.com/wangchaowei/p/6857648.html
Copyright © 2011-2022 走看看