我正在尝试设置 Nginx 以使用 proxy_pass 将请求转发到多个后端服务。
加载https://example.com/monit
成功,但是页面内的链接https://example.com/sshd
指向https://example.com/monit/sshd
我正在运行 monit 5.2.5
我尝试过使用和不使用下面的重写规则。
配置文件;
代理配置文件
location /monit {
# rewrite /monit/(.*) /$1 break;
proxy_pass http://localhost:2812/;
include proxy.inc;
}
.... more entries ....
站点启用/主要
server {
listen 443;
server_name example.com;
server_name_in_redirect off;
include proxy.conf;
ssl on;
}
代理公司
proxy_connect_timeout 59s;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 64k;
proxy_buffers 16 32k;
proxy_pass_header Set-Cookie;
proxy_redirect off;
proxy_hide_header Vary;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header Accept-Encoding '';
proxy_ignore_headers Cache-Control Expires;
proxy_set_header Referer $http_referer;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;
答案1
我修改了重写规则,并确保清除了缓存,并且这样做有效;
location /monit {
rewrite ^/monit/(.*) /$1 break;
proxy_pass http://localhost:2812/;
include proxy.inc;
}
答案2
有个技巧可以做到这一点。在 monit 中,我为每个检查使用一个固定的起始字符,例如减号:
check process -openvpn with pidfile /run/openvpn/server.pid
start = "/usr/bin/systemctl start openvpn.service"
在 nginx 的配置中我引入了一个以 '/-' 开头的位置,当找到时,它将重定向到 referer:
location /monit/ {
rewrite ^/monit/(.*) /$1 break;
proxy_ignore_client_abort on;
proxy_set_header X-uri "check-headeruri";
add_header X-debug-message $http_referer;
proxy_cache_bypass 1;
proxy_pass http://<mylocaladdress>:2812/;
}
location /- {
proxy_cache_bypass 1;
return 302 $http_referer;
}
引用者仍然具有正确的 URI,因此“返回 302”即可解决问题。此外,浏览器被迫不使用页面的缓存版本,因此需要 proxy_cache_bypass。
运用这个技巧后,我不再收到 404 错误。
答案3
遗憾的是,monit 没有允许它定义其请求的 BASE_URL 的配置,这意味着它将始终将其服务直接添加到 / 下,这会破坏您的 /monit 代理匹配。:( 一种解决方法,但可能很丑陋,是以您可以在 nginx 中匹配该名称的方式命名您的 monit 服务。
这是唯一能做到的方法,除非你以某种方式破解监控源,将 URL 更改为http://本地主机:2812/monit/但我相信那更难?
另一个选择可能是,如果您可以在并行端口上运行 nginx,并只重写针对此端口的访问以访问 monit URL/端口,那么您就可以重写/代理整个 / 而不是 /monit,从而使链接正常工作。这取决于您的公共 IP 和可用端口,但应该可以解决问题吗?