2011-10-12 33 views
1

我有一個web應用程序我正在寫mod_perl 2.(這是一個自定義處理程序模塊,而不是註冊表或perlrun腳本)。我想在服務器上設置幾個配置選項初始化,最好來自配置文件。我遇到的問題是,我沒有找到一個好的地方爲我的應用程序的配置文件傳遞一個文件名。mod_perl 2環境中的WebApp配置

我第一次嘗試加載「./app.conf」,但當前目錄不是模塊的位置,所以它是不可預測和容易出錯的。或者,我必須假設一些相對或絕對的路徑。這是不靈活的,如果主機操作系統分佈發生更改,則可能會出現問題。我不想硬編碼路徑(儘管如果沒有更好的方法,/ etc中的某些內容可能是可以接受的)。

我也嘗試過PerlSetVar,但該值在請求時間之前不可用。雖然這是可行的,但這意味着我可能至少每個子進程(線程)初始化一次從磁盤讀配置文件。我寧願在服務器初始化時加載,並且在創建子進程時擁有不可變的靜態哈希,這是生成環境的一部分。

我考慮過使用config.pl,但這意味着我要麼有一個config.pl,要麼有一個選項來配置在哪裏找到app.conf文件,要麼將選項本身移動到config.pl中,用戶在設置選項時遵守Perl語法。未來的用戶將是內部管理員,所以這不是不合理的,但它比我想要的更復雜。

那麼我錯過了什麼?任何好的選擇?

回答

0

通常首要任務是避免在可執行文件中包含配置文件。否則,服務器配置錯誤可能會意外地向全世界顯示您的私人配置信息。我把應用程序需要的所有東西放在/srv/app0之下,子目錄cfg是包含可執行文件的目錄的兄弟。 (More detail.

如果通過PerlPostConfigRequire startup.pl是預加載模塊訪問mod/startup.pl那麼這就是把配置文件位置../cfg/app.cnf最好的地方,你必須重新如何配置存儲在內存中的靈活性。另一種方法是PerlModule模塊,並在其中一個模塊的BEGIN塊中加載配置(使用上述相對路徑)。

通常處理一個配置文件不會花費大量時間,所以一個流行的選項是延遲加載:如果代碼檢測到配置丟失,則在繼續之前加載它。如果代碼需要早於此知道配置,這是沒有用的,但它避免了很多問題,特別是在將代碼遷移到非modperl env時。