nginx rewrite 와 nginx - ingress rewrite 이해

nginx 설정 에 proxy 가 있 습 니 다.pass 명령 어
location /name/ {
    proxy_pass http://127.0.0.1/remote/;
} 

이러한 설정, proxypass 뒤에 uri / remote 를 추가 하면 정상 적 인 요청 uri 에서 location 과 일치 하 는 부분 을 / remote 로 교체 합 니 다. 저 는 aa. xxx. net / gateway / a / b 대 리 를 백 엔 드 로 방문 하 는 것 은 svc - gateway: 8080 / a / b 와 유사 한 장면 이 있 습 니 다. 어떻게 설정 하 시 겠 습 니까?그 중의 gateway 를 차단 하 다.먼저 생각 나 는 것 은 ingress 안의 rewrite 주석 으로 문 제 를 해결 하 는 것 이다.
nginx 의 rewrite
공식 문서 링크 참조 ngxhttp_rewrite_module 모듈 은 PCRE 정규 표현 식 을 사용 하여 요청 URI 를 변경 하고 방향 을 바 꾸 거나 조건 부 설정 을 선택 합 니 다.break, if, return, rewrite, and set 명령 은 다음 순서대로 실 행 됩 니 다.
  • server 블록 을 순서대로 실행
  • 일치 하 는 location 블록 에 있 는 이 모듈 명령 을 실행 합 니 다
  • 순환 재 정립 최대 10 회
  • break 명령 어
    현재 ngx 처리 중지http_rewrite_module 명령 집합.location 내 if 명령 에 break 가 포함 되 어 있 으 면 location 내 다른 명령 이 계속 실 행 됩 니 다.
    rewrite 명령 어
    Syntax: rewrite regex replacement [flag];
    Default:    —
    Context:    server, location, if

    지정 한 정규 가 요청 한 uri 와 일치 하면 uri 는 replacement 으로 대 체 됩 니 다.rewrite 는 설정 파일 에 나타 난 순서대로 실 행 됩 니 다.다음 예제:
    location / {
        rewrite ^/a /b;
        #return 200 okokok;
        rewrite ^/b /c last;
        rewrite ^/d /b;
    }
    location = /b {
        return 401;
    }
    
    location = /c {
        return 402;
    }

    위의 설정 과 같이 localhost: port / d 를 방문 하면 401 rewrite 에서 지정 하지 않 은 flag 를 되 돌려 줍 니 다. flags 옵션 으로 뒤의 명령 을 종료 할 수 있 습 니 다.replacement 이 http: /, https: / 또는 $scheme 로 시작 하면 요청 이 뒤로 실행 되 지 않 고 redirect 는 클 라 이언 트 에 게 직접 돌아 갑 니 다.
    flag 옵션
        1、last        ngx_http_rewrite_module    ,      uri      location
        2、break    break       ,      location
        3、redirect,replacement   'http://'       ,       302
        4、permanent,       301

    요청 한 scheme 와 servername_in_redirect 와 portin_redirect 명령 형식 생 성
    nginx - ingress 의 rewrite 주해
    공식 링크 예제:
    ...
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    ...
    spec:
      rules:
      - host: aa.xxx.net
        http:
          paths:
          - backend:
              serviceName: svc-gateway
              servicePort: 8080
            path: /gateway(/|$)(.*)
          - backend:
              serviceName: svc-ui
              servicePort: 80
            path: /
      tls:
      - hosts:
        - aa.xxx.net
        secretName: xxx.net

    위 설정 에 따라 aa. xxx. net / gateway / a / b 를 방문 하면 aa. xxx. net / a / b 로 다시 쓰 겠 습 니 다. 즉, 제 가 다시 쓰 기 를 요청 한 후에 새로운 uri 에 따라 다시 일치 합 니 다. 그렇다면 경로 path: / a 를 추가 합 니 다. 그러면 다시 쓰 면 새로운 요청 은 이 path 로 갑 니 다. 그러나 실제 되 돌아 오 는 결 과 는 다음 설정 방식 과 는 다 릅 니 다. 이것 은 약간 혼 란 스 럽 습 니 다.분명 한 형님 께 서 알려 주 셔 서 감사합니다!
    두 번 째 방식:
    ...
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/server-snippet: |
          if ($uri ~* "/gateway/.*") {
              rewrite ^/gateway/(.*) /$1 break;
          }
        nginx.ingress.kubernetes.io/use-regex: "true"
    ...
    spec:
      rules:
      - host: aa.xxx.net
        http:
          paths:
          - backend:
              serviceName: svc-gateway
              servicePort: 8080
            path: /gateway(/|$)(.*)
          - backend:
              serviceName: svc-gateway
              servicePort: 8080
            path: /(admin|bg|auth|monitor)
          - backend:
              serviceName: svc-ui
              servicePort: 80
            path: /
      tls:
      - hosts:
        - aa.xxx.net
        secretName: xxx.net

    nginx. ingress. kubernetes. io / server - snippet 주 해 는 server 블록 에서 사용자 정의 설정 에 사용 되 며, nginx 설정 을 써 서 더 많은 수 요 를 실현 할 수 있 습 니 다.서버 블록 당 한 번 만 사용 할 수 있 습 니 다.이 방식 으로 proxy 와 유사 한 것 을 실현 하 였 습 니 다.pass 의 요구 사항

    좋은 웹페이지 즐겨찾기