web-dev-qa-db-ja.com

nginxイングレスでブラウザのURLを保持しながら、URLをバックエンドに書き換える方法は?

KubernetesのnginxイングレスでブラウザのURLを保持しながら、サービスへのパスを書き換えようとしています。

私が必要なのはこれです:

  • http://example.com/path => http://service
  • http://example.com/path/bar => http://service/bar
  • http://example.com/path/file.css => http://service/file.css

つまり、/path上流サーバーのルート(または別のURL)になります。

私が見るところ here から、これはproxy_passで末尾のスラッシュを使用して行われますが、nginx ingressにはこのオプションがないようです。

これはnginxの侵入の可能性がありますか?

1
Natan

Nginx Ingressで可能ですか?

  • はい、それを達成するために rewrite-target を使用できます。

  • キャプチャグループを作成し、適切なサービスに送信します。以下はIngressの例です。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: "rewrite"
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http: example.com
        paths: 
          - path: /foo(/|$)(.*)
            backend:
              serviceName: echo-svc
              servicePort: 80

このIngressの定義では、(.*)によってキャプチャされたすべての文字がプレースホルダー$2に割り当てられ、rewrite-targetアノテーションのパラメーターとして使用されます。

このイングレスは次のことを行います。

  • / fooへのリクエストは/としてecho1-svcに配信されます
  • / foo/barへのリクエストは、echo1-svcに/ barとして配信されます
  • / foo/file.cssへのリクエストは、/ file.cssとしてecho-svcに配信されます
  • Nginx Ingressは Path Priority を使用します:

NGINXでは、正規表現は最初の一致ポリシーに従います。より正確なパスマッチングを可能にするために、ingress-nginxは、パスをロケーションブロックとしてNGINXテンプレートに書き込む前に、まず長さを降順に並べます。


例:

$ kubectl apply -f echo-ingress.yaml 
ingress.networking.k8s.io/echo-ingress created

$ kubectl get ingress
NAME           HOSTS          ADDRESS        PORTS   AGE
echo-ingress   mydomain.com   35.188.7.149   80      48s

$ tail -n 1 /etc/hosts
35.188.7.149 mydomain.com

$ curl mydomain.com/foo/bar
{"path": "/bar",
...suppressed output...
  "os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}

$ curl mydomain.com/foo
{"path": "/",
  "os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}

質問があればコメントで知らせてください。

1
willrof