我正在尝试通过 nginx 为我的节点应用程序构建一个代理,认为如果节点应用程序失败或在端口上不可用,这将给我错误页面。
节点应用程序正在运行127.0.0.1:1337
,我正在监听mydomain:8080
并转发它。
server {
listen 8080;
server_name mydomain;
access_log /log/path/logging.log;
root /path/to/root/;
error_page 400 401 402 403 404 500 501 502 503 504 /error/index.html;
location / {
proxy_redirect off;
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_intercept_errors on;
proxy_pass http://127.0.0.1:1337;
}
}
不幸的是,当我关闭节点应用程序并请求时,它给出了 502 错误网关mydomain:8080
。但这是 nginx 的预期行为。我想要的是我可以定义的页面,当节点应用程序的服务关闭时将显示该页面。
有什么想法知道如何做吗?
答案1
我找到了答案:
server {
listen 8080;
server_name mydomain;
access_log /log/path/logging.log;
error_page 400 401 402 403 404 405 500 501 502 503 504 @error_page;
location @error_page {
root /var/www/html/;
rewrite ^ https://domain.com/error/index.html;
break;
}
location / {
proxy_redirect off;
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_intercept_errors on;
proxy_pass http://127.0.0.1:1337;
}
}
如果服务不可用(所有错误),这将重定向所有流量从maindomain:8080
到。https://domain.com/error/index.html
http://127.0.0.1:1337
希望这对将来的某人有所帮助。
答案2
您没有意识到 Nginx 正在做它应该做的事情,您的期望是错误的。您告诉 Nginx“使用此网关”,然后当网关不存在时,它会正确报告这一点。
如果您的节点应用程序停止工作,您希望或期望发生什么?
更新- 以下是我从 HHVM 回退到 PHP5 的方法,因为 HHVM 经常会失败。
upstream php {
server 127.0.0.1:9001;
}
upstream php-fpm {
server unix:/var/run/php-fpm/php-fpm.sock;
}
# Inside server block
location ~ \.(hh|php)$ {
error_page 502 = @fallback;
fastcgi_pass php;
}