apache+wsgi+python: Premature end of script headers: mytest.py

 今天在windows下面用IDLE的编辑了一个python脚本,然后使用wsgi部署在apache上面,运行的时候总是出现

 

Premature end of script headers: mytest.py

 

这个错误,mytest.py是我的脚本的文件名。

 

google了一堆后,有人说是因为用windows的编辑器编写的代码导致的,因为windows下面的换行符均是CRLF,而apache下面认识的是unix的换行符LF,然后我用utrledit换成unix的换行符,但是发现问题依旧,甚至我换成mac的CR的换行符也不可以。

 

但是如果只是保留下面未注释掉的代码就没有问题,浏览器能够得到服务器的响应并且正确显示结果。

 

下面把脚本列出来

#!c:/Python27/python
#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]

from time import gmtime, strftime
def showtime():
    t = strftime("%Y-%m-%d %H:%M:%S", gmtime()) 
    return t
    
print "Content-type: text/html"
print ""
print "<html><head>"
print "<p></p>"
print "</head><body>"
print "<p align=center>Hello world.</p>"
print "<p></p>"
print "<p align=center>"
print showtime()
print "</p>"
print "<input type=button name='test' />"
print "</body></html>"

 

上面的代码就是输出当前的时间而已。

 

在ubuntu上面的用上面被注释掉的部分就没有问题。我没有记错的,ubuntu和windows下面用的wsgi和python的版本都是一样。

 先把这个问题写在这里,待我慢慢研究。希望路过对这个问题有答案或者有同样问题可以留言。

 

过了这么多天,这个问题终于有了答案:

是因为我的apache的配置文件的一个配置有问题,因为我加了这么一句:

AddHandler cgi-script .cgi .py

 

其实是加了  .py 前面的事先就有的。这就导致了apache一直把以py结尾的请求的文件视为可以直接调用的cgi的脚本,apache每次接到以py结尾的文件时,就会直接用文件最开始的程序也就是

#!c:/Python27/python

这一行指定的python来执行所请求的脚本。而不是我想要的,apache调用mod_wsgi.so,然后由这个动态库来调用python执行所请求的脚本。

 

我之所以在那里加 .py是因为之前,我只是配置apache和python来开发web,后来改为了apache+wsgi+python,但是忘了把这句去掉,虽然我在自己的虚拟主机的配置文件指定了

WSGIScriptAlias

 

<VirtualHost 127.0.0.4:80>  
   ServerAdmin admin@system  
   DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test"  
   ServerName 127.0.0.4 
   WSGIScriptAlias /dynamic "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/dynamic"
     
   ErrorLog logs/dummy-host.example.com-error_log  
   CustomLog logs/dummy-host.example.com-access_log common 
   
   <Directory />
     	Options indexes
     	AllowOverride None
     	Order deny,allow
     	Allow from all
	 </Directory>
	 
	 <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/static">
    	Options FollowSymLinks
    	AllowOverride None
    	Order deny,allow
    	Allow from all
	 </Directory>
	 
   <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/dynamic">
    	Options FollowSymLinks ExecCGI
    	AllowOverride None
    	Order deny,allow
    	Allow from all
	 </Directory>
</VirtualHost> 

 

,但是由于Addhanlder这句是在apache总的配置域中,级别高于我的虚拟机,因此apache仍然执行的是addhandler的策略。因此现在我们的解决办法有2个:

1.  去掉 addhandler中的 .py,保留WSGIScriptAlias

2.  去掉 WSGIScriptAlias, 而保留Addhandler中的 .py。

 

2者只要保留一个即可。

我比较倾向于第一种,因为那样,每个虚拟机就有自己的策略了。

 

这里需要说明另外一个问题,就是如果我们以apache+python的方式来写web,那么python脚本的第一句

#!c:/Python27/python

 

不可以没有,因为apache是凭借这个来确定要那个程序(在这里这个程序就是python解释器)执行对应脚本,其他的脚本程序的执行也是这样,如php和perl;而如果是apache+wsgi+python的方式的话,就可以不写,因为python是由wsgi来调用,而wsgi知道它调用的肯定是python解释器,并且它知道路径。

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示