2010-06-01 86 views
9

我們正在尋找一種方法將我們的Apache DocumentRoot指向符號鏈接。 例如的DocumentRoot在/ var/www/html等/ finalbuild將apache documentRoot設置爲符號鏈接(便於部署)

finalbuild應指向一個文件夾類似的地方/家庭/用戶/ build3中

當我們進入一個新的版本到/ home /用戶/ build4中,我們想用一個shell腳本將符號鏈接「finalebuild」更改爲這個新目錄/ home/user/build4,並執行apache正常重啓以啓動並運行新的Web應用程序,風險很小。

什麼是最好的方式來創建這個符號鏈接,並改變這個鏈接後使用shell腳本?

+1

我'm thinking「rm/var/www/html/finalbuild && ln -s/home/user/build4/var/www/html/finalbuild」。您甚至可能不需要重新啓動Apache。 – barrycarter 2010-06-02 17:16:19

+0

謝謝,我已經改變了docroot,並指出它是一個符號鏈接,但Apache似乎沒有聽...我已經成功地重新啓動了Apache,任何想法? – Jorre 2010-06-03 09:35:43

+0

我也一直在試圖爲此找到答案。 Apache只是給了我一個403錯誤。到目前爲止沒有運氣。推測是因爲在生產中這樣做是不好的做法。只是想在我的開發盒上做到這一點。 – nedned 2010-09-22 05:39:34

回答

3

我已經使用符號鏈接作爲生產中的apache DocumentRoot,並且不需要進行正常的重新啓動。總的來說,這個想法應該起作用。 403錯誤可能表示與符號鏈接更改無關的權限錯誤。你想添加的一個額外的皺紋是making the symlink switch atomic,所以符號鏈接總是存在。也就是說,在任何時候,符號鏈接都不存在,即使是暫時的。

此問題的解決方案是通過創建新的符號鏈接,然後通過舊的符號鏈接重命名來實現更改。在類Unix系統上,重命名是一個原子操作,因此符號鏈接「change」也是原子操作。通過手,過程是這樣的:

$ ln -s new current_tmp && mv -Tf current_tmp current 
+1

只是爲了自相矛盾,我看到這個經歷過問題的鏈接:http://www.mikebrittain.com/blog/2009/05/12/case-against-using-symlinks-for-code-promotion/ – defmikekoh 2010-11-17 01:58:04

7

我們使用Capistrano的採用類似的設置。然而,我們遇到了一些問題:

切換到設置後,事情似乎很好,但後來我們開始注意到,在運行cap deploy後,即使符號鏈接已被更改爲指向頭部即使經過多次刷新並附加了不同的GET參數,瀏覽器仍然會顯示舊頁面。首先,我們認爲它是瀏覽器緩存,所以對於開發,我們通過HTTP頭禁用了瀏覽器緩存,但是這並沒有改變任何東西。然後我檢查了一下,以確保我們沒有進行整頁緩存服務器端,而我們沒有。但是我注意到,如果我刪除了符號鏈接指向的修訂版本中的文件,我們將得到一個404,所以Apache提供了新的頁面,但它仍然遵循「舊符號鏈接」並從上面提供頁面錯誤的目錄。

這是共享主機,所以我無法重新啓動Apache。所以我嘗試刪除符號鏈接並每次創建一個新的。這似乎工作有時,但不可靠。它大概有25〜50%的時間。

最後,我發現,如果I:

  1. 除去現有符號鏈接(其刪除或重命名它);
  2. 提出頁面請求,從而導致Apache將試圖解析符號鏈接,但發現它失蹤(導致404)
  3. 然後創建一個新的符號鏈接到新目錄

它會導致文檔根目錄到大部分時間都會更新。但是,即使這不是完美的,大約有2-5%的時間,當部署腳本運行wget在重命名舊符號鏈接後立即獲取頁面時,它將返回舊頁面而不是404頁面。

Apache似乎在緩存文件系統,或者當Apache從磁盤上的文件系統讀取時(也許沒有任何意義),mv命令可能只改變了內存中的文件系統。在任何情況下,我已經採取了別人的建議,運行符號鏈接更改後sync,它應該得到的文件系統上的磁盤同步記憶,也許是輕微的延遲也將有助於wget返回一個404

+2

如果有人理解這種行爲背後的原因記錄它會很棒。 – ThorSummoner 2014-11-20 00:11:56