Nginx

在使用 503 的 nginx 處於維護模式時如何轉發到 Amazon S3?

  • November 17, 2013

在網站維護期間,有時需要關閉我們的網站。

我們目前的方法是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 會將所有目標頁面屬性分配給源頁面 - 包括標題響應。我已經在虛擬主機上對此進行了測試,它可以按需要工作。如果可以,請選擇對服務操作請求較少的時間。

問候,托馬斯

引用自:https://serverfault.com/questions/554671