操作环境:

  • 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 zqxt
sudo find zqxt -type d -exec chmod \{\} \;

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时的心得,如果还不明白,可以去自强学堂看看。

如何将Django部署到Apache服务器上的更多相关文章

  1. Django项目部署到Apache服务器上

    之前写了把Django部署到XAMPP上,但是有bug,翻apache日志的时候发现会无法import _ssl,然后我就怒而直接装apache2了 配置方法大约和这篇文章差不多 安装必要的包 sud ...

  2. Django项目部署到Apache服务器

    本文讲述的是在阿里云服务器(ECS)上部署Django项目于Apache,服务器操作系统为ubuntu,公网Ip地址为123.56.30.151. 将Django部署到Apache服务器的原因 Dja ...

  3. django部署到apache上(非常重要的,3者版本要一致,是32位就都要是32位的)

    网上把django部署到apache的文章挺多的,但是按照大家的操作,并没有一次就成功,还是遇到了一些问题,这里主要有以下几个情况. 1.网上找到的mod_wsgi的版本问题,导致动态库加载不上. 2 ...

  4. django项目部署在Apache服务器中,静态文件路径的注意点

    django Apache部署静态文件的路径注意点 静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中. 当 DEBUG = True 时, ...

  5. 详细的图文教程来实现 eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上

    很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,通过图文解说的方法,最直观的向大家演示一遍该配置过程. 第一部分:eclipse环境下如何配 ...

  6. Django部署到Apache Web Server

    Windows环境下,将Django部署到Apache Web Server 在Windows上部署Django(用mod_wsgi)会出现各种奇怪的问题,现简单记录下配置过程及遇到的错误及解决方法. ...

  7. springboot 定时任务部署至linux服务器上后会执行两次问题

    springboot定时任务在本地运行时,正常执行且只执行一次,但是在maven打包成war包,部署至linux服务器上之后,定时任务奇怪的执行了两次. 由于未做负载均衡,所以可以先排除是因为多台服务 ...

  8. 在Apache服务器上安装SSL证书

    参考:链接 前提条件 1.您的Apache服务器上已经开启了443端口(HTTPS服务的默认端口) // 开通443端口 firewall-cmd --zone=public --add-port=4 ...

  9. django程序在windows服务器上发布

    django程序在windows服务器上发布 参考文献:https://www.cnblogs.com/djangocn/p/10227006.html 1.安装 IIS 和 GCI 打开服务器管理器 ...

随机推荐

  1. iOS开发——生命周期

    为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...

  2. explorer.exe中发生未处理的win32异常

    explorer.exe中发生未处理的win32异常的错误提示,是windows系统比较常见的错误事件,多数在开机遇到,也有在电脑使用过程中遇到. 了解explorer.exe进程 从百度百科了解到, ...

  3. Java 常用工具类之基本对象包装类

    为了方便操作基本数据类型值, 将其包装成对象, 在对象中定义了属性和行为, 丰富了该数据的操作. 用于描述该对象的类就称为基本数据类型对象包装类. 基本数据类型对应关系 基本数据类型(8种) 包装类 ...

  4. 最全的Eclipse使用快捷键

    Eclipse 是一种基于 Java 的可扩展开源开发平台.尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言,Eclipse 还包括插件开发环境等,下面将为大家介 ...

  5. ie6不能播放视频问题

    前几天做项目时碰到一个非常棘手的问题.在我自己本机的ie8上能正常播放视频的程序(ie6也能够),放用户的电脑上就是不能正常播放(可能是用户的机子系统太老或是别的什么原因.详细的我也不太清楚).没办法 ...

  6. Linux上free命令的输出及其他

    一.明确概念 A buffer is something that has yet to be "written" to disk.  A cache is something t ...

  7. Tensorflow 学习笔记(一)TensorFlow入门

    一.计算模型----计算图 1.1 计算图的概念:TensorFlow就是通过图的形式绘制出张量节点的计算过程,例如下图执行了一个a+b的操作. 1.2 计算图的使用 TensorFlow程序一般分为 ...

  8. day3-python的函数及参数

    函数式编程最重要的是增强代码的重用性和可读性 1 2 3 4 def 函数名(参数):     ...     函数体     ... 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函 ...

  9. MySQL-5.7 DELETE语句详解

    1.语法 (1)单表 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (partition_name [, partit ...

  10. zabbix安装配置agent程序之agent配置文件详解

    安装zabbix-agent http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/ 下载:zabbix-agent-3.2.0-1.el6.x86_64.r ...