当上游宕机时,Nginx 自定义内部错误页面

当上游宕机时,Nginx 自定义内部错误页面

我是 Nginx 新手,有一个到上游 glassfish 服务器的反向代理。我试图为应用程序停机维护时设置一个自定义 503 页面。几个小时以来,我一直无法做到这一点。maintenance.html 页面包含一个 css 和 jpg 链接。当我被转发到维护页面时,这些链接就会显示出来。我得到的只是页面的文本和一张损坏的图像。

CentOS 6.5 nginx 1.4.4(来自 nginx repo)

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 规则。

干杯!

相关内容