Django +Apache部署在ubantu服务器上

今天折腾了一天,来回试了 apache+mod_wsgi 跟Nginx+Gunicorn各种姿势部署自己的小博客
发现网上搜的教程各种坑

Paste_Image.png

我能说打开的标签窗口数=这图*5吗?

好吧。废话不多说,这里献上我踩坑之路
apache+mod_wsgi

环境以及软件版本

  • ubantu16.04
  • python 3.5
  • django 1.10.4
  • apache 2.4
    顺便扯淡一句:django我习惯用python3.x ,因为python2.X各种字符集问题(谁用谁懂)

如果使用apt-get 安装的软件 请看清版本

1. 第一步:安装各种软件

下载apache并检查版本

sudo apt-get install apache2
apachectl -v 

下载mod_wsgi建立apache与django的联系(看清楚自己python版本下载)

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

安装django

sudo pip3 install django

建立django与apache联系

具体来说,分为以下四步:

  1. 将django项目放在/var/www/目录下
  2. 修改apache虚拟主机配置文件
  3. 配置文件生效
  4. 重启apache服务
    5.修改Django的wsgi.py文件
    重要事情说三遍

以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root

以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root

以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root

apache默认网站目录是/var/www/

1.

cd /var/www/
git clone {yourproject}

好了,你的django項目順利安家了

2.

一般的,apache文件夹结构图为:

# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |--mods-available
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#|--site-available
#|--site-enabled

你需要在site-available文件夹中新建自己项目的配置文件

vi /etc/apache/site-available/{$projectname$}.conf

填入以下信息(或者你可以复制粘贴后修改成自己的配置)


#默认监听80端口
ServerName www.yourdomain.com 
#servername 填自己的域名或者ip
#ServerAlias otherdomain.com
#ServerAdmin youremail@gmail.com 

# 存放用户上传图片等文件的位置,注意去掉#号
#Alias /media/ /var/www/{$ProjectName$}/media/ 

# 静态文件(js/css/images)的存放位置
Alias /static/ /var/www/{$ProjectName$}/static/                

# 允许通过网络获取static的内容
                  
    Require all granted


# 最重要的!通过wsgi.py让Apache识别这是一个Django工程,别漏掉前边的 /
WSGIScriptAlias / /var/www/{$ProjectName$}/{$ProjectName$}/wsgi.py     
# wsgi.py文件的父级目录,第一个ProjectName为Django工程目录,第二个ProjectName为Django自建的与工程同名的目录
                  

    Require all granted




编辑apache中的wsgi.conf文件

vi /etc/apache2/mods-available/wsgi.conf
#在文件中添加以下行:
WSGIPythonPath /var/www/{$projectname$} #项目所在地址
  1. 激活你的配置文件
sudo a2ensite /etc/apache2/ sites-available/{$projectname$}.conf
#重启服务
service apache2 reload
vi /var/www/{$projectname$}/{$projectname$}/wsgi.py

其实要增加的也就#1.#2.#3 3行代码

    import os
    from os.path import join,dirname,abspath#1.
    PROJECT_DIR = dirname(dirname(abspath(__file__)))#2.

    import sys
    sys.path.insert(0,PROJECT_DIR)#3.
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "examsys.settings")

    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

这时候reload一波apache服务,用你的浏览器访问 刚才设置的域名或者外网ip
就可以查看网站

调试错误:

  1. apache服务无法restart或者无法reload
    这时候需要一个神奇的技能了:英语
    根据提示输入
systemctl status apache2.service

然后把终端啦长(坑爹不拉长看不见错误信息)

Django +Apache部署在ubantu服务器上_第1张图片
Paste_Image.png

想这样就好了,
一般是你的{$projectname$}.conf 某行出错

  • No module named xxxx 依赖库没安装完整,请pip安装一波
  • No module named django或者其他含django的错误。这说明你的环境搭错了。往上翻error.log,找到AH00489开头的错误,看看你到底用的是什么环境。一般都是你第二步Apache的Python解释器安装错误。
  • 没事可以看apache错误文档
cat /var/log/apache2/error.log

3.django自带的admin页面无法加载css文件

修改django项目中project/setting.py文件

STATIC_ROOT={$static文件夹的根目录$}

比如我的static目录在 /var/www/project/
即修改如图

Paste_Image.png

然后

python  manage.py collectstatic      #python2
python3  manage.py collectstatic     #python3

会在你的static文件夹中生成admin文件夹,
问题如果还不解决,请去apache/site-available/project.conf中查看 static配置路径是否正确

4. 数据库显示只读

如这样
sqlite3.OperationalError: attempt to write a readonly database

解决办法:
因为我用python自带的sqlite3数据库
将数据库权限设置为www-data

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

5. template文件无法读取

在setting.py文件中
template中指明绝对路径

6. 使用域名或者外网ip的设置后无法访问

在setting.py
中修改allow_host选项

ALLOW_HOST=['{$你的域名或者IP$}']

只需要在[]中添加即可如我的为 =['www.coldsummerday.net']

你可能感兴趣的