2009-08-03 220 views
9

我已經Django的通過WSGI運行這樣停止WSGI:如何從掛阿帕奇

<VirtualHost *:80> 
    WSGIScriptAlias//home/ptarjan/django/django.wsgi 
    WSGIDaemonProcess ptarjan processes=2 threads=15 display-name=%{GROUP} 
    WSGIProcessGroup ptarjan 
    Alias /media /home/ptarjan/django/mysite/media/ 
</VirtualHost> 

但是,如果在Python我做的:

def handler(request) : 
    data = urllib2.urlopen("http://example.com/really/unresponsive/url").read() 

整個Apache服務器掛起並沒有響應與此backtrace

#0 0x00007ffe3602a570 in __read_nocancel() from /lib/libpthread.so.0 
#1 0x00007ffe36251d1c in apr_file_read() from /usr/lib/libapr-1.so.0 
#2 0x00007ffe364778b5 in ??() from /usr/lib/libaprutil-1.so.0 
#3 0x0000000000440ec2 in ??() 
#4 0x00000000004412ae in ap_scan_script_header_err_core() 
#5 0x00007ffe2a2fe512 in ??() from /usr/lib/apache2/modules/mod_wsgi.so 
#6 0x00007ffe2a2f9bdd in ??() from /usr/lib/apache2/modules/mod_wsgi.so 
#7 0x000000000043b623 in ap_run_handler() 
#8 0x000000000043eb4f in ap_invoke_handler() 
#9 0x000000000044bbd8 in ap_process_request() 
#10 0x0000000000448cd8 in ??() 
#11 0x0000000000442a13 in ap_run_process_connection() 
#12 0x000000000045017d in ??() 
#13 0x00000000004504d4 in ??() 
#14 0x00000000004510f6 in ap_mpm_run() 
#15 0x0000000000428425 in main() 

Debian Apache 2.2.11-7。

同樣,我們可以對被保護:

def handler(request) : 
    while (1) : 
     pass 

在PHP中,我將設置時間和內存的限制。

回答

13

它不是'死鎖超時',你想要另一個指定的,這是爲了一個非常特殊的目的,這將無助於在這種情況下。

就嘗試使用mod_wsgi功能而言,您希望爲WSGIDaemonProcess指令指定'inactivity-timeout'選項。

即便如此,這還不是一個完整的解決方案。這是因爲'inactivity-timeout'選項專門用於檢測守護進程的所有請求處理是否已停止,這不是每個請求超時。如果守護進程是單線程的,它僅等於每個請求超時。除了有助於取消進程之外,如果在此期間沒有任何請求到達,該選項也將有重啓守護進程的副作用。

簡而言之,mod_wsgi級別沒有辦法讓每個請求超時,這是因爲在Python中沒有真正的中斷請求或線程的方法。

您真正需要實現的是應用程序代碼中的HTTP請求超時。我不確定它在哪裏,以及是否已經可用,但是Google搜索'urllib2套接字超時'。

+0

因此,python無法強健運行? Yikes ...聽起來像我應該提交一個mod_wsgi功能請求。 – 2009-08-04 03:44:29

3

如果我很好地理解了這個問題,你想要防止Apache在運行一些隨機腳本時被鎖定。那麼,如果你運行的是不受信任的代碼,我認爲你還有其他的事情需要擔心,比apache更糟糕。

也就是說,您可以使用一些配置指令來調整更安全的環境。下面這兩個是非常有用的:

  • WSGIApplicationGroup - 集合分組WSGI應用程序所屬的應用程序。它允許爲每個用戶分開設置 - 同一應用程序組內的所有WSGI應用程序將在處理請求的進程的相同Python子解釋器的上下文中執行。

  • WSGIDaemonProcess - 爲運行應用程序配置不同的守護進程。守護進程可以以不同於Apache子進程通常運行的用戶身份運行。該指令接受了很多有用的選項,我將列出其中一些:

    • user=name | user=#uidgroup=name | group=#gid

      定義的UNIX用戶和組名名或數字用戶ID或用戶組GID /守護進程應該按照運行。

    • stack-size=nnn

      虛擬存儲器的以字節爲單位的量將要分配給對應於由在的mod_wsgi守護進程創建的每個線程的堆棧。

    • deadlock-timeout=sss

      定義的允許通過之前已經檢測到上Python的GIL一個潛在的死鎖後守護進程關閉並重新啓動秒的最大數目。默認值是300秒。

你可以閱讀更多關於配置指令here

+0

因此,300秒的超時是否意味着apache進程應該殺死我的python守護進程並重新啓動它?因爲整個Apache被鎖定,無法使用。我需要更多線程嗎?減?更多的流程? – 2009-08-03 21:14:21