2016-11-16 80 views
3

我在生產環境中的應用程序中嵌入了YAWS,我使用函數yaws:start_embedded/4來啓動YAWS。是否可以在運行時添加YAWS appmods配置?

下面是我的代碼:

Id = "my_server", 
GconfList = [{logdir, "./log"}, {id, Id}], 
SconfList = [{docroot, Docroot}, 
    {port, Port}, 
    {listen, Listen}, 
    {appmods, [  
    {"/rest", mod_rest, []}, 
    {"/file", mod_file, []}  
    ]} 
], 
yaws:start_embedded(Docroot, SconfList, GconfList, Id). 

我想補充另一個appmod,e.g:{"/upload", mod_upload, []}

是否有可能添加在運行時appmods無需重新啓動YAWS?

回答

6

您可以在運行時添加appmods,方法是首先檢索當前配置,使用它創建包含新appmods的新配置,然後設置新配置。

  1. 呼叫yaws_api:getconf/0獲得3元組{ok, GlobalConf, ServerConfs}其中GlobalConf是全球雅司病的配置和ServerConfs是雅司服務器配置的列表的列表。全局conf是一種記錄類型,名稱爲gconf,服務器conf是一種名爲sconf的記錄類型;這兩種記錄類型都在yaws.hrl頭文件中定義。
  2. 通過服務器配置查找包含要更改的appmod的包。這有點棘手,因爲你正在處理一個列表清單,你需要保持整個數據結構的形狀不變。
  3. 找到sconf後,通過將新的appmod添加到其當前的appmod列表中,從中創建一個新的sconf實例。 appmod列表中的每個元素都是由appmod的URL路徑和appmod模塊的名稱組成的元組。一個appmod元組也可以有選擇地包含第三個字段,該字段包含要排除的第一個路徑下的路徑列表;有關更多詳細信息,請參閱the Yaws appmod documentationexclude_paths的說明。
  4. 用您的新值替換ServerConfs中現有的sconf值。
  5. 請致電yaws_api:setconf/2設置新配置,將現有的GlobalConf作爲第一個參數,並將新的ServerConfs作爲第二個參數傳遞給您的新sconf

am_extend模塊顯示如何做到這一點。它導出一個add/1函數,該函數使用一個函數來識別和擴充​​您關心的特定服務器中的appmods。

-module(am_extend). 
-export([add/1]). 

add(AppmodAdder) -> 
    {ok, GlobalConf, ServerConfs} = yaws_api:getconf(), 
    NewServerConfs = add_appmod(ServerConfs, AppmodAdder), 
    yaws_api:setconf(GlobalConf, NewServerConfs). 

add_appmod(ServerConfs, AppmodAdder) -> 
    lists:foldl(fun(Val, Acc) -> 
         AcC++ [AppmodAdder(A) || A <- Val] 
       end, [], ServerConfs). 

使用此代碼的一個例子是以下傳遞函數作爲AppmodAdder參數爲am_extend:add/1。在這個例子中,我們正在尋找一個具有appmod路徑"/sse"的服務器,因此我們可以爲路徑"/sse2"添加另一個appmod到該服務器。我們不關心的任何服務器conf都只是返回原樣。

-include_lib("yaws/include/yaws.hrl"). 

add_sse2(#sconf{appmods=AM}=SC) -> 
    case lists:keyfind("/sse", 1, AM) of 
     false -> 
      SC; 
     _ -> 
      SC#sconf{appmods=[{"/sse2", my_sse_module}|AM]} 
    end. 

注意,我們add_sse2/1功能必須包括yaws.hrl編譯因此它有可用的sconf記錄的定義。

+1

我試過你提供的代碼,它工作,並不會影響其他連接的連接,非常感謝你! – chengweichao

相關問題