一、匹配到的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