ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 단일 진입점으로 개별 서비스의 Swagger 접근하기
    운영 중인 서비스/Coconut. 2024. 4. 13. 22:02

     

     

    서비스의 진입점에 Nginx를 사용하여 리버스 프록시 서버를 사용하고 있습니다.

    퀴즈 서비스와 커뮤니티 서비스에 떠있는 Swagger를 단일 진입점에서 접근가능하도록 설정하는 과정을 정리하고있습니다.

    (실제 서비스 swagger 주소는 블로그 작성 이후 변경하였습니다~ 접근하지말아주세요~)

     


     

    1.  기존 URI를 proxy_pass로 전달하는 방법

    프로젝트를 구성하면서 Nginx를 앞단에 리버스 프록시 서버로 사용하고 있습니다.

    /answer의 경우 처럼 기존에는 host 주소만 변경해서 라우팅을 처리하고 있었습니다.

     

     

     

    각 서비스에 정의되어있는 swagger를 연결하기 위해서 위와 같이 연결을 하였더니 바로 에러가 발생합니다.

    proxy_pass에 location과 동일한 regex가 들어있으면 안된다고 이야기합니다.

     

     

     

     

    nginx 세팅을 가끔 들어와서 하니, 할 때마다 헤매게 되는 것 같습니다.

    프록시 서버에 들어오는 요청에서 호스트만 proxy_pass와 변경하고 뒷 부분은 유지하기 때문에 위와 같은 설정은 완전히 잘못된 방법입니다.

     

     

     

    2. 기존 URI를 무시하고 새로운 경로로 이동하는 방법

    최초 요청을 무시하고 원하는 요청으로 변경하고 싶다면 아래와 같은 설정이 필요합니다.

    기존 요청의 URI를 /swagger-ui/index.html 로 rewrite 한다는 내용입니다.

    location ~ ^/swagger/quiz(/|$) {
        rewrite ^/swagger/quiz(/|$) /swagger-ui/index.html break;
        proxy_pass http://10.0.2.7;
    }

     

     

    역시 이렇게 쉽게 해결될리가 없습니다 ㅋㅋㅋ

    Index.html에는 정상적으로 접근할 수 있지만, html에서 추가로 불러오는 리소스들은 모두 404가 뜨고 있는 것을 볼 수 있습니다.

     

     

    정적 리소스 호출 경로를 살펴보니 index를 호출한 경로를 기반으로 불러오고 있습니다. 

    html를  /ui 경로에서 불러오게 설정해주고 기타 리소스는 /swagger-ui/$1 로 연결해줍니다.

     

     

    다시 호출을 해보니 정적 리소스들은 잘 가져오는데 config 파일을 가져오는 것에 실패합니다.

    swagger 화면을 띄우기 위해서 많은 리소스들을 가져다 사용하네요...

     

     

    config의 경우에는 경로의 시작이 /v3 이기 때문에 변경이 필요합니다.

    검색을 해보니 application.yml에서 설정을 통해서 변경이 가능합니다.

    디폴트값이 /v3/api-docs 이고 이것을 nginx에서 프록싱하기 적절하게 변경해줍니다.

    springdoc:
      api-docs:
        path: /swagger/quiz/api-docs
    #  swagger-ui:
    #    path: /swagger-ui

     

     

    최종적으로 정리한 conf 파일의 모습입니다. 앞으로 다른 서비스의 swagger들도 추가될 예정이기 때문에 별도의 swagger.conf를 만들어서 관리하기로 하였습니다.

     

     

    모든 리소스가 성공적으로 받아진 후의 모습입니다!!

     

     

     

    감사합니다.

Designed by Tistory.