Apache-2.2

mod_wsgi 守護程序模式 - 每個虛擬主機配置的 WSGIDaemonProcess?

  • July 19, 2011

我有一個相當簡單的問題。當 mod_wsgi 在守護程序模式下執行時,您在每個虛擬主機的基礎上啟用WSGIDaemonProcessWSGIProcessGroup指令,這些是否也被其他虛擬主機拾取?

例如,如果我有:

<VirtualHost *:80>
WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
</VirtualHost>

<VirtualHost *:443>
WSGIProcessGroup example.com
</VirtualHost>

第二個 443 虛擬主機會使用第一個 80 虛擬主機中定義的現有“example.com”程序組嗎?還是我必須在第二個 443 虛擬主機中重新定義一個單獨的程序組?

引用文件:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

行為是:

如果在所有虛擬主機容器之外指定了 WSGIDaemonProcess 指令,則可以委託任何 WSGI 應用程序在該守護程序組中執行。如果在虛擬主機容器中指定了 WSGIDaemonProcess 指令,則只有與具有與該虛擬主機相同伺服器名稱的虛擬主機關聯的 WSGI 應用程序才能被委託給該組守護程序。

因此,只要伺服器名稱相同,您就可以訪問先前虛擬主機中的守護程序定義。

您還需要注意以下內容:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIApplicationGroup

WSGIApplicationGroup 的預設值(即,如果未指定)是:

%{資源}

與 %{SERVER} 變數一樣,應用程序組名稱將設置為伺服器主機名和埠,WSGI 環境變數 SCRIPT_NAME 的值將附加到該變數,並由文件分隔符分隔。

例如,如果虛擬主機 www.example.com 正在處理埠 8080 上的請求,並且映射到 WSGI 應用程序的 URL 路徑是http://www.example.com/wsgi-scripts/foo,那麼應用程序組名稱將設置為 www.example.com:8080|/wsgi-scripts/foo。

使用 %{RESOURCE} 變數擴展的效果是,通過映射到自己的 Python 子解釋器,任何伺服器上的每個應用程序都與所有其他應用程序隔離。

因此,通常如果您在不同埠的兩個虛擬主機中為相同的掛載點使用單獨的 WSGIScriptAlias,則兩個應用程序實例仍將通過在不同的子解釋器中執行而分開。

但是對於埠 80/443 情況,此規則有一個例外,即該埠實際上並未包含在應用程序組名稱中。因此,在這種情況下,掛載在同一掛載點的應用程序將在同一子解釋器中執行。

此異常可能沒有盡可能清楚地解釋,但已包含在定義中:

%{伺服器}

應用程序組名稱將設置為伺服器主機名。如果請求通過非標準 HTTP/HTTPS 埠到達,則埠號將作為後綴添加到以冒號分隔的組名中。

例如,如果虛擬主機 www.example.com 正在處理標準 HTTP 埠 (80) 和 HTTPS 埠 (443) 上的請求,則到達任一埠的請求都會看到應用程序組名稱設置為 www.example.com . 如果虛擬主機正在處理埠 8080 上的請求,則應用程序組名稱將設置為 www.example.com:8080。

該擴展被用作上述預設擴展的一部分。

引用自:https://serverfault.com/questions/291952