ingres nginx 反向代理常见配置(持续更新)

一、匹配到的location的关键字不传递给后端

如果想实现访问的url 匹配到的location,不携带给后端服务

类似nginx的配置如下

可以看到 proxy_pass http://chatbot_flask/; 后面是带了"/"的,这代表反向代理给后端的upstream节点不携带"im_chat"这个关键字.

假设我的请求是https://xxx.xxx.com/im_chat/v1/chat/create

当请求到达nginx时,nginx会将/v1/chat/create 这段url反向代理访问后端的节点

   location /im_chat {
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://chatbot_flask/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_connect_timeout   60s;
            proxy_send_timeout      60s;
            proxy_read_timeout      60s;
            proxy_buffering off;
    }

重点来了对应的k8s ingress nginx 的配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: chatbot
  namespace: bmm-system
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 100M
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-next-upstream: error timeout http_500 http_502 http_503 http_504
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: "ingress-xxx-ext-nginx1"
  tls:
   - hosts:
     - xxx.xxx.cn
     secretName: xxx-tls
  rules:
    - host: xxx.xxx.cn
      http:
        paths:
          - pathType: ImplementationSpecific  
            backend:
              service:
                name: xxx
                port:
                  number: 5001
            path: /im_chat(/|$)(.*)

二、同一个域名根据不同的location转发到对应的后端服务

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-body-size: 100M
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite /code-server-develope01/(.*)  /$1 break;
  name: code-server-develope01
  namespace: default
spec:
  tls:
  - hosts:
    - nm-k8s-master.xxx.cn
    secretName: https-tls
  ingressClassName: ingress-int-nginx1
  rules:
  - host: nm-k8s-master.xxx.cn
    http:
      paths:
      - backend:
          service:
            name: code-server-develope01
            port:
              number: 8443
        path: /code-server-develope01
        pathType: Prefix

三、匹配到localtion后 "/api"不携带给后端,同时保证 "/" 访问的是前端项目

实现:请求"/"时,访问的前端,访问"/api"时,会将/api 后面的url 传递给后端服务,同时不将api传递给后端,起到了只匹配location的作用

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wd-admin-front
  namespace: wudao
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 100M
    nginx.ingress.kubernetes.io/proxy-next-upstream: error timeout http_500 http_502 http_503 http_504
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite /api/(.*)  /$1 break;
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: "ingress-xxx-int-nginx1"
  tls:
   - hosts:
     - admin-int.xxx.cn
     secretName: xxx-tls
  rules:
    - host: admin-int.xxx.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: xxx-admin-front
                port:
                  number: 8099
          - path: /api
            pathType: ImplementationSpecific
            backend:
              service:
                name: xxx-xxx
                port:
                  number: 8080

四、SSE(Server-Sent Events)场景下ingress参数调优,适合大模型流式对话场景

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xxx
  namespace: xxx
  annotations:
    nginx.ingress.kubernetes.io/connection-proxy-header: ""
    nginx.ingress.kubernetes.io/keep-alive: "650"
    nginx.ingress.kubernetes.io/keep-alive-requests: "10000"
    nginx.ingress.kubernetes.io/proxy-body-size: 1000m
    nginx.ingress.kubernetes.io/proxy-buffering: "off"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "7200"
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/proxy-next-upstream: error timeout invalid_header
      http_500 http_502 http_503 http_504
    nginx.ingress.kubernetes.io/proxy-read-timeout: "7200"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "7200"
    nginx.ingress.kubernetes.io/proxy-tcp-nodelay: "on"
    nginx.ingress.kubernetes.io/proxy-tcp-nopush: "off"
    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: "ingress-xxx-ext-nginx1"
  tls:
   - hosts:
     - xxx.xxx.cn
     secretName: xxx-tls
  rules:
    - host: xxx.xxx.cn
      http:
        paths:
          - pathType: ImplementationSpecific
            backend:
              service:
                name: xxx-xxx
                port:
                  number: 8080
            path: /api(/|$)(.*)

全局配置文件 configmap
 

data:
  allow-snippet-annotations: "true"
  client-body-buffer-size: 128k
  client-body-timeout: "60"
  client-header-buffer-size: 8k
  default-type: application/octet-stream
  forwarded-for-header: X-Forwarded-For
  gzip-level: "1"
  gzip-min-length: "1000"
  gzip-types: text/plain application/x-javascript text/css application/xml application/json
  http2-max-concurrent-streams: "64"
  http2-max-field-size: 16k
  keep-alive: "30"
  keep-alive-requests: "10000"
  large-client-header-buffers: 4 32k
  log-format-upstream: $time_local|$hostname|$remote_addr|$upstream_addr|$request_time|$upstream_response_time|$upstream_connect_time|$status|$upstream_status|-|$bytes_sent|$body_bytes_sent|-|$request|$http_user_agent|$http_refere
    r|^_^|$scheme|$request_method|$request_id|-|^_^|-|$cookie_jsessionid
  max-worker-connections: "65536"
  max-worker-open-files: "655350"
  proxy-body-size: 256m
  proxy-buffer-size: 128k
  proxy-buffering: "off"
  proxy-buffers-number: "32"
  proxy-connect-timeout: "15"
  proxy-headers-hash-bucket-size: "6400"
  proxy-headers-hash-max-size: "51200"
  proxy-next-upstream: error timeout http_500 http_502 http_503 http_504
  proxy-read-timeout: "60"
  proxy-send-timeout: "60"
  server-name-hash-bucket-size: "128"
  server-tokens: "false"
  ssl-buffer-size: 16k
  ssl-ciphers: ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH
  ssl-protocols: TLSv1 TLSv1.1 TLSv1.2
  ssl-redirect: "false"
  ssl-session-cache: "true"
  upstream-keepalive-connections: "200"
  use-forwarded-headers: "true"
  use-geoip: "false"
  use-gzip: "true"
  worker-cpu-affinity: auto
  worker-processes: auto

好的,以下是 Kubernetes 中使用 Ingress 进行配置的一些步骤: 1. 首先需要安装 Ingress Controller,可以使用 Nginx、Traefik、HAProxy 等多种 Ingress Controller。可以使用以下命令安装 Nginx Ingress Controller: ``` kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.40.2/deploy/static/provider/cloud/deploy.yaml ``` 2. 创建 Ingress 资源文件,例如: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: foo-service port: name: http - path: /bar pathType: Prefix backend: service: name: bar-service port: name: http ``` 上述示例中,创建了一个名为 `my-ingress` 的 Ingress 资源,将 `example.com` 上的 `/foo` 和 `/bar` 路径分别映射到名为 `foo-service` 和 `bar-service` 的后端服务上。 3. 使用 `kubectl apply` 命令应用 Ingress 资源文件: ``` kubectl apply -f my-ingress.yaml ``` 4. 配置 DNS 解析,将 `example.com` 解析到 Kubernetes 集群的 Ingress IP 地址上。 5. 配置 TLS,可以使用 Kubernetes 的 Secret 对象来存储 TLS 证书和私钥,然后在 Ingress 资源文件中引用: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/ssl-cert: "my-tls-secret" spec: tls: - hosts: - example.com secretName: my-tls-secret rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: foo-service port: name: http - path: /bar pathType: Prefix backend: service: name: bar-service port: name: http ``` 上述示例中,`my-tls-secret` 是存储 TLS 证书和私钥的 Secret 对象的名称。 希望这些步骤对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloud孙文波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值