當上游宕機時 Nginx 自訂內部錯誤頁面

當上游宕機時 Nginx 自訂內部錯誤頁面

我是 Nginx 新手,並且有一個上游 glassfish 伺服器的反向代理。我正在嘗試為應用程式因維護而關閉時設定自訂 503 頁面。幾個小時以來我一直未能這樣做。 Maintenance.html 頁麵包含 css 和 jpg 連結。當我轉發到維護頁面時,這些就會顯示出來。我得到的只是頁面的文字和損壞的圖像。

CentOS 6.5 nginx 1.4.4(來自 nginx 儲存庫)

upstream glassfish {
server <upstream IP>:8181 max_fails=1;
}

server {
 listen       80;
 server_name  localhost;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

error_page  404 502   /static/error.html;
error_page  503      /static/maintenance.html;

location ~ ^/static/ {
    internal;
}

 location / {
 proxy_set_header X-Real-IP  $remote_addr;
 proxy_set_header X-Forwarded-For $remote_addr;
 proxy_set_header Host $host;
 proxy_pass https://glassfish;
 port_in_redirect off;
 }
}

access.log 中顯示的錯誤是

[19/Dec/2013:17:49:17 -0500]「GET /static/main.css HTTP/1.1」404 1136「http:/// [19/Dec/2013:17:49:18 -0500] “GET /static/header-logo.jpg HTTP/1.1” 404 1136 “http:///

我檢查了 /etc/nginx/html/static/header-logo.jpg 是否存在

我確信這很簡單,但我就是無法弄清楚!

答案1

我最近想做同樣的事情(用圖像、CSS 和自訂字體顯示更好的維護/錯誤頁面)。

我最終做的是使用像這樣的內部位置區塊:

server {

  error_page 502 = @maintenance;

  location @maintenance {
    root /path/to/maintenance-site;

    if (!-f $request_filename) {
      rewrite ^ /index.html break;
    }
  }
}

我寫了一個部落格文章關於它,如果您需要更多詳細資訊(由於我正在重建基礎設施而已關閉,但又恢復了)。

答案2

你說你正在這樣做:

location ~ ^/static/ {
    internal;
}

internal關鍵字意味著這location僅對內部請求(即您的error_page請求)可見。

如果您希望能夠/static/直接從網頁瀏覽器存取(這對於提供從錯誤頁面引用的圖像似乎是必要的),那麼您必須internal從上述location.

答案3

我認為最好的方法是做以下事情:

  • 使用inline CSS
  • 將您的圖像轉換為Base64

完成此操作後,您可以將產生的 Base64 字串嵌入到background-imageCSS 規則中,如下所示:

background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==)

<img>您也可以將字串與標籤一起使用,只需將其傳遞給src屬性即可,如下所示:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==" />

這樣就可以保持internalnginx規則。

乾杯!

相關內容