웹 서비스 Maintenance Mode (점검 모드) 지원기

온라인 서비스계의 유명한 4대 명검으로 유명한 점검 모드에 대해서 이야기하려 합니다.

점검 모드 지원 결정

운 좋게도 회사에서 운영하는 서비스가 2년 넘게 다운될 일이 없었습니다.
Agile모델이 잘 실행되었기 때문일까요? 매주 릴리즈 함에도 불구하고 근 몇 년간 99.99%의 가용성을 유지하고 있었습니다.

하지만 올해 초 AWS MySQL을 AWS Aurora로 Migration 하기로 합니다.

문제는 우리 회사의 서비스가 사용자에 의해서 수정이 자주 일어나는 온라인 에디터라는 것!
이러한 서비스 특성상, 실시간으로 DB에 데이터를 업데이트하는 일이 잦게 발생하고, 이를 방지하고자 readonly 페이지를 제공할까? 등등 고민을 하게 됩니다.

결국 추후에 발생할 수 있는 여러 사이드 이펙트 등을 고려하여 2시간가량 점검 페이지를 제공하기로 결정했습니다!

이 Post는 Maintenance Mode를 적용하기 위해서 고민하고 우려했던 부분들을 정리해서 올려보려고 합니다.

SEO를 헤치지 마오

점검 모드로 인해서 지금까지 쌓여있는 SEO에 문제가 생기면 안 된다고 마케팅팀에서 신신당부를 합니다. 만약 박살 나면 너도 같이 박살 날줄 알아라는 느낌적인 느낌.

저 또한 그 문제를 처음부터 고려하고 있었기에 조사를 해봤습니다.

이문제는 매우 간단하게 해결할 수 있었습니다.

점검 모드 제공 시, 503 HTTP 상태 코드를 사용하면 검색엔진이 임시 상태임을 파악하고 SEO에 죽창을 꽂지 않습니다.

503 Service Unavailable - The server is currently unavailable (this could be due to overload or maintenance). Search engines will know that this is a temporary state. This status code should be used when taking down a site for maintenance.

Retry-After 헤더 추가하기

503 (Service Unavailable) 응답이 전송된 경우, 서비스가 얼마나 오랫동안 이용 불가능한지 예측되는 시간을 가르킵니다.
301 (Moved Permanently)와 같은, 리다이렉트 응답이 전송된 경우, 리다이렉트 요청을 하기 이전에 사용자 에이전트가 대기해주길 원하는 최소한의 시간을 가르킵니다.

조사한 바에 의하면 모던 브라우저의 경우, 알아서 위 상황을 제어하긴 하지만 만약을 위하여 Retry-After 헤더를 추가해주기로 합니다. 이 또한 Nginx에서 추가할 수 있습니다.

Nginx를 수정하여 점검 페이지로 Redirect 하기

주의할 점은 파악이 끝났습니다. 점검 모드 제공을 위해 Nginx 설정을 만져봅시다.

# Nginx config file
location / {

    # 서비스의 root경로입니다. 
    # nginx로 서비스 중이라면 이미 존재할 테니 따로 수정해 줄 필요는 없습니다.
    root /usr/localhost/src/webservice

    ...

    # maintenance.html 파일이 존재하는지 확인합니다.
    # 만약 파일이 존재할 경우 503 code를 반환합니다.
    if (-f $document_root/maintenance.html) {
        return 503;
    }

    ...

    # 현재 상태가 503 경우 Retry-After header와 함께 maintenance.html 파일을 전달해줍니다.
    error_page 503 /maintenance.html;
    location /maintenance.html {
        add_header Retry-After 3600 always;
    }
}

위와 같이 변경 후 테스트 해 줍시다

# 변경한 nginx 테스트
nginx -t

# Nginx 서비스 리스타트
sudo service nginx restart

이후 점검 모드가 필요할 경우, 서비스 root 폴더에 maintenance.html 파일을 추가해주면 점검페이지로 진입하게 됩니다.

점검 모드가 끝나면 maintenance.html 파일명을 변경하거나 제거해줍니다.

참고 문서

How To Handle Downtime During Site Maintenance - Moz
HTTP 503: Handling site maintenance correctly for SEO • Yoast
Be careful to use correct HTTP status codes for maintenance pages - makandra dev
Retry-After - HTTP | MDN

마치며

2시간의 점검 시간을 예측했지만 DB migration이 생각보다 빠르게 끝나서 1시간 남짓으로 마무리할 수 있었습니다.
점검 모드는 약 한 시간이었지만 유저풀이 한국에서 경험했던 서비스들보다 훨씬 많기 때문에 매우 살 떨리는 경험이었습니다.

점검 모드 관련해서 조사하고 적용한 게 아까울지언정 다시 사용하는 일이 없기를 바랍니다.