다모앙 사이트 트래픽을 줄이는 기술적인 방법이 뭐가 있을까요?
유비

Lv.1 유비 (115.♡.183.220)

2024년 5월 14일 AM 11:40 · 수정됨(15:15)

조회 1,159 공감 0

제가 엔지니어가 아니라서 클로드에 물어봤습니다.

정리해보면,

  1. 이미지 최적화 및 압축 
  2. CDN활용
  3. 브라우저 캐싱 최적화
  4. 지연로딩기법 활용
  5. 핫링크 방지 및 참조 제한


예전에 작은 사이트 하나 운영할때 저는 5번이 가장 도움이 되었던 것 같은데..

전문가 분들이 보실때 뭐를 해야 트래픽 절감에 도움이 될까요?

덧)

찾아보니 kraken.io는 유료네요.


---------

동시 방문자 수가 많은 대규모 커뮤니티 사이트에서 트래픽 문제를 해결하기 위해서는 여러 가지 기술적인 방법을 취해야 합니다. 에디터로 업로드되는 원본 이미지 사이즈로 인한 문제를 해결하기 위해서는 다음과 같은 단계적 방법을 권장합니다:

  1. 이미지 최적화 및 압축
    • 이미지를 업로드할 때, 원본 이미지를 서버에 저장하지 말고 적절한 크기와 품질로 최적화된 이미지를 생성하여 저장합니다.
    • 이미지 압축 기술(예: TinyPNG, Kraken.io 등)을 활용하여 이미지 파일 크기를 최소화합니다.
    • 적용 방법: 이미지 업로드 시 서버 측에서 최적화 및 압축 작업을 수행하도록 코드를 수정합니다.
  2. CDN(Content Delivery Network) 활용
    • 이미지와 같은 정적 파일을 지리적으로 분산된 CDN 서버에 캐싱하여 사용자 가까운 곳에서 컨텐츠를 제공합니다.
    • 이를 통해 서버 부하를 줄이고 사용자 응답 속도를 개선할 수 있습니다.
    • 적용 방법: 신뢰할 수 있는 CDN 서비스 업체(예: AWS CloudFront, Cloudflare, Fastly 등)를 선택하고, 이미지 파일을 CDN에 업로드합니다.
  3. 브라우저 캐싱 최적화
    • 적절한 HTTP 캐시 제어 헤더(Cache-Control, Expires, ETag 등)를 설정하여 브라우저에서 이미지를 효율적으로 캐싱할 수 있도록 합니다.
    • 이를 통해 불필요한 이미지 다운로드를 줄일 수 있습니다.
    • 적용 방법: 서버 측에서 HTTP 헤더를 적절히 설정하도록 코드를 수정합니다.
  4. Lazy Loading 및 지연 로딩 기법 활용
    • 게시물 리스트에서 최초로 보이는 부분의 이미지만 우선적으로 로딩하고, 나머지는 사용자 스크롤 시 지연 로딩합니다.
    • 이를 통해 초기 페이지 로딩 시간을 단축하고 불필요한 트래픽을 줄일 수 있습니다.
    • 적용 방법: 프론트엔드 코드에 Lazy Loading 라이브러리(예: LazySizes, lazysizes 등)를 적용합니다.
  5. 핫링크 방지 및 참조 제한
    • 외부 사이트에서 귀하의 이미지 URL을 직접 참조하지 못하도록 방지 정책을 적용합니다.
    • 이를 통해 불필요한 트래픽을 줄일 수 있습니다.
    • 적용 방법: .htaccess 파일에 핫링크 방지 규칙을 추가하거나, 서버 측에서 HTTP Referer 헤더를 확인하여 제한할 수 있습니다.

이러한 방법들을 단계적으로 적용하면 원본 이미지 업로드로 인한 서버 부하 및 트래픽 문제를 상당 부분 해결할 수 있을 것입니다. 필요에 따라 웹 서버 및 데이터베이스 최적화, 캐싱 전략 개선 등의 추가적인 조치도 고려해볼 수 있습니다.


댓글 (15)

  • 케이건

    케이건 Lv.1

    24.05.14 · 168.♡.154.45

    1번 같은 경우 대형 사이트에서 사용하는 방법 아닌가요? 네이버 같은?
    글에 삽입된 사진은 압축된 걸로 보여주고...
    클릭했을 때 원본을 보여주는...
  • 오땅

    오땅 Lv.1 → 케이건 작성자

    24.05.14 · 115.♡.183.220

    1번은 이미 작업중이라고 하시네요.
  • 농약벌컥벌컥

    농약벌컥벌컥 Lv.1

    24.05.14 · 136.♡.34.113

    방법은 많죠 문제는 단순히 가성비로 가느냐 품질유지로가느냐인데
    최종은 후자로 가지만 시간도 비용도 생각해야되는지라 단시간에 할수있는 물리적인방법들로 앙님들이 할수있는건 이벤트성이라도 해봤으면 하는바램입니다. 이건 바로바로 세이브할수있는 현찰같은거라
  • 오땅

    오땅 Lv.1 → 농약벌컥벌컥 작성자

    24.05.14 · 115.♡.183.220

    공지 내용을 보면 일단, 무료, 혹은 가성비가 우선일 것 같습니다.
  • 에피네프린

    에피네프린 Lv.1

    24.05.14 · 121.♡.158.120

    서버사이드 캐싱도 필요하죠
    글목록 같은거
  • 오땅

    오땅 Lv.1 → 에피네프린 작성자

    24.05.14 · 115.♡.183.220

    추가질문을 해보았습니다.

    ---
    그누보드의 글 목록을 서버 사이드에서 캐싱하면 트래픽 절감에 도움이 될 수 있습니다.

    일반적으로 커뮤니티 사이트에서 글 목록 페이지는 매우 자주 요청되는 페이지입니다. 이 페이지를 서버에서 동적으로 생성하려면 데이터베이스 쿼리, 렌더링 등의 작업이 필요하므로 리소스 소모가 많습니다.

    하지만 글 목록 데이터는 비교적 자주 변경되지 않는 편입니다. 따라서 이 데이터를 메모리나 디스크 기반의 캐시에 저장해 두면, 이후 요청 시 캐시에서 바로 데이터를 읽어올 수 있습니다.

    서버 사이드 캐싱을 적용하면 다음과 같은 이점이 있습니다:

    데이터베이스 부하 감소
    캐시에서 데이터를 읽기 때문에 데이터베이스 쿼리 실행 횟수가 줄어듭니다.
    서버 리소스 절약
    데이터 렌더링 및 동적 페이지 생성 작업의 부하가 줄어듭니다.
    응답 시간 단축
    데이터가 캐시에서 바로 제공되므로 사용자에게 더 빠른 응답 시간을 제공할 수 있습니다.
    트래픽 절감
    데이터베이스와 웹 서버 간의 트래픽이 감소합니다.
    다만, 캐싱을 적용할 때에는 다음 사항에 유의해야 합니다:

    새 글이 등록되거나 글이 수정/삭제될 때 캐시를 무효화하는 메커니즘이 필요합니다.
    캐시 무효화 작업은 또 다른 오버헤드가 될 수 있습니다.
    과도한 캐싱으로 인해 데이터 정합성이 저해되지 않도록 주의해야 합니다.
    따라서 트래픽 부하가 높고 글 목록 데이터의 변경 주기가 비교적 길다면, 서버 사이드 캐싱을 적용하는 것이 효과적일 것입니다. 하지만 구현 시에는 적절한 캐시 무효화 전략과 데이터 정합성 유지 방안을 함께 고려해야 합니다.


    --
    그누보드에서 글 목록을 서버 사이드 캐싱하기 위해서는 다음과 같은 단계를 따를 수 있습니다:

    캐시 라이브러리 선택 및 설치
    Redis, Memcached 등 메모리 기반 캐시 시스템 중 하나를 선택합니다.
    선택한 캐시 시스템을 서버에 설치하고 구성합니다.
    그누보드 소스 코드에 캐시 라이브러리를 연동하는 코드를 추가합니다. (예: PhpRedis 또는 Memcached 라이브러리)

    글 목록 데이터 캐싱 로직 구현
    latest.php 또는 list.php 등 글 목록을 출력하는 파일에서 캐싱 로직을 구현합니다.
    먼저 캐시에서 데이터를 읽어옵니다.
    캐시 데이터가 없다면 데이터베이스에서 쿼리를 실행하여 데이터를 가져온 후 캐시에 저장합니다.
    캐시 키는 적절하게 설정해야 합니다. (예: 게시판 번호, 페이지 번호, 정렬 조건 등을 조합)

    캐시 무효화 전략 수립
    새 글이 등록되거나 기존 글이 수정/삭제될 때 관련 캐시를 무효화해야 합니다.
    write.phpdelete.php 파일에서 적절한 시점에 캐시 무효화 코드를 추가합니다.
    캐시 무효화 시 전체 캐시를 지우거나, 영향을 받는 특정 캐시 키만 제거할 수 있습니다.

    캐시 만료 정책 설정
    캐시 데이터에 적절한 만료 시간(TTL)을 설정합니다.
    일정 시간이 지난 후에는 캐시 데이터를 무효화하여 데이터베이스에서 새로 가져옵니다.

    캐시 관련 설정 파일 분리 및 관리
    캐시 관련 설정 값들을 별도의 설정 파일(예: cache.config.php)에 분리하여 관리합니다.
    캐시 시스템 주소, 포트, 비밀번호 등의 설정 값을 이 파일에 저장합니다.

    모니터링 및 최적화
    캐시 적중률(hit ratio)과 메모리 사용량 등을 모니터링합니다.
    필요에 따라 캐시 크기, 만료 정책 등을 조정하여 최적화합니다.

    이렇게 구현하면 글 목록 페이지 요청 시 데이터베이스 대신 캐시에서 데이터를 읽어오게 되므로 서버 부하와 트래픽이 감소할 것입니다.

    단, 캐시 시스템 설치, 라이브러리 연동, 캐시 로직 구현 등의 작업이 필요하므로 개발 리소스가 소모됩니다. 또한 캐시 무효화 및 일관성 유지 전략이 중요하므로 주의 깊게 설계해야 합니다.
  • 이니즈

    이니즈 Lv.1

    24.05.14 · 119.♡.141.29

    트래픽을 줄이는 고민도 중요하고, 역으로 늘어나는 트래픽만큼 비용이 충당되는 구조를 만드는 방안을 고민하는 것이 근본적인 해결책이라고 생각합니다. 동일한 트래픽에서 필요한 비용을 줄이는 것 역시 회원분들도 같이 고민해주고 계신 것으로 알고 있구요.
  • 오땅

    오땅 Lv.1 → 이니즈 작성자

    24.05.14 · 115.♡.183.220

    일단 극단적으로 줄이는게 필요해보입니다. 일런 머스크, 트위터 인수 당시 사례랑 비슷해 보여요.
  • Life2Buff

    Life2Buff Lv.1

    24.05.14 · 59.♡.207.48

    1번은 이미 작업 중이라고 sdk님께서 오늘 아침에 언급을 하셨어요.
    [https://s3.damoang.net/data/editor/2405/comment_990498608_sC9I0pz5_282abfd4492abff2e83b4e4635416959adc031fd.webp]
  • 네모아범

    네모아범 Lv.1

    24.05.14 · 49.♡.253.15

    장기적으로는 사이트 최적화와 함께 사이트의 수익 안정성을 도모해야 하지 않나 생각합니다. 트래픽에 비례해서 수익도 당연히 비례되어 돈 걱정 하지 않는 운영을 해야 하지 않을까요

댓글을 작성하려면 이 필요합니다.