nginx proxy_pass menggunakan subfolder

11

ok, tugas ini seharusnya sederhana tetapi saya tidak bisa membuatnya bekerja. Saya ingin memiliki subfolder setelah nama domain saya (sebenarnya setelah IP dari nama domain itu), yang dialihkan ke port tertentu di server yang sama. Pada dasarnya, saya ingin menghilangkan keharusan menggunakan banyak port.

Ini konfigurasi nginx saya untuk itu

server {
    listen 80;

    index index.html index.htm index.nginx-debian.html index.php;

    server_name aaa.bbb.ccc.ddd;

    location ^~ /app2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://aaa.bbb.ccc.ddd:8001;
    }
}

Jadi saat mengakses aaa.bbb.ccc.ddd / app2 saya ingin ini diselesaikan ke http: //aaa.bbb.ccc.ddd: 8001 .

Ini dapat dicatat mungkin sangat rumit. Apa yang kulewatkan di sini?

Pat terima kasih

hal84
sumber
Apakah maksud Anda "mengalihkan ke porta" atau "proksi ke porta"? Mereka sangat berbeda. Pertanyaan Anda tidak jelas, mungkin Anda dapat memperluas kasus penggunaan Anda termasuk klien.
Tim

Jawaban:

12

Karena Anda menandai ini sebagai pertanyaan proxy terbalik, saya berasumsi bahwa Anda ingin membuat proksi permintaan sehingga pengguna hanya melihat http://aaa.bbb.ccc.ddd/app2URL di browser-nya.

Anda dapat mengubah locationblokir Anda menjadi ini:

location ~/app2(.*)$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}

Di sini kita menangkap bagian URI setelah /app2ke $1variabel, dan menggunakannya dalam proxy_passarahan.

Tero Kilkanen
sumber
Terima kasih. Itu agak berhasil. aaa.bbb.ccc.ddd: 8001 hanya ditampilkan sebagian. Ada websockets pada halaman itu dan banyak script java. Saya kira itu karena saya proksi port dan tidak meneruskannya seperti yang disebutkan Tim di atas. Apakah ini sebenarnya mungkin dicapai hanya dengan menggunakan nginx?
pAt84
Seperti apa tampilan URL sumber daya di aaa.bbb.ccc.ddd:8001halaman? Kemungkinan besar Anda perlu memperbaiki URL untuk mengandung /app2bagian tersebut.
Tero Kilkanen
Ini benar-benar hanya websocket di sana (menunjukkan beberapa data radar, otomotif ...). Tidak ada tanda "app2" dalam kode sumber.
pAt84
Hm ok, ya. Untuk memanggil websocket, JS menggunakan "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host sekarang kehilangan nomor port, yang membuat semuanya tidak berfungsi lagi.
pAt84
Ok, jadi sepertinya sekali saya memanggil aaa.bbb.ccc.ddd / app2 saya memerlukannya untuk internal menggunakan aaa.bbb.ccc.ddd: 8001. Pilihan lain adalah mengubah semua skrip java. Alasannya adalah bahwa saya ingin menggunakan nginx untuk memberi saya "solusi satu port" tetapi setelah saya mengakses (mis. Melalui http // aaa.bbb.ccc.ddd / app2) Saya akan, secara internal, memerlukannya pergi kembali ke aaa.bbb.ccc.ddd: 8001. Apakah itu mungkin?
pAt84