Nginx'te konum altında birden çok proxy uç noktası sunma


14

Ben /apifarklı uç noktalara gidiyor altyolları ile tek bir konum altında hizmet etmek istiyorum API uç noktaları bir çift var . Özellikle, webdis adresinde /apive tescilli bir API adresinde kullanılabilir olmasını istiyorum /api/mypath.

Ben webis API ile çatışmalar hakkında endişelenmiyorum çünkü redis komut isimleri ile çatışması muhtemel olmayan alt yollar kullanıyorum ve ayrıca çakışmaları önlemek için API tasarımı üzerinde tam kontrole sahibim.

İşte test sunucumdan hacklediğim yapılandırma dosyası:

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # temporary hardcoded workaround
  location = /api/mypath/about {
    proxy_pass http://localhost:3936/v1/about;
  }

  location /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }

  # tried this but it gives "not found" error
  #location ^~ /api/mypath/ {
  #  rewrite ^/api/mypath/(.*)$ /$1 break;
  #  proxy_pass http://localhost:3936/v1/;
  #}
  #
  #location ^~ /api {
  #  rewrite ^/api/(.*)$ /$1 break;
  #  proxy_pass http://localhost:7379/;
  #}
}

Geçici /api/mypath/*çözümümü, 3936 numaralı bağlantı noktasındaki uç noktaya ve diğer her şeyi 7379 numaralı bağlantı noktasına gitmek için nasıl değiştirebilirim ?


Ne demek istiyorsun tried this to no avail? Bu konum yönergesini etkinleştirdiğinizde ne oldu? Bağlantı zamanaşımı? Konum eşleşmedi mi?
masegaloeh

Ah istemi için teşekkürler, bulunamadı bir hata veriyor, daha fazla soruşturma üzerinde hata API benim geliyor geliyor yani çalışıyor! : D Ama yeniden yazma kuralı açıkça URL'ye v1 eklemek zorunda değilim çünkü ( localhost / api / mypath / v1 / about ) ... :(
hamstar

Yanıtlar:


24

Bunun için yeniden yazmanıza gerek yok.

server {
  ...

  location ^~ /api/ {
    proxy_pass http://localhost:7379/;
  }
  location ^~ /api/mypath/ {
    proxy_pass http://localhost:3936/v1/;
  }
}

Göre nginx belgelerinde

Konum, bir önek dizesi veya normal bir ifade ile tanımlanabilir. Normal ifadeler, önceki ~*değiştiriciyle (büyük / küçük harf duyarsız eşleme için) veya ~değiştiriciyle (büyük / küçük harfe duyarlı eşleme için) belirtilir. Belirli bir istekle eşleşen konumu bulmak için, nginx önce önek dizeleri (önek konumları) kullanılarak tanımlanan konumları kontrol eder. Bunlar arasında, en uzun eşleşen öneki olan konum seçilir ve hatırlanır. Ardından, düzenli ifadeler yapılandırma dosyasındaki görünüm sırasına göre kontrol edilir. Normal ifadelerin aranması ilk eşleşmede sona erer ve ilgili yapılandırma kullanılır. Normal bir ifadeyle eşleşme bulunamazsa, daha önce hatırlanan önek konumunun yapılandırması kullanılır.

En uzun eşleşen önek konumunda ^~değiştirici varsa, normal ifadeler kontrol edilmez.

Bu nedenle /api/mypath/, en uzun eşleşen önek konumu olduğu için ile başlayan tüm istekler her zaman ikinci blok tarafından sunulur .

/api/Hemen ardından gelmeyen herhangi bir istek mypath/her zaman ilk blok tarafından sunulur, çünkü ikinci blok eşleşmez, bu nedenle ilk bloğu en uzun eşleşen önek konumu yapar.


2
Eğer konum değiştiricileri bakacak olursak ( =, ~*, ~ve ^~) o karşı sezgisel görünebilir olduğunu ^~dışlayan düzenli ifadeler (beri ~düzenli ifadeyi eşleştirmeye gösterir) ... ancak hatırlarsan, ^regex karakter sınıfı içinde (örneğin [^a-z]) ortadan kaldırır o Sınıfı (örneğin, ( az karakterleri dışındaki herhangi bir karakter) anlamına gelir ; benzer şekilde, ^~normal düzenli ifade konum bloklarını reddeder
Doktor J

6

Tamam anladım, "bulunamadı" hatası nginx geliyordu, ama aslında benim API geliyordu düşündüm. Bu ilgilenen varsa benim çözümüm:

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # automatically go to v1 of the (grape) API
  location ^~ /api/mypath/ {
    rewrite ^/api/mypath/(.*)$ /v1/$1 break;
    proxy_pass http://localhost:3936/;
  }

  location ^~ /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.