Назад | Перейти на главную страницу

прокси nginx передать супервизору

Я пытаюсь сделать веб-интерфейс супервизора доступным по адресу http://example.com/supervisor

После многих часов попыток я заставил его работать правильно с завершающей косой чертой (http://example.com/supervisor/). Я получил его, чтобы он отображался без косой черты, но ни один из изображений / css и т. Д. Не работает.

Я новичок в nginx, поэтому предполагаю, что что-то не так с моими правилами перезаписи. При первом переписывании я пытался добавить косую черту в конце.

supervisord.conf

[unix_http_server]
  file = /tmp/supervisor.sock  ; (the path to the socket file)
  chmod=0700                   ; socket file mode (default 0700)

nginx.conf

location ~* ^/supervisor/? {
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_x_host;
     proxy_set_header X-NginX-Proxy true;

     rewrite ^(.*[^/])$ $1/;
     rewrite /supervisor/(.*) /$1 break;
     proxy_pass http://unix:/tmp/supervisor.sock:;
     proxy_redirect off;
     proxy_buffering off;
}

Я борюсь с этим целую вечность и не знаю, куда деваться. Может ли кто-нибудь указать мне правильное направление?

Спасибо.

Редактировать: Спасибо, Ричард, это помогло мне продвинуться немного дальше. Мне пришлось изменить перенаправление на return 301 $scheme://$host$request_uri/; чтобы заставить его работать здесь, но теперь он перенаправляется на супервизора /

Сейчас все выглядит нормально, но нажатие кнопки «Обновить», «перезапуск» и т. Д. Работает для команды, но не возвращает в / supervisor /. Я сменил supervisord на inet_server для тестирования, и при переходе на example.com:9001 все работает нормально. Я пробовал прокси-сервер на инет-сервер, но он все равно не работает. Например. кнопка обновления отправляет: /supervisor/index.html?action=refresh и возвращается с /?message=Page%20refreshed%20at%20Sat%20Jul%20%201%2014%3A10%3A27%202017 Похоже, он возвращается не в / supervisor /, а в корень сервера (example.com/?message = ...)? Есть идеи, как я могу это исправить?

Edit2: Хорошо, после нескольких часов поиска в Google я сделал это решение, которое работает для меня. Прочтите, что я должен держаться подальше от if в nginx, так что это, вероятно, не лучшее решение. По крайней мере, сейчас это работает. Я добавил это в свою конф:

if ($http_referer ~* example.com/supervisor ) {
    set $test supervisor;
}

if ($request_uri ~* message ) {
    set $test  "${test}+message";
}

if ($request_uri !~ supervisor ) {
    set $test  "${test}+addsup";
}

if ($test = "supervisor+message+addsup") {
  return $scheme://$host/supervisor$request_uri;
  break;
}

Если файлы ресурсов указаны с использованием URI, относящихся к пути, браузеру, возможно, потребуется увидеть завершающую косую черту. В этом случае вы можете перенаправить /supervisor к /supervisor/, что также упростило бы ваш существующий location блок. Например:

location = /supervisor {
    return 301 /supervisor/;
}
location ^~ /supervisor/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_x_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://unix:/tmp/supervisor.sock/;
    proxy_redirect off;
    proxy_buffering off;
}

Обратите внимание, что второй блок теперь является префиксом, а предыдущий rewrite заявление теперь реализовано proxy_pass (используя завершающий /). Видеть этот документ для большего.