为了让apache或者nginx或者lighthttpd支持python可以用mod_python的方式,但是由于mod_python这个开源的项目似乎已死,官网地址:
www.modpython.org/
这个项目的从2009后再也没有去继续了,python的版本目前已经到了3.2,但是mod_python最后一个版本
mod_python-3.3.1.tgz 2009-10-03 20:45
却只支持到了python 2.5, 所以如果你一定要用mod_python,那么你安装只能使用python 2.5以前的版本了。
我想使用最新的python的版本,所以不得不放弃mod_python这种方式了。
还有另外一种方式,就是我们要介绍的mod_wsgi+django的方式。
1. 安装apache2
使用命令安装或者源代码安装都可以,这里我采用的是命令安装方式:
sudo apt-get install apache
目前最新的版本是 v2.2,如果你要安装其他版本请使用apache2官方提供的安装包。
安装过程中,同时apache2会安装一个服务apache2供我们启动,停止和重启apache服务。
启动:
sudo service apache2 start 或者
sudo apachectl start
停止:
sudo service apache2 stop 或者
sudo apachectl stop
重启:
sudo service spache2 restart 或者
sudo apachectl restart
注意sudo不能少,否则权限不够,会失败。
安装完后,启动服务,测试一下apache服务器,在 浏览器中输入 http://localhost, 回车看看效果,如果你看到如下的东西,说明apache安装成功:
It works! This is the default web page for this server. The web server software is running but no content has been added, yet.
这里要说一下apache在linux的配置文件。配置文件的名字和位置和windows下面不一样,windows下面apache安装后全部的文件是在一个目录下面,包括可执行程序,对应的动态库,以及配置文件,但是linux下面却是分开的。可执行程序是
/usr/sbin/apache2
配置文件是在
/etc/apache2
网站(web)文件是在:
/var/www
这个当然你可以配置,修改
/etc/apache2/sites-available/default
这个文件的下面的字段
DocumentRoot /var/www
比如你改到/var/temp
那么就把这行改成:
DocumentRoot /var/temp
配置文件并不是在httpd.conf里面,而是apache2.conf,而这里面并没有配置所有的东西,如端口是在ports.conf这个文件里面,而网站的根目录是在上面的提到的
/etc/apache2/sites-available/default
这个文件中。 虽然也有httpd.conf这个文件,但是httpd.conf里面是空的,其实你可以在这里面加一些配置,因为apache2.conf里面会把httpd.conf加到它的文件里面。
2. 安装mod_wsgi
安装mod_wsgi有3种方式,源码安装和二进制文件安装和命令安装。
a. 命令安装:
目前unbuntu提供了2个源,一个针对2.x python,另外一个针对3.x python:
libapache2-mod-wsgi – Python WSGI adapter module for Apache
libapache2-mod-wsgi-py3 – Python 3 WSGI adapter module for Apache
b. 二进制文件安装:
从下列地址下载二进制文件,然后把他们copy到对应的文件夹即可:
http://ftp.cn.debian.org/debian/pool/main/m/mod-wsgi/libapache2-mod-wsgi_3.3-4_i386.deb
c. 源码安装:
通过下面的链接下载源码:
http://code.google.com/p/modwsgi/downloads/detail?name=mod_wsgi-3.3.tar.gz
解压进入该目录,使用configure生成Makefile,
./configure
发现有错误:
apxs: command not found
上网google一堆,发现有人说缺少httpd.devel等等之类的,发现都解决不了问题,后来在mod_wsgi的官网找到了答案:
http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
原来是要安装apache2-dev,使用下列命令安装:
sudo apt-get install apache2-dev
还有一个依赖库就是python-dev
sudo apt-get install python-dev
现在,再来一次configure,发现成功的生成了makefile
接下来就是
make make install
如果没有什么错误这样我们就成功了安装了mod_wsgi
还有一个方法就是直接看看下面的文件存不存在:
/usr/lib/apache2/modules/mod_wsgi.so
3. 配置apache来加载mod_wsgi
如果你的apache是在运行状态,先停止它
sudo service apache2 stop
然后配置apache, 在/etc/apache/httpd.conf加入下面一行:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
注意上面的/usr/lib/apache2/modules/mod_wsgi.so是我的安装路径,如果你的是安装其他的目录,应做出相应的调整,怎么查看这个so安装在什么位置,就用find命令:
sudo find / -name mod_wsgi.so
重启apache
sudo service apache2 start
如果系统找不到你的mod_wsgi.so,apache服务就会启动失败。
4. 安装django
先安装必要的工具
sudo apt-get install python-setuptools sudo apt-get install python-pip
安装 Django
sudo pip install django
django安装在python路径下面的子文件夹下,如下:
/usr/local/lib/python2.7/dist-packages/django
你可以使用下面的命令来查看是否安装成功:
sudo find / -name django
如果看到上面的输出,就表示安装成功。
5. 测试
为了测试的方便,我们新建一个虚拟主机:
sudo vim /etc/hosts
通过上面的命令开发hosts这个文件,添加如下行:
192.168.0.107 wsgi.testserver
上面的IP换成你自己的。然后保存退出。
因为前面我们已经提到,我们的网站是在
/var/www目录下面,所以我们cd到这个目录,创建一个工程目录,创建一个工程文件
cd /var/www sudo mkdir wsgi cd wsgi sudo vim main.wsgi
在main.wsgi输入下列代码:
def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
让后保存推出。
这里少许解释一下上面的都做了些什么。
为了让目录结构比较清晰,我们创建自己的目录wsgi,而不是直接www的根目录下,让后创建一个python文件,这个文件用来生成一个hello world的网页,并且告诉web服务器-这里就是apache,处理状态是成功-200,就这么简单。
接下来,让apache来加载我们自己的工程网站,去apache的配置目录/etc/apache/sites-available, 新建一个我们网站的配置文件。
cd /etc/apache/sites-available sudo vim wsgi
让后在新创建的wsgi文件中输入如下内容:
<VirtualHost *:80> ServerName wsgi.testserver DocumentRoot /var/www/wsgi <Directory /var/www/wsgi> Order allow,deny Allow from all </Directory> WSGIScriptAlias / /var/www/wsgi/main.wsgi </VirtualHost>
激活我们的网站:
sudo a2ensite wsgi
加载我们的网站:
sudo service apache2 reload
这时候,你打开浏览器,输入http://wsgi.testserver, 你就可以看到hello world。 如果你看到了,说明一切ok了。如果没有看到可以留言给我,大家一起研究。
这个东西比较麻烦的,挺耗时间的,花了我大半天的时间,中间出现了一个 server error 500, 最后一个一个排除,发现是main.wsgi文件有语法错误导致。因为我初次搞web server的东西(之前是c++在做桌面和网络应用),所以不知道是什么原因错误,花了不少时间。 后来想到,wsgi既然是一个python文件,那么看看这个文件用python执行会是什么效果,就用
python main.wsgi
结果告诉我,有语法错误,修复这个错误后,浏览器中输入http://wsgi.testserver,看到了想要的结果。
这里说明一点,上面把python脚本保存成后缀wsgi,但是这不是规定,你也可以定义成其他,如常用的后缀名py,或者干脆什么后缀名都不用,都没有问题。
还有一点,上面我们虽然安装了django,但是我们根本没有用到这个框架,因为我觉得先用wsgi+python自己写一些东西,然后再使用django来创建的自己的web应用,能更好的理解django帮我做了哪些事,如何更好的使用它。这好比先熟练的使用win32的编程,然后再使用MFC,你就能更好的理解MFC,更好的使用MFC。
将来我会在其他的博文中接着续写django的学习和使用。
参看文档:
https://docs.djangoproject.com/en/1.2/howto/deployment/modwsgi/
http://blog.stannard.net.au/2010/12/11/installing-django-with-apache-and-mod_wsgi-on-ubuntu-10-04/
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.
很棒,狂顶ing!
很棒的文章,最近一直在研究python,马上django1.6要支持python3.x,想请教阁下python3.x和python2.x的django、mod_wsgi环境同时存在会产生冲突吗?
回复 liwangmj:
看来你还没有理解apache/httpd,mod_wsgi,django,python之间的关系。
你先看看,如果你看完后还是不懂,可以再来问我。
真是写的太好了,省时省力啊。楼主还是学生吗?
楼主为何我到最后一步,得到:
* Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
我按照ifconfig设置的虚拟主机的IP。
不过我也不明白这虚拟主机是干啥的,怎么不像tomcat用localhost,然后项目名区分项目?
完全中 ,博主 太给力了。
你好,请问我最后得到一个页面,但是py文件并没有执行,怎么回事
楼主,我按照你的步骤,最后打开http://wsgi.testserver 浏览器你就提示你下载一个文件,打开后里面是Hello World!
这是怎么回事呢?
/etc/apache/ 这个路径下没有httpd.conf怎么办
没有这个文件,考虑重新安装apache;如果安装之后,还没有,根据你的操作系统查查是不是这个文件应该在什么地方。如果找不到,再回来,告诉我你的操作系统的信息,我帮你看看
env:
Apache/2.4.7 (Ubuntu) mod_wsgi/3.4 Python/2.7.6 configured
error info like this.
[Sun Feb 01 16:11:22.336675 2015] [mpm_event:notice] [pid 7626:tid 140283539433344] AH00489: Apache/2.4.7 (Ubuntu) mod_wsgi/3.4 Python/2.7.6 configured — resuming normal operations
[Sun Feb 01 16:11:22.336722 2015] [core:notice] [pid 7626:tid 140283539433344] AH00094: Command line: '/usr/sbin/apache2'
[Sun Feb 01 08:11:43.355131 2015] [:error] [pid 8963:tid 140283444279040] No handlers could be found for logger "django.request"
please help.
pls point out where you got this error?
你好,我也遇到同样的问题。请问能不能帮我解决一下。我实在是不知道该如何了。。。。
能具体说一下你的做了哪些操作就看到这个错误?这个错误是在什么地方看到的?
请问你的这个问题解决了吗?怎么解决的??麻烦告知我一下。
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Apache/2.2.22 (Ubuntu) Server at 10.218.78.12 Port 80
这个怎么解呀
这个你需要提供apache的log文件,这个文件具体的位置
/var/log/apache2/error.log
关于Internal Server Error
StackOverflow有很详细的解释
由于将’helloworld’改为b’helloworld’即可
https://stackoverflow.com/questions/34838443/typeerror-sequence-of-byte-string-values-expected-value-of-type-str-found/34839029