2011-06-10 59 views
7

我正在使用MaintenanceModeMiddleware將我的網站置於維護模式,但它要求您在遠程服務器上的settings.py文件中進行更改。我想用fabric來遠程將網站置於維護模式。有沒有辦法做到這一點?還是有更好的方法來做到這一點?謝謝。反正有django站點進入維護模式使用面料?

[更新]

感謝回饋大家在這個到底是什麼,我沒有和它爲我的偉大工程,http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/ - 我喜歡的取消註釋行的想法,但我的設置,如果我是在生產服務器上執行該操作時,一旦我將新版本推出後,它將被覆蓋,因此最終將該網站從服務器級別置於維護模式,而不是django級別運行得更好,而且更加簡單和靈活我至少:)

+0

This [question](http://stackoverflow.com/questions/6237514/write-to-a-remote-file-with-fabric)可能有關。我對織物不太瞭解,我不是故意粗魯,但是,沒有使用SSH並且更改一個設置線相當容易?這是一個遠程方法 – 2011-06-10 16:58:31

+0

由於瀏覽器緩存,我發現Garth Humphreys的方法並不好。它導致以下情況之一: - 在維護模式期間看到非維護模式頁面 - 未處於維護模式時看到維護模式頁面 我會將我的調整解決方案放在單獨的答案中。 – seddonym 2013-05-24 10:51:06

回答

8

面料確實有命令來幫助您評論或取消註釋給定文件中的行fabric.contrib.files。請參閱文檔:http://docs.fabfile.org/en/1.0.1/api/contrib/files.html

個人而言,我更喜歡在前端代理而不是在Django中間件中處理此問題。我會看看Show a custom 503 page if upstream is down這個問題,它將Nginx配置爲在上游關閉時使用自定義頁面。

+0

但管理員/員工用戶仍然可以進入沒有503s?中間件看起來很酷,特別是對於那些傾向於在生產服務器上開發的人。當Django項目實際上停止時,Nginx 503會很好。 – 2011-06-10 21:26:15

+0

@j_syk沒有理由不能同時使用兩者。如果Django服務器出現故障,那麼中間件不能工作,Nginx會啓動。 – 2011-06-11 01:31:50

+0

感謝大家的反饋,最終我做到了這一點,它對我很好,http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/- 我喜歡取消註釋行的想法,但是使用我的設置,如果我要在生產服務器上執行該操作,只要推入新版本就會覆蓋它所以最終把網站從服務器級別進入維護模式,而不是Django級別的工作好多了,真的更容易和靈活,對我來說至少:) – 2011-06-12 00:21:03

2

有一個fork of django-maintenancemode允許通過設置數據庫中的值來打開/關閉維護模式。例如,通過這種方式,您可以創建一個簡單的管理命令來切換維護模式並通過結構調用它。我認爲這比使用mod_rewrite更靈活。

+0

這意味着每個通過django服務的頁面都需要額外的命中數據庫嗎? – Matt 2015-09-14 02:10:28

4

我的解決辦法:

  1. 通過URL配置創建一個維護模式模板,並鏈接到它,所以當訪問/維修不足/顯示維護頁面。
  2. 然後,配置apache以測試是否存在'maintenance-mode-on'文件,如果存在,請將302重定向到維護模式頁面的url。
  3. 如果存在「維護模式關閉」文件,則配置apache將重定向到主頁的維護模式URL。
  4. 結構腳本,便於在維護模式開啓和維護模式關閉之間切換文件。

下面是Apache的配置文件中的相關章節:

RewriteEngine On 
# If this file (toggle file) exists then put the site into maintenance mode 
RewriteCond /path/to/toggle/file/maintenance-mode-on -f 
RewriteCond %{REQUEST_URI} !^/static.* 
RewriteCond %{REQUEST_URI} !^/admin.* 
RewriteCond %{REQUEST_URI} !^/under-maintenance/ 
# redirect to the maintenance mode page 
RewriteRule ^(.*) /under-maintenance/ [R,L] 

#If not under maintenance mode, redirect away from the maintenance page 
RewriteCond /path/to/toggle/file/maintenance-mode-off -f 
RewriteCond %{REQUEST_URI} ^/under-maintenance/ 
RewriteRule ^(.*)/[R,L] 

然後織物腳本的相關部分:

env.var_dir = '/path/to/toggle/file/' 

def is_in_mm(): 
    "Returns whether the site is in maintenance mode" 
    return files.exists(os.path.join(env.var_dir, 'maintenance-mode-on')) 

@task 
def mm_on(): 
    """Turns on maintenance mode""" 
    if not is_in_mm(): 
     with cd(env.var_dir): 
      run('mv maintenance-mode-off maintenance-mode-on') 
      utils.fastprint('Turned on maintenance mode.') 
    else: 
     utils.error('The site is already in maintenance mode!') 


@task 
def mm_off(): 
    """Turns off maintenance mode""" 
    if is_in_mm(): 
     with cd(env.var_dir): 
      run('mv maintenance-mode-on maintenance-mode-off') 
      utils.fastprint('Turned off maintenance mode.') 
    else: 
     utils.error('The site is not in maintenance mode!') 

這種運作良好,但它不依賴於Django的處理維護模式期間的請求;這將是很好的服務一個靜態文件。