Linux下将Python的Django项目部署到Apache服务器

作者&投稿:紫宝 (若有异议请与网页底部的电邮联系)
~ 这几天花了点时间,将把django开发好的web项目部署到Apache上,参考了官方的一些文档和互联网上的文档,还是花了比较多的时间,这里把配置的过程说一下。
方便有需要的朋友,可以参考,少走弯路!
1. django项目部署环境说明
操作系统 : Red Hat Enterprise Linux Server release 5.3 (Tikanga) x86_64
apache版本 : httpd-2.2.3-22.el5
mod_wsgi版本 : mod_wsgi-3.2-1.el5 fedora epel可以下载
Django版本 : 1.2.3
python 版本 : 2.5
这里假定Django和Apache已经安装好,并且Django的项目已经开发好。
以上软件包都是通过yum包安装,软件包都是系统标准目录结构!
django开发好的项目目录是 /var/www/html/server,项目目录结构如下(标准django项目目录结构)
?
               

   1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   
#tree -d server/
server/
|-- __init__.py
|-- manage.py
|-- settings.py
|-- backend
|-- static
| |-- images
| |-- locale
| |-- plugins
| `-- themes
| |-- default
| | `-- images
| |-- gray
| | `-- images
| `-- icons
|-- template
`-- view
2. Apache和mod_wsgi配置
修改wsgi配置(/etc/httpd/conf.d/wsgi.conf)
?
               

   1
2
3
4
5
6
7
8
   
#cat /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / "/var/www/html/server/django.wsgi"
Directory "/var/www/html/server"
Order Deny,Allow
Allow from all
/Directory
项目目录中的django.wsgi这个文件是需要新建的,后面会说到如何新建这个文件。
apache使用的标准配置,Apache的DocumentRoot 指向的是 /var/www/html 目录
3. 新建django.wsgi文件
在项目目录/var/www/html/server下新建一个django.wsgi,文件内容如下:
?
               

   1
2
3
4
5
6
7
8
9
10
   
#cat /var/www/html/server/django.wsgi
# -*- coding: utf-8 -*-
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp/.python-eggs'
current_dir = os.path.dirname(__file__)
if current_dir not in sys.path: sys.path.append(current_dir)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
第三行 os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' ,这个settings就是指项目目录下的setting.py文件.
第四行 os.environ['PYTHON_EGG_CACHE'] = '/tmp/.python-eggs' ,指定解压egg文件的cache目录,确保运行apache的用户,能够对此目录有读写权限.
第五,六行 将当前目录自动加入到python的搜索路径,如果项目中有自己写的模块,方便使用和发布
最后,这个django.wsgi文件名可以随便取,例如test.wsgi、app.wsgi等等,但是一定要与/etc/httpd/conf.d/wsgi.conf配置文件中配置保持一致。
如果您这里新建的文件名不是django.wsgi而是test.wsgi,那么/etc/httpd/conf.d/wsgi.conf中的配置就应该修改为
?
               

   1
   
   WSGIScriptAlias / "/var/www/html/server/test.wsgi"
   
4. 修改django项目中的setting.py文件
找到项目目录下的setting.py,对于这里就是/var/www/html/server/setting.py。找到其中的TEMPLATE_DIRS,修改为:
?
               

   1
   
   TEMPLATE_DIRS = ("/var/www/html/server/template",)
   
注意: 模板目录在这里一定要用绝对路劲,而不能用相对路径,当然也有方法动态设置模板路劲
PS:关于mod_wsgi
目前mod_wsgi有两种工作模式:
第一种是嵌入模式,类似于mod_python,直接在apache进程中运行,这样的好处是不需要另外增加进程,但是坏处也很明显,所有内存都和apache共享,如果和mod_python一样造成内存漏洞的话,就会危害整个apache。而且如果apache是用worker mpm,mod_wsgi也就强制进入了线程模式,这样子对于非线程安全的程序来说就没法用了。
这种模式下需要在apache的vhost中如下设置:
?
               

   1
   
   span style="font-family: 'times new roman', times;"WSGIScriptAlias /path /path-to-wsgi/span
   
即可生效,对于小型脚本的话,直接用这种模式即可。
第二种是后台模式,类似于FastCGI的后台,mod_wsgi会借apache的外壳,另外启动一个或多个进程,然后通过socket通信和apache的进程联系。
这种方式只要使用以下配置即可:
?
               

   1
2
3
4
5
6
7
8
9
10
   
#启动WSGI后台,site1是后台名字
WSGIDaemonProcess site1 processes=1 threads=15 display-name=%{GROUP}
#分配当前上下文应该使用哪个WSGI后台,可以放在Location里面指定
WSGIProcessGroup site1
#根据当前上下文的ProcessGroup分配到对应的后台
WSGIScriptAlias /path /path-to-wsgi
在这种模式下,我们可以通过调节processes和threads的值来设置三种MPM的模式:prefork', 'worker', 'winnt'。
winnt模式
?
               

   1
2
3
   
WSGIDaemonProcess example threads=25
wsgi.multithread True
wsgi.multiprocess False
此时processes=1,但是multiprocess为false
如果显式地指出processes为1那么:
?
               

   1
2
3
   
WSGIDaemonProcess example processes=1 threads=25
wsgi.multithread True
wsgi.multiprocess True
worker模式
?
               

   1
2
3
4
   
WSGIDaemonProcess example processes=2 threads=25
wsgi.multithread True
wsgi.multiprocess True
preforker模式
?
               

   1
2
3
   
WSGIDaemonProcess example processes=5 threads=1
wsgi.multithread False
wsgi.multiprocess True
后台模式由于是与apache进程分离了,内存独立,而且可以独立重启,不会影响apache的进程,如果你有多个项目(django),可以选择建立多个后台或者共同使用一个后台。
比如在同一个VirtualHost里面,不同的path对应不同的django项目,可以同时使用一个Daemon:
?
               

   1
2
3
4
5
6
7
   
span style="font-family: 'times new roman', times;"WSGIDaemonProcess default processes=1 threads=1 display-name=%{GROUP}
WSGIProcessGroup default
WSGIScriptAlias /project1 “/home/website/project1.wsgi”
WSGIScriptAlias /project2 “/home/website/project2.wsgi”/span
这样子两个django都使用同一个WSGI后台。
也可以把不同的项目分开,分开使用不同的后台,这样开销比较大,但就不会耦合在一起了。
display-name是后台进程的名字,这样方便重启对应的进程,而不需要全部杀掉。
?
               

   1
2
3
4
5
6
7
8
9
10
11
12
13
   
span style="font-family: 'times new roman', times;"WSGIDaemonProcess site1 processes=1 threads=1 display-name=%{GROUP}
WSGIDaemonProcess site2 processes=1 threads=1 display-name=%{GROUP}
Location “/project1″
WSGIProcessGroup site1
/Location
WSGIScriptAlias /project1 “/home/website/project1.wsgi”
Location “/project1″
WSGIProcessGroup site2
/Location
WSGIScriptAlias /project2 “/home/website/project2.wsgi”/span
对于django 1.0以下的版本,由于官方认定不是线程安全的,所以建议使用多进程单线程模式
?
               

   1
   
   processes=n threads=1
   
对于django 1.0以后,就可以放心的使用多进程多线程模式:
?
               

   1
   
   processes=2 threads=64
   
这样子性能会更好。


python文件的后缀名是什么
python文件的后缀名有:“.py”、“.py3”、“.pyc”、“.pyo”、“.pyd”、“.pyi”、“.pyx”、“.pyz”、“.pywz”、“.rpy”、“.pyde”、“.pyp”、“.pyt”。python文件后缀总结:(1).py:以 py 扩展名的文件是 Python 源码文件,由 python.exe 解释,可在控制台下运行。可用...

将python打包成exe
将python打包成exe的程序有很多,比如py2exe、PyInstaller等等,但是到目前为止,它们对python3.1支持的都不好,所以这里我要介绍一下cx_freeze 4.2.2,它还能支持跨平台,可以在windows和linux运行。cx_freeze的下载网址为 http:\/\/sourceforge.net\/projects\/cx-freeze\/files\/ ,要根据已安装的python版...

python文件后缀是什么
python文件后缀总结:(1).py:这通常是您编写的输入源代码。(2).py3:Python3脚本(Python3脚本通常以.py而不是.py3结尾,很少使用)。(3).pyc:这是编译好的字节码。如果导入一个模块,python将生成一个*.pyc包含字节码的文件,以便再次导入它更容易(也更快)。.pyc二进制文件可以反编译成...

python有哪些特点和优点
应用领域广泛:Python语言的另一大优点就是应用领域广泛,工程师可以使用Python 做很多的事情。例如,Web开发、网络编程、自动化运维、Linux系统管理、数据分析、科学计算、人工智能、机器学习等等。Python语言介于脚本语言和系统语言之间,我们根据需要,既可以将它当做一门脚本语言来编写脚本,也可以将它当做一...

linux编译出.o文件后为什么运行时错出?ubuntu
-o参数就是指执行文件的输出文件。所以用了-o,就不用第二条命令了。这一个命令把编译,链接两步一起做。用两条命令写 gcc -c first.c gcc first.o -o first 主意第一条命令的-c,后面输入源文件名。.o文件与源文件同名。-o如果没有指定,linux默认为a.out为可执行文件名。

汝城县18255047981: 兄弟问你一个问题,在linux中如何运行python 的 *.py文件,对linux系统不熟悉,谢谢先 -
大狐汤盐酸: 分两步:1. python文件需要加:#!/usr/bin/env python2. 更改文件的可执行权限:chmod u+x hello.py hello.py内容如下:#!/usr/bin/env python print "hello world!"

汝城县18255047981: Python脚本在Linux上怎么运行 -
大狐汤盐酸: 有两种方式:1、直接使用python xxxx.py执行.其中python可以写成python的绝对路径.使用which python进行查询.2、在文件的头部(第一行)写上#!/usr/bin/python2.7,这个地方使用python的绝对路径,就是上面用which python查询来的结果.然后在外面就可以使用./xxx.py执行了.因为在linux中,python啊shell这些程序都是普通的文本格式,都需要一种程序去解释执行它.要么调用的时候指定,要么在文件头指定,另外你是感兴趣的话可以看下刘遄老师写的《Linux就该这么学》作为入门的书籍,觉得不错的话采纳下哦~

汝城县18255047981: 如何在linux下运行python程序 -
大狐汤盐酸: 现在一般的linux都预装了python2.x 直接在命令行里运行就行了 python xx.py就可以了 zh@zh:~/pythonpro$ echo "print('hello')" > a.py zh@zh:~/pythonpro$ ls a.py zh@zh:~/pythonpro$ python a.py hello zh@zh:~/pythonpro$

汝城县18255047981: Django部署在linux下,如何调试? -
大狐汤盐酸: 就正常的print,就可以在日志里面找到部署容器log里面找到输出.

汝城县18255047981: linux 终端 运行 python -
大狐汤盐酸: Linux终端中的操作均是使用命令行来进行的.因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来. 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令行窗口 关闭命令...

汝城县18255047981: 如何在Linux中运行Python源文件 -
大狐汤盐酸: 一种方式是直接运行Python源文件,方法是先在终端中用cd命令切换到Python源文件所在的目录,然后以./文件名的方式运行源文件(文件名前面加的是一个英文点号和一个英文斜杠,表示在当前目录下运行文件).但是前提是这个源文件必须...

汝城县18255047981: linux下用什么编译python -
大狐汤盐酸: 一般是用GCC来编译 python 在linux下 的编译安装 1、安装 [root@auh1st ~]# cd /usr/local/src/ [root@auh1st src]# ll 总计 0 [root@auh1st src]# wget http://www.python.org/ftp/python/2.6/Python-2.6.tar.bz2 [root@auh1st src]# tar -jxf Python-2.6.tar.bz2 ...

汝城县18255047981: 如何在linux中运行python -
大狐汤盐酸: 当然首先要安装Python解释器:sudo apt-get install python在Python脚本文件的头部加上:#!/usr/bin/python然后赋予文件执行的权限:chmod +x xxx.py就可以运行了

汝城县18255047981: linux下怎么安装python的运行环境 -
大狐汤盐酸: 1、linux下安装python3 a、 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件)12 yum groupinstall 'Development Tools' yum install zlib-devel bzip2-devel openssl-devel ncurses-devel2 下载 Python3.5代码...

汝城县18255047981: linux下怎么编译python -
大狐汤盐酸: 1. 下载python2.7.5,保存到 /data/qtongmon/software http://www.python.org/ftp/python/2. 解压文件 tar xvf Python-2.7.5.tar.bz23. 创建安装目录 mkdir /usr/local/python274. 安装python./configure --prefix=/usr/local/python27 make make install5. 修...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网