我是 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-image
CSS 规则中,如下所示:
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==)
<img>
您也可以使用带有标签的字符串,只需将其传递给src
属性即可,如下所示:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==" />
这样你就可以保留internal
nginx 规则。
干杯!