2009-04-28 39 views
0

我想加入PHP到Apache網絡服務器的一個俗稱的方法是將其配置是這樣的:配置Apache使用Python就像CGI PHP

ScriptAlias /php5.3 /usr/local/php5.3/bin 
Action application/php5.3 /php5.3/php-cgi 
AddType application/php5.3 .php 

現在我試着寫一個類似配置的Python:

ScriptAlias /python /usr/bin 
Action application/python /python/python 
AddType application/python .py 

我有一個小的測試腳本,看起來像這樣:

print "Content-Type: text/html\n\n" 
print "Test" 

但似乎事情

Premature end of script headers: python 

所以我的第一個,雖然是我的蟒蛇反應是不正確的:因爲Apache的錯誤日誌中說,後續的s是錯誤的。但有內容類型和兩個換行符。此外,使用php-cgi調用的類似PHP腳本的輸出提供了完全相同的輸出。

此外,我還沒有找到一個教程,顯示如何獲取蟒蛇這種方式工作。所以也許這是不可能的,但是我很好奇爲什麼會出現這種情況?或者我錯過了什麼?

+0

只是爲了澄清:我知道替代方案以及如何正確設置python。只是想知道爲什麼這個配置不起作用... – okoman 2009-04-28 19:00:03

回答

5

「所以,也許這是不可能的,但我很好奇,爲什麼是這樣的話?」

正確。這是不可能的。它也從來沒有打算過。

原因1 - Python不是PHP。作爲一個整體,PHP - 希望成爲一個CGI。 Python不。

原因2 - Python本質上不是CGI。這是一個翻譯(幾乎)沒有環境預期。

原因3 - Python從未被設計成CGI。這就是爲什麼Python通常嵌入到小封裝(mod_python,mod_wsgi,mod_fastcgi)中的原因,它可以將CGI環境封裝成對於正在運行的Python程序更有意義的形式。

+0

好吧,我現在讀了一些關於CGI的更詳細的文章,並認爲我明白了這一點。 – okoman 2009-04-28 20:04:55

+0

一旦考慮到每個請求上解釋器啓動的開銷,python就可以在cgi中正常運行。當然,我不會運行一個現代化的網站,但它確實有效。 – JimB 2009-04-28 20:21:52

13

你可以使用任何類型可執行的以CGI。你的問題出現在你的apache配置中,看起來你剛剛完成了。查看apache文檔以獲取更多詳細信息,但不需要Action和AddType。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 

然後刪除以下到您的cgi-bin:

#!/usr/bin/python 
# test.py 
print "Content-Type: text/html\n\n" 
print "Test" 

確保它是可執行文件,並看到/cgi-bin/test.py

1

錯誤的結果「早產腳本頭結尾:「如果.py文件是在使用CRLF字符代替Unix LF的換行符的Windows程序中編輯的,則會發生這種情況。

像Dreamweaver有些程序換行符型的偏好。記事本也使用CRLF。

如果你的主機有一個文件編輯器,你可以退格鍵的電流換行,並通過該編輯器這將改變任何CRLF才重新進入LF他們測試。 Notepad ++只能使用LF。

0

當您打開例如http://localhost/test.py您預計Apache會以某種方式啓動過程/usr/bin/python /var/www/test.py(我。e具有單一命令行參數的解釋器)。但是這不是發生這種情況,因爲Apache使用沒有參數來調用cgi腳本。相反,它通過由CGI標準化的環境變量提供所有信息。

正如其他人指出,使用Python作爲普通的CGI效率低下,但如果出於教育的原因,你仍然希望這樣做,你可以試試這個。

假設默認的Apache的cgi-bin設置是活動,你可以創建一個名爲python一個簡單的包裝(或者不管你選擇),在您的/usr/lib/cgi-bin具有以下內容:

#!/usr/bin/python 
import os 
execfile(os.environ['PATH_TRANSLATED']) 

不要忘記做它可執行:chmod a+x /usr/lib/cgi-bin/python

把這些在你的Apache配置:

AddType application/python .py 
Action application/python /cgi-bin/python 

現在,當你打開http://localhost/test.py Apache將執行/ cgi-bin/python,但沒有參數,但是會填充CGI環境變量。在這種情況下,我們使用PATH_TRANSLATED,因爲它直接指向webroot中的文件。
調用execfile在已打開的python進程中解釋該腳本。