热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django部署详细版教程(ubuntu+apache2+virtualenv)

阿里云高性能服务器2折起:点我购买学生云服务器114年:点我购买在经历了无数的大坑后,终于按照网上一个比较简单的教程把自己的Blog做好了。后来在部署的时候又发现了无数的坑,于是有

阿里云高性能服务器2折起:点我购买

学生云服务器114/年:点我购买

在经历了无数的大坑后,终于按照网上一个比较简单的教程把自己的Blog做好了。后来在部署的时候又发现了无数的坑,于是有了这篇django部署教程,希望看到这篇教程的同学能少入坑,顺顺利利的部署成功自己的Blog。

希望同学们能认认真真看完此教程,我会尽我所能把每一步都讲的明白(虽然我也是个小白),下面让我们开始这坑爹而又有趣的部署之旅吧:

一、前提和环境

首先,本教程是假设你已经有了一个django项目且能在本机正常运行的外加一个可以正常使用的ubuntu。其次你可以不懂linux,因为照着教程走,不会有太大的问题,但最好有一点python和django基础。

环境:

python 3.4 (一般ubuntu自带py2和py3)

ubuntu-14.10-desktop、ubuntu-14.04-server(可以在win7下使用虚拟机)

django 1.7.1

apache 2.4.7

坑一:务必保持你的开发环境和我上述三个一样,否则可能会出现莫名其妙的问题,这是一个大坑。

二、入坑

virtualenv和django配置

1、首先ctrl+alt+t进入终端,然后我们安装python3-pip,pip类似ubuntu的apt-get可以方便的安装各种python库:

sudo apt-get install python3-pip

坑二:ubuntu默认安装py2和py3,终端输入“python”是py2环境,输入“python3”是py3环境。在ubuntu中如果想使用py3的pip请使用:“pip3”命令。“pip”命令为py2的,这点请注意。

2、安装python的虚拟环境virtualenv,virtualenv是一个可以虚拟多个python环境的东东,比如我的a网站是py2+django1.7开发,b网站是py3+django1.8开发。他们两个想共存于一台电脑上就要用到这个东东:

sudo pip3 install virtualenv

3、创建虚拟环境,此命令会创建一个名为venv的文件夹,位置就在你终端所显示的位置,里面包含了一个python环境。可以把它理解成类似与windows上的一个虚拟机系统,只不过他只是python的。

virtualenv venv

4、激活虚拟环境,相当于开启虚拟机系统,激活后,在这个激活的终端内执行的任何python命令都不会影响真实环境。注意如果你现在没有在venv的上级目录下,下面的命令是会报错的。可以用source后面跟完整的venv的路径。

source venv/bin/activate

5、安装django,到这里,就离最终成功迈出了关键的一步了,终于开始安装我们的主角django了,这里我安装的版本是1.7.1,安装前请再次确认你所开发的或者下载别人的django网站的版本和你安装的保持一致。

pip install -v django==1.7.1

小知识:在这里,我们使用pip而不是pip3的原因是虚拟环境里只有py3的存在,所以我们输入“python”和“pip”所关联的都会是py3的。你可以自己实验下在虚拟环境中输入是不会报错的,而在真实的环境里则会是显示py2。

6、安装所必须的python包,这里请根据你自己所开发的网站需要的包用“pip”进行安装,下面命令是我的blog所需要用到的包:

pip install django-ckeditor
pip install django-haystack
pip install whoosh
pip install jieba
pip install django-pagination-py3==1.1.1

坑三:安装分页插件pagination的时候,如果你是py3,请使用pip install django-pagination-py3==1.1.1命令安装,网上很多文章针对的都是py2的,当你用网上的命令安装这个插件后,在py3下是不会有效果的。

7、安装git,因为我是在server上面部署的,没有图形界面,所以我用git来下载我开发好的网站去部署就需要用到git了。git部分这里不再讲解,原因很简单,因为博主也不是很会啊!其实只要会上传到github然后会下载下来对于此文章来说就够了。如果你不是用的server版那就直接复制粘贴就更方便啦。(复制粘贴的请无视7和8条)

sudo apt-get install git

8、下载所需要的网站,这里我给出一个我的blog的源码,当然这也只是我做实验用的,你完全可以下载下来去学习,修改它。前提是你明白这是一个十分简陋的博客,仅供开发学习使用。

git clone https://github.com/juventusryp/test.git

坑四:如果你是新手刚开始学习django,下载下来后,请使用“mv test my_blog_2″更改文件夹名字,会省去你很多麻烦。

9、初始化数据库,删除根目录下的数据库文件:db.sqlite3和article目录下的migrations文件夹。命令是“sudo rm -rf”加文件名。

然后运行下面的命令初始化数据库:

python manage.py migrate

初始化完毕后,建立后台管理员:

python manage.py createsuperuser

10、至此,一个网站应该是可以正常浏览了,请使用“python manage.py runserver”测试看是否可以正常浏览,如果正常,那么恭喜你,下面再只需要几步,就可以把你的网站部署到服务器上让大家都看到了。

二、部署部分

1、进入ubuntu,安装apache2和mod_wsgi:

sudo apt-get install apache2 libapache2-mod-wsgi-py3

坑五:此处如果你是py2开发的话去掉上述命令最后的“-py3”,否则最好加上。

2、查看apache2版本:

apachectl -v

看看是否是2.4.7版本

3、新建一个网站,这里是创建一个网站的配置文件,具体不再阐述,请自行学习apache的相关文档。

sudo vim /etc/apache2/sites-available/sitename.conf

我的sitename.conf如下,此文件仅作参考,请自行修改里面的相关路径和网址:


# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerName localhost:80
ServerAlias otherdomain.com
ServerAdmin xxx@qq.com
Alias /media/ /home/user/my_blog_2/media/
Alias /static/ /home/user/my_blog_2/static/

Require all granted


Require all granted

WSGIDaemonProcess http://127.0.0.1:80 python-path=/home/user/my_blog_2:/home/user/venv/lib/python3.4/site-packages
WSGIProcessGroup http://127.0.0.1:80
WSGIScriptAlias / /home/user/my_blog_2/my_blog_2/wsgi.py


Require all granted


# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error-my_blog_2.log
CustomLog ${APACHE_LOG_DIR}/access-my_blog_2.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

坑六; 如果在服务器上使用了虚拟环境,配置文档里加上下面三行应该才可以,这里网上很多文章都没有说清楚,当初坑了博主相当长时间。

WSGIDaemonProcess http://127.0.0.1:80 python-path=/home/user/my_blog_2:/home/user/venv/lib/python3.4/site-packages
WSGIProcessGroup http://127.0.0.1:80
WSGIScriptAlias / /home/user/my_blog_2/my_blog_2/wsgi.py

4、修改wsgi文件,我的路径就是/home/user/my_blog_2/my_blog_2/wsgi.py 请找到你的路径修改如下:

"""
WSGI config for my_blog_2 project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
"""
import os
from os.path import join,dirname,abspath
PROJECT_DIR = dirname(dirname(abspath(__file__)))
import sys
sys.path.insert(0,PROJECT_DIR)
os.environ["DJANGO_SETTINGS_MODULE"] = "my_blog_2.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

是不是已经有点看不下去了?不要急,到最后一步了,坚持一下。完成下面的,我们的部署坑之路就算走完了。

5、设置权限,linux下对权限很敏感,建议大家先对这块有所了解。博主就不是很懂,所以很多地方都是根据log来一步一步调试的。

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

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

cd media/
sudo chgrp -R www-data uploads
sudo chmod -R g+w uploads

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

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

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

坑七:如果你是用我的test的网站学习,应该还会有些小问题,比如在写好文章发布的时候会报错,那是因为有个插件的权限问题,请打开debug模式,修改那个插件所在文件夹的权限即可。

6、纳尼!不是说已经可以正常访问了吗,怎么还有!博主保证下面一定是最后一步

切换到目录:/etc/apache2/sites-available/ 运行:

sudo service apache2 reload
sudo a2dissite 000-default && sudo a2ensite sitename.conf
sudo service apache2 restart

如果一切顺利,你的网站就可以通过域名(当然前提是请解析到你的服务器)或者ip来访问了

PS:如果你有任何不懂的地方,欢迎给我留言,我会尽力解答。

其实博主也真的是个小白,希望能有更多的小白来一起交流python,交流django。


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
author-avatar
手机用户2502896257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有