web-dev-qa-db-ja.com

nginx proxy_pass応答ヘッダーの場所の書き換え

このnginxインスタンスの目的は、GitLabとOpenWRT Luciにリバースプロキシを介してリダイレクトさせることです。それはすでに他のいくつかのウェブサイトで機能しており、すべてがこの問題に対抗するように見えるベースURLを持っています。

  • この例のGitLabは、ローカルサーバーのポート9000にあります。
  • Nginxウェブサイトはポート8080にあります。
  • OpenWRTにはまったく同じ問題がありますが、/ cgi-bin/luci /

サンプルの場所に関連するnginx設定は次のとおりです。

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • 結果は末尾のスラッシュがあってもなくても同じです。

この場所に適用されているヘッダープロキシ構成オプションがいくつかあります。

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $Host:$server_port;
proxy_set_header    Origin $scheme://$Host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • 代わりに#proxy_set_header Hostをコメントアウトすると、ブラウザがhttps://127.0.0.1:9000/users/sign_inにリダイレクトされます

https://website.com:8080/gitlab/を閲覧するとき

GET /gitlab/ HTTP/1.1
Host: website.com:8080

応答が誤って/users/sign_inではなく/gitlab/users/sign_inに戻る

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

手動で https:// website:8080/gitlab/users/sign_in にアクセスすると、ページが読み込まれますが、上記と同じ問題が発生するまで、アセットは表示されません。

GitLab Asset Fail

nginx docs を読むと、失敗したように見えますが、デフォルトのプロキシ動作がこのシナリオを処理する必要があることを示唆しています。

ログはあまり表示されていないようです。

なぜこれが起こっているのかを診断するのに役立つ追加の手順は何ですか?

11
Jake Edwards

末尾のスラッシュをproxy_passターゲットに追加します。

Update:OPはvhostがhttpsを受け入れていることを正確に示しませんでした。スキームが追加のヘッダーでバックエンドサーバーに転送されると、proxy_redirect default;がnginxに期待するように命令するので問題が発生します デフォルトではhttpスキーム アップストリームの返信でLocationヘッダーを書き換えるとき、httpsの代わりに。

したがって、これを明示的により一般的な形式に変更する必要がありました(末尾のスラッシュはまだ必要です)。

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$Host:$server_port/ /gitlab/;
}
3
Xavier Lucas

@XavierLucasが言うことは正しいですが、バッキングされたリンクを処理する必要があります。 gitlabのドキュメントには、見出し 相対URLでGitLabをインストール の下にガイドがあります。最近、gitlabとnginxをインストールしてArch Linuxサーバーをセットアップしているときにこの問題に遭遇しました。これにより、すべてのアセットを再コンパイルして正しい相対パスを持つようにして問題を解決しました。

0
Gun