使用nginx作为Zeppelin实例的反向代理存在一个奇怪的问题。我将尝试在下面描述问题。
我正在使用EC2实例作为反向代理来访问Zeppelin实例。前面的一个注释是作为“转发代理”的AWS ALB,通过这种方式,我可以使用友好的URL来公开UI。 AWS ALB上的path based routing已正确配置。
请求将通过域 subdomain.domain.com/ds 发送到AWS ALB,在这里我使用基于路径的路由来匹配所有将/ ds作为路径的请求到我的目标群体。
然后将传入请求传递到运行良好的Nginx实例。问题是,如果我使用不带斜杠的URL,则Nginx只会超时。
配置如下:
# Zeppelin
server {
listen 541;
location /ds {
rewrite ^/ds/(.*)$ /$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://10.10.10.10:8890/;
proxy_redirect http://10.10.10.10:8890/ $scheme://$host/ds;
}
location /ds/ws {
proxy_pass http://10.10.10.10:8890/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection upgrade;
proxy_read_timeout 86400;
}
}
此外,波纹管是我用于RStudio的最简单的示例。
server {
listen 542;
location /ds {
rewrite ^/ds/(.*)$ /$1 break;
proxy_pass http://10.10.10.10:8787;
proxy_redirect http://10.10.10.10:8787/ $scheme://$host/ds/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_read_timeout 20d;
}
}
如果没有提供斜杠,我会得到
/ds not found
答案 0 :(得分:1)
在您的location
块中:
location /ds {
rewrite ^/ds/(.*)$ /$1 break;
...
proxy_pass ...
}
以/ds/
开头的 URI将与正则表达式匹配,并且不使用初始的/ds
进行重写。但是,URI /ds
与正则表达式不匹配,它将作为/ds
传递到上游应用程序。
有多种方法可以解决此问题,但是最简单的解决方案是通过添加/
运算符使正则表达式中的第二个?
成为可选变量。
例如:
rewrite ^/ds/?(.*)$ /$1 break;