Расположение Nginx без косой черты работает только с косой чертой - PullRequest
0 голосов
/ 28 июня 2018

У меня странная проблема с использованием nginx в качестве обратного прокси-сервера для моего экземпляра Zeppelin. Я постараюсь описать проблему ниже.

Я использую экземпляр EC2 в качестве обратного прокси-сервера для доступа к экземпляру Zeppelin. Просто примечание перед ним - AWS ALB, сидящий как «прямой прокси», так что я могу использовать дружественные URL-адреса для показа пользовательского интерфейса. Маршрутизация на основе пути в AWS ALB настроена правильно.

  1. Запрос поступает в AWS ALB с доменом subdomain.domain.com / ds , где я использую маршрутизацию на основе пути для сопоставления всех запросов, которые обращаются к / ds в качестве пути к моя целевая группа.

  2. Затем входящий запрос передается экземпляру 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

1 Ответ

0 голосов
/ 28 июня 2018

В вашем location блоке:

location /ds {
    rewrite ^/ds/(.*)$ /$1 break;
    ...  
    proxy_pass ...
}

URI, которые начинаются с /ds/, будут соответствовать регулярному выражению и будут перезаписаны без начальных /ds. Тем не менее, URI /ds не соответствует регулярному выражению и будет передан в вышестоящее приложение как /ds.

Существует несколько способов решения проблемы, но самое простое решение - сделать второй / в регулярном выражении необязательным, добавив оператор ?.

Например:

rewrite ^/ds/?(.*)$ /$1 break;
...