我一直在设置Nginx作为服务器上应用程序的反向代理。部分内容包括具有外部内容(如图像)的维护页面。我能够找到一个设置错误页面的方法,图像返回200,但看起来反向代理将改变整个环境。这是nginx maintenance page with content issue
的原始解决方案error_page 503 @maintenance;
location @maintenance {
root /path_to_static_root;
if (!-f $request_filename) {
rewrite ^(.*)$ /rest_of_path/maintenance.html break;
}
return 200;
}
反向代理配置为:
location / {
proxy_pass http://127.0.0.1:9007/;
proxy_redirect off;
}
问题是当发现文件存在于“维护”根目录中时,出现问题并且服务器返回502.任何人都知道原因可能是什么?
一些推测我想知道服务器是否在端口80上侦听,它以某种方式将任何好的文件请求传递回代理。如果这是真的,那将如何避免?
这是nginx日志中的错误。我直接尝试访问50x.html。不知道为什么会这样?
2012/02/17 19:39:15 [error] 21394#0: *13 connect() failed (111: Connection refused) while connecting to upstream, client: (my ip address), server: _, request: "GET /50x.html HTTP/1.1", upstream: "http://127.0.0.1:9007/50x.html", host: "domain.com"
看起来确实试图从应用程序获取而不是根目录。我怎么能绕过这个?
我原本以为我找到了一个答案,其中对nginx v1.0.12进行了更改,但它没有解决问题。它涉及类似的情况,但我的猜测是修复太具体了。
答案 0 :(得分:3)
您不应该涉及后端(I.E.,不应该使用代理传递),因为您的维护页面应该是Nginx可以直接提供的静态html文件。
假设您将设置配置为...
server {
listen 80;
server_name example.com;
root /path/to/webroot;
# Regular locations etc
...
}
创建一个名为" 503_status"的文件夹。并将您的维护页面放在" 503.html"。
中准备好后,创建一个名为" maintenance.default"的文件。在Nginx目录下有以下内容......
error_page 503 /503_status/503.html;
# Candidate for redirection if not ending with one of these extensions.
if ( $request_uri !~ \.(jpg|gif|png|css|js)$ ) {
set $maint "Tr";
}
# Candidate for redirection if not a request for the maintenance page
if ( $request_uri !~ ^/maintenance/$ ) {
set $maint "${maint}ue";
}
# Redirect to a location where the status code will be issued
if ( $maint = True ) {
rewrite ^ /maintenance/ redirect;
}
# Due to Nginx quirk, issue the status code in a location context.
# Make "internal" to prevent direct browsing.
location /maintenance {
internal;
return 503;
}
# 503_status folder as "internal" so no direct browsing
location 503_status {
internal;
alias /server/path/to/503_status/folder;
}
每当您将网站置于维护状态时,只需按如下方式包含该文件即可...
server {
listen 80;
server_name example.com;
root /path/to/webroot;
include /server/path/to/maintenance.default;
# Regular locations etc
...
}
这将为您的维护页面及其所需的任何资源提供服务(只需确保扩展名在列表中)。后端服务器根本没有发挥作用。