nginx proxy_pass penulisan ulang lokasi header respons

11

Tujuan dari instance nginx ini adalah untuk membuat GitLab dan OpenWRT Luci untuk mengarahkan ulang melalui proxy terbalik. Ini sudah berfungsi untuk beberapa situs web lain, semua yang memiliki url dasar yang tampaknya mengatasi masalah ini.

  • GitLab dalam contoh ini ada di server lokal di port 9000.
  • Situs web nginx ada di port 8080.
  • OpenWRT memiliki masalah yang sama persis, tetapi dengan / cgi-bin / luci /

Konfigurasi nginx yang relevan untuk lokasi contoh adalah;

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Perhatikan bahwa hasilnya sama dengan dan tanpa garis miring.

Ada beberapa opsi konfigurasi proxy header yang diterapkan ke lokasi ini.

# 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;]
  • Mengomentari #proxy_set_header Host sebagai gantinya mengarahkan browser ke https://127.0.0.1:9000/users/sign_in

Saat menjelajah ke https://website.com:8080/gitlab/;

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

Respons salah kembali ke /users/sign_inbukan/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

Menjelajahi secara manual ke https: // situs web: 8080 / gitlab / users / sign_in memuat halaman, tetapi tidak ada aset saat jatuh hingga masalah yang sama seperti di atas.

Gagal Aset GitLab

Membaca nginx docs , itu menunjukkan bahwa perilaku proxy default harus menangani skenario ini, meskipun tampaknya gagal.

Log tampaknya tidak banyak menunjukkan.

Langkah tambahan apa yang harus diambil untuk membantu mendiagnosis mengapa ini mungkin terjadi?

Jake Edwards
sumber

Jawaban:

3

Tambahkan garis miring pada proxy_passtarget Anda .

Pembaruan: OP tidak tepat menerima vhost https. Karena skema diteruskan ke server backend dengan header tambahan, maka masalah terjadi karena proxy_redirect default;perintah nginx untuk mengharapkan skema http secara default ketika menulis ulang Locationheader di balasan hulu, alih-alih https.

Jadi, ini harus diubah secara eksplisit ke bentuk yang lebih umum (garis miring masih diperlukan):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}
Xavier Lucas
sumber
Hai Xavier, terima kasih atas jawabannya. Tidak beruntung di sana. Itu salah satu hal yang saya coba (cocok dengan proxy_pass docs) tetapi tidak ada perubahan :(
Jake Edwards
Saya telah menambahkan info tentang proxy_set_header yang berada di conf lain. Menghapus baris host tidak mengubah hal-hal - pengalihan ke 127.0.0.1:9000/users/sign_in
Jake Edwards
Ok jadi masalahnya adalah scheme(https) dengan proxy_redirect default perilaku yang mengharapkan http. Biarkan konfigurasi seperti sebelum mengomentari header Host dan ubah proxy_redirectkonten menjadi $scheme://$host:$server_port/ /gitlab/;. Pastikan Anda tidak menekan header cache dalam browser (gunakan cli tools atau navigasi pribadi) saat pengujian.
Xavier Lucas
Oke, keren, jadi sekarang menuju ke URL yang benar (setidaknya GitLab, OpenWRT masih pergi ke / cgi-bin / luci - satu per satu). Namun tidak memiliki aset / gambar / dll -: 8080 / aset / application-5ec1aeb4604cbfbeff836f956308b0ed.js alih-alih: 8080 / gitlab / aset / aplikasi-5ec1aeb4604cbfbeff836f956308b0ed.js
Jake
1
@ShadowXVII Link aset dihasilkan oleh aplikasi Anda, Anda harus mengubahnya di sana. Nginx hanya akan menulis ulang pengalihan yang dikeluarkan oleh aplikasi Anda, bukan konten halaman.
Xavier Lucas
0

Apa yang dikatakan @XavierLucas benar, yang didukung harus menangani tautan. Dokumentasi gitlab memiliki panduan di bawah judul Install GitLab di bawah URL relatif . Saya mengalami masalah ini baru-baru ini ketika menyiapkan server arch linux dengan gitlab dan nginx diinstal dan ini menyelesaikan masalah saya dengan mengkompilasi ulang semua aset untuk memiliki jalur relatif yang benar.

Senjata
sumber