在使用 503 的 nginx 處於維護模式時如何轉發到 Amazon S3?
在網站維護期間,有時需要關閉我們的網站。
我們目前的方法是
touch
創建一個文件,該文件將觸發 Web 伺服器 ( nginx ) 將流量重定向到託管在 Amazon S3 中的維護頁面。將維護頁面託管在外部伺服器上很重要,因為在維護期間無法保證任何本地文件的可用性。這是我們用於“維護模式”的 nginx 配置:
server { ... # Redirect processing of 503 error pages into a named location: error_page 503 @maintenance; # "Maintenance Mode" is off by default - Use a nginx variable to track state. set $maintenance off; # Swith on "Maintenace Mode" if a certain file exists. if (-f /var/www/mysite/shared/maintenanceON) { set $maintenance on; } # Don't use "Maintenance Mode" for our own offices. if ($remote_addr ~ (69.69.96.69|69.69.69.79)) { set $maintenance off; } # Don't use "Maintenance Mode" for certain urls, e.g. the load-balancer ping page. if ($uri ~ ^/(site\/ping|robots\.txt)$) { set $maintenance off; } if ($maintenance = on) { return 503; # 503 - Service unavailable } location @maintenance { # Redirect the request to our maintenance page in Amazon S3. rewrite ^(.*)$ http://mysite.s3-website-us-east-1.amazonaws.com/ break; } ...
它工作得很好。但是有一個不幸的副作用,我想知道是否可以避免?
這
rewrite
是由 Nginx 使用 302 http 狀態程式碼將請求轉發到 Amazon S3 站點完成的。因此,在維護模式期間,我們不會返回 503,而是返回 302。這不是一個好的禮儀,如果 google bot 在計劃的站點停機時間期間抓取我們,可能會很糟糕。Google 推薦 503(來源)。是否有一個 nginx 指令可以用來獲得相同的效果,但沒有 302 用於重定向?
這表明維護模式返回“302 臨時移動”而不是我更喜歡的“503 服務不可用”:
> wget http://staging.example.com --2013-11-13 10:00:47-- http://staging.example.com/ Resolving staging.example.com (staging.example.com)... 69.69.69.80 Connecting to staging.example.com (staging.example.com)|69.69.69.80|:80... connected. HTTP request sent, awaiting response... 302 Moved Temporarily Location: http://example.s3-website-us-east-1.amazonaws.com/ [following] --2013-11-13 10:00:53-- http://example.s3-website-us-east-1.amazonaws.com/ Resolving example.s3-website-us-east-1.amazonaws.com (example.s3-website-us-east-1.amazonaws.com)...
我不相信您可以使用 503 傳遞重定向,因為它不用於重定向。
您需要將該特定文件託管在安全位置,使其不受任何有效維護系統的影響,或者使用 proxy_pass 以便 nginx 從亞馬遜獲取頁面,然後將其傳遞給客戶端。
沿著這些路線的東西可能會奏效。有一段時間沒有接觸 nginx,但這可能會讓您了解我的建議:
error_page 503 @maintenance; location @maintenance { rewrite ^(.*)$ /maintenance.html break; proxy_pass http://mysite.s3-website-us-east-1.amazonaws.com; }
編輯:在關於Google推薦 503 的頁面上,有人評論了一個關於如何使用 503 重定向的絕妙想法。他提到了 Apache,但這個概念與 nginx 相同:
你好!
這可能會有所幫助。在 Apache 伺服器上,通常不可能使用 3xx 類以外的任何其他 HTTP 狀態程式碼重定向使用者。
訪問正在維護的站點的使用者應該獲得有用的資訊頁面。
首先使用 302 重定向執行此操作,該重定向會導致輸出 503 標頭的 503 頁面(即通過 PHP 或 Perl)。這適用於 Google,因為當 Google 遇到 302 時,Google 會將所有目標頁面屬性分配給源頁面 - 包括標題響應。我已經在虛擬主機上對此進行了測試,它可以按需要工作。如果可以,請選擇對服務操作請求較少的時間。
問候,托馬斯