web-dev-qa-db-ja.com

スーパーバイザーへのnginxプロキシパス

監視対象のWebインターフェイスを 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/;に変更する必要がありましたが、現在はスーパーバイザー/にリダイレクトされます。

今は問題ないように見えますが、refresh、restartなどを押すとコマンドは機能しますが、/ supervisor /には戻りません。テストするためにsupervisordをinet_serverに変更し、example.com:9001にアクセスするとすべてが正常に機能します。 inetサーバーにプロキシしようとしましたが、それでも機能しません。例えば。更新ボタンは次を送信します:/supervisor/index.html?action=refreshそして/?message=Page%20refreshed%20at%20Sat%20Jul%20%201%2014%3A10%3A27%202017で戻ります/ supervisor /ではなくサーバーのルート(example.com/?message = ...)に戻るように見えますか?これを修正する方法はありますか?

Edit2:Ok何時間もグーグルした後、私は自分に合ったこのソリューションを作成しました。 nginxの場合、おそらくそれは素晴らしい解決策ではありません。少なくとも今はここで機能します。これをconfに追加しました。

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;
}
1
Herjar

リソースファイルがパス相対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;
}

2番目のブロックがプレフィックスの場所になり、前のrewriteステートメントがproxy_passによって実装されることに注意してください(末尾の/を使用)。詳細については、 このドキュメント を参照してください。

0
Richard Smith