• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글
잡담

넥클 리버스프록시 traefik으로 드디어 성공했어요!

SHISHAMO 224

4

4

넥스트클라우드 때문에 며칠을 고생한지 모르겠습니다.

 

 

처음에 넥클 설치하고 나서 -> 어 업로드가 느리다? 해서 aio도 설치해 보고 각종 설정을 해봐도, 애드가드를 꺼봐도, 클플 프록시를 꺼도 계속 느려서 -> 그럼 넥클은 원래 느린가?가 되서 pydio나 own을 설치해 보기 시작했습니다.

 

 

그런데 own도..! 느립니다. 업로드 속도가 안나와요.

그럼 도메인을 타고 올 때 느리구나! 해서 외부 ip로 접속하니 정상 속도가 나옵니다 -> 그럼 npm plus 쪽 문제인가 해서, 각종 설정을 붙여보곤 했는데...그래도 안되요 ㅠㅜㅜㅜ

 

 

그러던 중 NavyStack님이 traefik을 소개해 주셨고 이렇게 된 거, 도전해보자가 되었습니다.

 

 

그런데... 저는 한번도 도커 compose를 해 본 경험이 없습니다. 애초에 unraid의 커뮤니티 앱에 심히 의존중이었습니다. 어떻게 해야 할지 막막했는데 NavyStack님의 깃허브와, 블로그를 통해

기본적인 뼈대는 완성할 수 있었고, 그래도 작동되지 않는 부분은 NavyStack님이 재현까지 해 주시면서 도와주셔서

 

Screenshot 2024-02-05 at 22.55.37.png.jpg

compose도 하고, 

 

 

Screenshot 2024-02-05 at 23.00.52.png.jpg

이렇게 대시보드까지 확인할 수 있었습니다.

 

 

그 이후로, 본격적으로 넥클 리버스프록시에 도전을 시도했습니다. gui 환경이 있어 리버스프록시 설정이 쉬운 npmplus와 달리 traefik은 gui는 오직 대시보드만 있기 때문에 솔직히 좀 많이 난감했었습니다.

 

 

그리고 NavyStack님은 .yml에 바로 설정을 작성했었지만, 저는 unraid 커뮤니티앱을 사용하고 있었기에, 별도 컨테이너 앱을 연결을 해야 했었고, .yml에 작성시 에러가 생겼기 때문에 어떻게 해야 할지 고민이었습니다(제가 제대로 못한 것 일수도 있겠지만).

 

 

그렇게 찾다보니 알게된게, compose시 만들어 두었던 dynamic.toml 파일이었습니다.

 

Traefik에서 dynamic.toml과 traefik.toml 파일은 각각 동적 구성(dynamic configuration)과 정적 구성(static configuration)을 담당합니다.

 

  • 동적 구성(dynamic configuration): dynamic.toml 파일은 시스템이 요청을 어떻게 처리할지 정의하는 모든 것을 포함합니다. 이 구성은 변경될 수 있으며, 요청 중단이나 연결 손실 없이 원활하게 핫 리로드됩니다. Traefik은 프로바이더(예: 오케스트레이터, 서비스 레지스트리, 일반 구성 파일 등)로부터 동적 구성을 가져옵니다. HTTPS 인증서도 동적 구성에 속하며, Traefik 인스턴스를 재시작하지 않고 추가/업데이트/제거할 수 있습니다.

 

  • 정적 구성(static configuration): traefik.toml 파일은 프로바이더에 대한 연결을 설정하고, Traefik이 수신할 엔트리포인트를 정의하는 등의 요소를 포함합니다1. 이러한 요소들은 자주 변경되지 않습니다. 정적 구성은 Traefik이 시작할 때 /etc/traefik/, $XDG_CONFIG_HOME/, $HOME/.config/, 작업 디렉토리 등에서 traefik.yml (또는 traefik.yaml 또는 traefik.toml) 파일을 찾아 로드합니다.

 

따라서, dynamic.toml은 시스템이 요청을 어떻게 처리할지를, traefik.toml은 Traefik이 어떻게 작동할지를 각각 정의합니다. 이 두 파일은 Traefik의 핵심 구성 요소로, 서로 다른 역할을 수행합니다.

이 dynamic에서 특정 도메인의을 어느 ip로 연결할지(?) 처리가 가능했습니다. 그래서 NavyStack님의 깃허브 내용과 제가 찾아본 내용을 토대로 

 

[http]
  [http.middlewares] #미들웨어 종류
    [http.middlewares.security-headers.headers] #보안미들웨어
      browserXssFilter = true # 브라우저의 내장 XSS(크로스 사이트 스크립팅) 필터를 활성화
      contentTypeNosniff = true #브라우저가 응답의 MIME 유형을 추측하지 못하게 하여, MIME 유형 변조 공격을 방지
      forceSTSHeader = true #  HTTP Strict Transport Security(HSTS)를 구성
      stsPreload = true # HTTP Strict Transport Security(HSTS)를 구성
      stsSeconds = 31536000 # HTTP Strict Transport Security(HSTS)를 구성
      stsincludesubdomains = false # HTTP Strict Transport Security(HSTS)를 구성
      isdevelopment = false #개발 모드를 비활성화
      
    [http.middlewares.security-nextcloud.headers] #넥스트클라우드 커스텀. referrerPolicy 추가.
      browserXssFilter = true
      contentTypeNosniff = true
      forceSTSHeader = true
      stsPreload = true
      stsSeconds = 31536000
      stsincludesubdomains = false
      isdevelopment = false
      referrerPolicy = "no-referrer" #브라우저는 Referer 헤더를 전혀 보내지 않음, __Host-Prefix 용

    [http.middlewares.websocket.headers.customRequestHeaders] #웹소켓 요청에 대한 사용자 정의 헤더를 설정
      X-Forwarded-Proto = "https, wss" #이 헤드를 헤더를 "https, wss"로 설정, 프록시된 요청이 HTTPS/WSS(WebSocket Secure)로 이루어짐으로 나타냄냄

    [http.middlewares.www-to-Root.redirectRegex] #정규 표현식을 사용하여 요청을 다른 위치로 리다이렉트
      regex = "^https?://www\\.(.+)" #“www” 서브도메인에서 루트 도메인으로의 리다이렉트를 설정
      replacement = "https://${1}"
      permanent = true

    [http.middlewares.normal-compress.compress] #압축미들웨어(기본)
      minResponseBodyBytes = 1024
    
    [http.middlewares.large-compress.compress] # 압축미들웨어(라지, 넥클같은 고용량 클라우드 용?)
      minResponseBodyBytes = 8192  
    
    [http.middlewares.ratelimit-normal.ratelimit] # rate limiting을 설정
      average = 100 #특정 시간 동안 허용되는 평균 요청 수를 지정, 이 설정은 초당 100
      burst = 50  #일시적인 요청의 폭증을 처리하기 위한 버퍼를 지정
   
    [http.middlewares.ratelimit-large.ratelimit] # 대용량 파일, 동시 여러 미디어 스트리밍 등.
      average = 1000
      burst = 500  

    [http.middlewares.retry.retry] #재시도(retry) 미들웨어, 서비스 일시 불능 or 응답X 때 요청을 자동 재시도
      attempts = 3 #3회 재시도도

  [http.routers] #Traefik에서 HTTP 요청을 처리하는 라우터를 정의
    [http.routers.nextcloud] #넥스트클라우드 이름의 라우터 정의
      rule = "Host(`도메인`)" # 라우터가 어떤 요청을 처리할지를 결정하는 규칙을 정의, ''안의 도메인으로 들어오는 모든 요청 처리
      service = "nextcloud-aio" # 라우터가 요청을 전달할 서비스를 지정
      entrypoints = ["websecure"] #라우터가 수신할 네트워크 진입점을 지정
      middlewares = ["security-nextcloud", "large-compress", "ratelimit-large", "retry"] #사용할 미들웨어
      [http.routers.nextcloud.tls] # 라우터가 TLS(Transport Layer Security)를 사용하여 요청을 처리하도록 설정
        certresolver = "cloudflare" # TLS 인증서를 해석하는데 사용할 CertResolver를 지정
        domains = [ { main = "*.도메인" } ] #인증서를 발급받을 도메인을 지정

  [http.services] #Traefik에서 사용할 서비스를 정의, 서비스는 라우터로부터 요청을 받아 처리
    [http.services.nextcloud-aio.loadBalancer] #로드 밸런서 서비스를 정의, 로드 밸런서는 여러 서버 간에 요청을 분산
      [[http.services.nextcloud-aio.loadBalancer.servers]] #서비스가 요청을 전달할 서버의 URL을 지정
        url = "http://아이피"

[tls.options] # Traefik에서 사용할 TLS 옵션을 정의
  [tls.options.default]
    minVersion = "VersionTLS12"
  [tls.options.mintls13]
    minVersion = "VersionTLS13"

 

이렇게 만들었습니다. traefik은 여러 미들웨어를 만들고, 그 미들웨어 조합으로 다양한 설정을 할 수 있는데요.

Traefik에서 미들웨어는 두 가지 다른 컴포넌트 사이에 위치한 소프트웨어 조각으로, 요청을 수정하거나 헤더를 변경하고, 리다이렉션을 담당하며, 인증을 추가하는 등의 역할을 합니다.

저렇게 여러 미들웨어로 각 사이트 별 특성에 맞게 조합을 할 수 있다는 점이 재미있고, 좋았습니다. 다만 아직 traefik은 압축에서 gzip만 사용가능하더라고요. Brotli는 아직 베타인 v3 버전에서만 지원해서 나름 v3가 벌써 기대되기도 합니다.

 

저 traefik은 생각보다 미들웨어나 기타 등등 찾아보고 찾아보는 맛이 있어서, 나중에 공홈에서 한 번 싹 둘러봐야겠습니다. 

 

 

 

 

그렇게... 넥스트클라우드 리버스 프록시를 완성하고 다시 넥클 aio를 설치했습니다.

 

Screenshot 2024-02-05 at 14.16.52.png.jpg

npm 때에는 어떻게 해도 

  • "X-XSS-Protection" HTTP 헤더가 "1; mode=block"을(를) 포함하고 있지 않습니다. 잠재적인 정보 유출 및 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.

이 에러 해결이 되지 않았었는데 이제 깔끔합니다!!!!

 

Screenshot 2024-02-05 at 14.17.26.png.jpg

그리고 미들웨어에서 referrerPolicy - 'no-referrer'를 추가함으로서 넥클 보안검사에서도 A+를 받을 수 있었습니다. 

 

그리고 대망의 업로드 확인 시간.

그런데 여전히 업로드 속도가 나오지 않아 순간 엄청 당황했었습니다 ㅋㅋㅋㅋㅋㅋㅋ

 

그러다 에이 설마..하고 애드가드를 껐더니.. 잘 됩니다!!! 저는 애드가드를 브라우저 확장이 아니라, 윈도우 앱으로 설치해서 사용중에 있거든요? 그래서인지 몰라도 브라우저 예외처리를 해도 속도 차이가 은근 있네요. 넥클 사용할 때에는 애드가드를 꺼야 할 듯...?

 

저희집 인터넷환경에서 구드랑 비교해보면, 4.37기가 짜리 단일 압축파일을 업로드시

 

구글 드라이브 : 약 25MB/s

넥스트클라우드(청크 사이즈 100MB, 클라우드플레어 프록시 환경) : 약 5.5MB/s

넥스트클라우드(청크 사이즈 500MB, 클라우드플레어 DNS only) : 약 30MB/s

 

로 매우 무난한 업로드 속도를 보여줬습니다. 청크 사이즈를 0으로 조절하면 업로드가 아예 되지 않아, 500으로 확정 지었고, 업로드 완료 후, 마무리 작업에서(아마 청크로 업로드 한 거, 모으는?) 30초 가량 소모를 했으니, 실제 업로드 속도는 더 빠른 것으로 보입니다.

 

스크린샷 2024-02-05 153930.png.jpg

정말 감격의 속도가 ㅠㅠㅠㅠㅠㅠ

반기가라 거의 회선 속도 다 뽑아먹네요.

프록시를 끄고 싶지 않은데... 속도 차이가 너무 나서 끄고 사용해야 하겠네요ㅋㅋㅋ

 

이렇게 업로드 속도로 고생했던 넥스트클라우드 설치를 마무리 지을 수 있었습니다. 다시 한번, 큰 도움을 주신 NavyStack님께 감사인사드립니다.

 

신고공유스크랩
4
profile image 1등
NavyStack 2024.02.06. 00:09

:) 뿌듯뿌듯 합니다.
혹시 넥스트 클라우드에서 헤더 가지구 뭐라하면

https://navystack.com/nextcloud를-위한-traefik-설정-세팅/

요거 해보세요 :)

 

yml은 이스케이핑이 필요한 경우가 있어서

가급적 저는 toml 사용합니다 :)

docker-compose.yml 도 소리소문 없이 이스케이핑 처리를 바꿔서... ㅠㅠ

 

가끔 깃허브 돌아다니가다 보면 안되는 docker-compose.yml이 전부 이런경우입니다.

SHISHAMO 글쓴이 2024.02.06. 00:50
NavyStack
오 감사합니다 ㅎㅎ
지금은 다행이도 헤더 가지고 뭐라하지는 않네요.
이스케이핑이 자주 바뀌나 보군요 ㄷㄷㄷ
2등
나스초보당 2024.02.06. 00:36
npm 저런오류는 처음보네요 well known 어쩌고 오류는 깃허브에 있는데로 추가설정에 스크립트 복사해주면 사라지네요
SHISHAMO 글쓴이 2024.02.06. 00:51
나스초보당
제 환경에서 복합적으로 맞지 않았던 건지 몰라도 그렇더라고요.
덕분에 traefik에 도전했고, 무척 만족스럽습니다 ㅎㅎ

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story

본 게시판은 서버구축 게시판과 통합되었습니다.

서버구축 게시판 이동하기