배포: 내부 살펴보기

이 문서는 Wagtail 호스팅 개념에 대한 기술적 심층 분석을 제공합니다. 대부분의 경우, 대신 호스팅 제공업체를 선택하고 싶을 것입니다.

Wagtail은 Django를 기반으로 구축되었으므로 Django 배포에 대한 배포 단계 및 고려 사항의 대부분이 Wagtail에도 동일하게 적용됩니다. Django의 “Django 배포 방법” 문서를 읽는 것을 권장합니다.

인프라 요구 사항

Wagtail 사이트 호스팅을 위한 인프라를 설계할 때 몇 가지 기본 요구 사항이 있습니다:

WSGI / ASGI 서버

웹 프레임워크인 Django는 작동하기 위해 웹 서버가 필요합니다. 대부분의 웹 서버는 기본적으로 Python을 사용하지 않으므로 통신이 이루어지도록 인터페이스가 필요합니다.

Wagtail은 WSGI 또는 ASGI를 사용하여 배포할 수 있지만, Wagtail은 기본적으로 비동기 뷰나 미들웨어를 구현하지 않으므로 WSGI를 권장합니다.

정적 파일

모든 Django 프로젝트와 마찬가지로, 정적 파일은 개발 중에 manage.py runserver 명령을 통해 실행할 때 Django 애플리케이션 서버에 의해서만 제공됩니다. 프로덕션 환경에서는 웹 서버 수준에서 별도로 처리해야 합니다. Django의 정적 파일 배포에 대한 문서를 참조하세요.

Wagtail 관리자에 사용되는 자바스크립트 및 CSS 파일은 Wagtail 릴리스 간에 자주 변경됩니다 - 브라우저 또는 서버 측 캐싱으로 인해 오래된 버전의 파일이 제공되는 것을 피하는 것이 중요합니다. 이는 진단하기 어려운 문제를 일으킬 수 있습니다. STORAGES["staticfiles"] 설정에서 ManifestStaticFilesStorage를 활성화하는 것을 권장합니다 - 이렇게 하면 다른 버전의 파일에 고유한 URL이 할당됩니다.

사용자 업로드 파일

Wagtail은 Django의 업로드 파일 관리 규칙을 따릅니다. 따라서 기본적으로 Wagtail은 Django의 내장 FileSystemStorage 클래스를 사용하여 MEDIA_ROOT 설정에 지정된 디렉터리에 있는 사이트 서버에 파일을 저장합니다. 또는 Amazon S3와 같은 클라우드 스토리지 서비스에 업로드된 이미지와 문서를 저장하도록 Wagtail을 구성할 수 있습니다. 이는 django-storages와 같은 애드온 패키지와 함께 STORAGES["default"] 설정을 통해 수행됩니다.

보안

사용자 업로드 파일을 허용하는 모든 시스템은 잠재적인 보안 위험입니다. 예를 들어, HTML 파일을 업로드할 수 있는 사용자는 해당 파일을 보는 사용자에 대해 사이트 간 스크립팅 공격을 시작할 수 있습니다. Wagtail 관리자에 액세스할 수 있는 모든 사용자가 완전히 신뢰할 수 있는 경우(예: 당신이 유일한 편집자인 개인 사이트) 이는 문제가 되지 않을 수 있습니다. 이를 염두에 두고 Wagtail은 기본적으로 보안 구성을 제공하는 것을 목표로 하지만, 개발자는 아래에 자세히 설명된 위험을 이해한다면 더 허용적인 설정을 선택할 수 있습니다.

이미지

FileSystemStorage 를 사용할 때 이미지 URL은 MEDIA_URL 에 지정된 경로에서 시작하여 구성됩니다. 대부분의 경우, 웹 서버가 MEDIA_ROOTimages 하위 디렉터리에서 직접 이미지 파일을 제공하도록 구성하고(Django/Wagtail을 통하지 않고) original_images 하위 디렉터리에 대한 액세스를 차단해야 합니다. SVG 이미지가 활성화된 경우, 사용자가 파일을 직접 볼 때 실행되는 스크립트가 포함된 SVG 파일을 업로드할 수 있습니다. 이것이 우려되는 경우, 이를 피하기 위한 몇 가지 방법이 보안 고려 사항에 자세히 설명되어 있습니다.

클라우드 스토리지 백엔드 중 하나를 사용하는 경우, 이미지 URL은 클라우드 스토리지 파일 URL로 직접 이동합니다. 별도의 자산 서버나 CDN에서 이미지를 제공하려면 이미지 제공 뷰를 구성하여 대신 리디렉션할 수 있습니다.

문서

문서 제공은 WAGTAILDOCS_SERVE_METHOD 메서드에 의해 제어됩니다. FileSystemStorage 를 사용하는 경우, 문서는 사이트의 MEDIA_ROOTdocuments 하위 디렉터리에 저장됩니다. 이 경우 WAGTAILDOCS_SERVE_METHOD 는 기본적으로 serve_view 이며, Wagtail은 개인 정보 보호 검사를 시행하는 Django 뷰를 통해 문서를 제공합니다.

대체 제공 방법인 'direct''redirect'MEDIA_ROOT 에서 직접 문서를 제공하여 작동합니다. 이는 documents 하위 디렉터리에 대한 직접 액세스를 차단할 수 없음을 의미합니다.

원격(“클라우드”) 스토리지 백엔드를 사용하는 경우, 제공 방법은 기본적으로 'redirect' 가 되며 문서는 클라우드 스토리지 파일 URL에서 직접 제공됩니다. 이 경우(그리고 'direct' 의 경우), Wagtail은 파일이 제공되는 방식에 대한 제어가 적어 추가 구성이 필요할 수 있습니다.

사용자 업로드 파일을 허용하는 모든 시스템은 잠재적인 보안 위험입니다. WAGTAILDOCS_SERVE_METHODserve_view 로 설정되면, Wagtail은 문서가 안전하게 제공되도록 보장하고 권한 확인을 시행하며 사이트 간 스크립팅을 방지합니다. 대체 제공 방법인 'direct''redirect' 는 구성된 스토리지 백엔드를 통해 MEDIA_ROOT 에서 직접 문서를 제공하여 작동합니다. 이러한 경우, 업로드된 파일이 안전하게 제공되도록 추가적인 주의를 기울여야 합니다. 업로드된 문서를 보호하기 위한 몇 가지 접근 방식이 보안 고려 사항에 자세히 설명되어 있습니다.

클라우드 스토리지

원격 스토리지를 설정해도 파일 처리 작업이 애플리케이션 서버에서 완전히 오프로드되지는 않는다는 점에 유의하세요. 일부 Wagtail 기능은 애플리케이션 서버에서 파일을 다시 읽어야 합니다. 특히, 새 크기 조정된 렌디션이 생성될 때마다 원본 이미지 파일을 다시 읽어야 하며, 문서는 권한 확인을 시행하기 위해 Django 뷰를 통해 제공되도록 구성될 수 있습니다( WAGTAILDOCS_SERVE_METHOD 참조).

참고

django-storages Amazon S3 백엔드(storages.backends.s3boto.S3BotoStoragestorages.backends.s3boto3.S3Boto3Storage)는 기본 구성에서 중복 파일 이름을 올바르게 처리하지 못합니다. 이러한 백엔드를 사용할 때는 AWS_S3_FILE_OVERWRITEFalse 로 설정해야 합니다.

캐시

Wagtail은 페이지 로드를 가속화하기 위해 사용 가능할 때 Django의 캐시 프레임워크를 활용하도록 설계되었습니다. 캐시는 특히 기존의 CDN 캐싱을 활용할 수 없는 Wagtail 관리자에 유용합니다.

Wagtail은 Django의 모든 캐시 백엔드를 지원하지만, Django가 실행 중인 특정 프로세스나 환경에 연결된 것(예: FileBasedCache 또는 LocMemCache)은 사용하지 않는 것이 좋습니다.

배포 팁

Wagtail, 그리고 확장하여 Django는 다양한 플랫폼에서 다양한 방법으로 배포될 수 있습니다. 배포하는 “최고의” 방법은 없지만, 사이트를 가능한 한 안정적이고 유지 관리 가능하게 만들기 위한 몇 가지 팁이 있습니다:

Django의 배포 체크리스트 사용하기

Django에는 Django 애플리케이션을 배포하기 전에 수행했어야 하거나 알아야 할 모든 것을 실행하는 배포 체크리스트가 있습니다.

성능 최적화

프로덕션 사이트는 가능한 한 빠르고 성능이 좋아야 합니다. Wagtail이 가능한 한 잘 수행되도록 하는 방법에 대한 팁은 성능 팁을 참조하세요.

배포 예시

몇몇 호스팅 플랫폼에서의 배포 예시는 서드파티 튜토리얼에서 찾을 수 있습니다. 이는 Wagtail을 실행할 수 있는 플랫폼의 전체 목록이 아니며, 거기서 Wagtail을 실행하는 유일한 방법도 아닙니다.

프로덕션 Wagtail 사이트의 예로는 Heroku에서 실행되는 guide.wagail.org가 있으며, 이는 오픈 소스입니다. 호스팅 환경에 대한 자세한 정보는 해당 문서에서 찾을 수 있습니다.

플랫폼이나 인프라에 Wagtail을 성공적으로 설치했다면, 이 문서에 여러분의 노트를 기여해주세요!