[컴][웹] Django 배포전 체크 리스트

장고 배포전 체크할 사항 / 장고 배포 체크리스트 / django deploy checklist / django release


updated 2106-01-21

SITE_ID 설정


만약 이 SITE_ID 를 사용한다면 db table 의 domain 값도 수정해야 한다.

이 SITE_ID 는 django_site table 에 설정되어 있는 값인데, 이녀석은 get_current_site() 등을 이용해서 현재 site 의 domain 을 가져오려고 하면, 이 django_site table 에서 SITE_ID 에 해당하는 녀석을 가져오게 된다.(물론 django.contrib.sites 를 사용하지 않는 경우에는 안그렇지만) 여하튼 그래서 이녀석에 대한 setting 을 위해서, DB table 의 domain 값을 설정해준다.



--------------------

여기서는 Django Deployment checklist 의 내용을 정리할 것이다.

Critical settings

SECRET_KEY

장고에서 사용하는 녀석인데, 이녀석은 소스코드 안에 포함시키지 않고, deploy 하는 server 에 직접 설정해 주라고 한다. 그리고 어디서도 쓰지 않는 unique 한 값으로 해준다. 이것이 hacker 가 SECRET_KEY 를 얻는 확률을 줄여준다고 한다.

DEBUG 옵션 끄기

settings 에 있는 DEBUG 를 False 로 설정해야 한다. 장고 세팅 설정은 아래 글을 참고하자.


환경 관련 세팅

ALLOWED_HOSTS

DEBUG = False 라면 ALLOWED_HOSTS 의 지정된 녀석만 접근 가능하다. 이게 CSRF 공격을 막아준다. ALLOWED_HOSTS 에 설정된 내용과 request 의 host header 를 비교한다. 보통 내 domain name 을 적어주면 된다.
ALLOWED_HOSTS = ['.mydomain.net']

이 부분을 장고에서 하지 않고, 앞단의 server(nginx 등) 에 맡겨놓으면 쓸데없는 error log 를 줄일 수 있다.

주의할 점은 이렇게 ALLOWED_HOSTS를 setting 하고 나면, 당연한 이야기지만, ip 로 접근하는 등의 작업은 안된다. 그러므로, 테스트를 원한다면, ip 등도 적어주면 된다. 하지만, 이것은 반대로 보안의 문제가 되므로, 되도록 안하는 것이 좋다.

CACHES

memcaches 등을 사용한다면 설정을 해 준다. 개발과, 실제 release(production) 의 설정이 다를 것이다. 최소한 default value 는 적어줘야 한다.
CACHES = {
    'default': {
        # local memory cache
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

DATABASES

database 연결설정, password 설정을 하자. database 의 password 는 위에서 이야기한 SECRET_KEY 처럼 관리하는 것이 좋다.

그리고 DATABASE 를 연결할 수 있는 host 를 web server 로 제한시키고, 주기적인 백업을 하도록 설정한다.

추가로, 당연한 이야기지만, DB에서 root 계정이외에 web application 을 위한 계정도 따로 만들어서 사용하자.

Email 설정

EMAIL_BACKEND 를 설정 해 주자. 이녀석이 EMAIL 을 보낼 때 사용할 녀석이다. 아래는 기본값이다.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

그리고 email 주소를 설정해 주자. django 에서 request 처리하는데에 error 가 발생하면 email 주소를 error email 을 보내준다.

그리고 자동응답용 메일에 from 부분을 setting 해줄 수 있는데, 그 부분은 DEFAULT_FROM_EMAIL 를 참고하면 된다. 참고로 DEFAULT_FROM_EMAIL 의 기본값은 "webmaster@localhost" 이기 때문에 바꿔주는 것이 좋다.

# ##### MANAGER CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins
ADMINS = (
    ('Your Name', 'myemail_address@example.com'),
)

# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers
MANAGERS = ADMINS
# #### END MANAGER CONFIGURATION


STATIC_ROOT 과 STATIC_URL

개발 서버에서는 자동으로 되는데, 실제 production 에서는 설정을 해줘야 한다. STATIC_ROOT 은 실제 파일이 있는 경로를 설정해 주면 되고,
STATIC_URL 은 이 STATIC_ROOT 에 있는 파일을 접근하는 url 이 된다.

자세한 설정은 Managing static files (e.g. images, JavaScript, CSS) 를 참고하자.


MEDIA_ROOT 와 MEDIA_URL

MEDIA 는 유저가 upload 하는 contents 를 이야기한다. 그래서 주의할 점은 web server 가 이 믿을 수 없는 contents 를 함부로 execute 하지 못하게 해야 한다고 한다.



HTTPS

https 를 사용할 때는 http 를 모두 https 로 redirect 시키는 작업이 필요하다고 한다. 실제로 이러지 않으면, https 에서의 동작을 http 로 수행해서, session cookie 등의 정보를 그대로 가져올 수 있다.

CSRF_COOKIE_SECURE

이 녀석을 True 로 설정하자. 그러면 CSRF COOKIE 가 http 로 넘어가지 않게 해준다. 주의할 점은 이 녀석은 http 를 사용할 것이라면 False 로 설정해야 csrf cookie 가 http 에서도 설정이 된다.



SESSION_COOKIE_SECURE

이 녀석을 True 로 설정하자. 그러면 SESSION_COOKIE 가 http 로 넘어가지 않게 해준다. 주의할 점은 이 녀석은 http 를 사용할 것이라면 False 로 설정해야 csrf cookie 가 http 에서도 설정이 된다.


Performance 최적화

CONN_MAX_AGE

CONN_MAX_AGE 를 설정하는 것이 속도에 좋은 영향을 줄 수 있다고 한다. 이건 db connection 의 최대 유지시간이라고 보면 된다. 자세한 사항은 Databases > Persistent connections 를 참고하면 된다.

TEMPLATES 설정

TEMPLATES 설정에서 cached loader 설정을 해주라고 한다. 이녀석은 template 이 매순간 compile 해서 client 로 보내지는데, 이 부분을 memory 에 cache 하고 있다가, 같은 template 요청이 올 때 보내주는 방식이다. class cached.Loader 를 참고하면 된다.
# #### TEMPLATE CONFIGURATION
# See : https://docs.djangoproject.com/en/1.8/ref/settings/#templates
TEMPLATE = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [normpath(join(SITE_ROOT, 'templates'))],
    'OPTIONS': {
        'loaders': [
            ('django.template.loaders.cached.Loader', [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ]),
        ],
        # see : https://docs.djangoproject.com/en/1.8/ref/templates/upgrading/
        'context_processors': [
            'django.contrib.auth.context_processors.auth',
            'django.core.context_processors.debug',
            'django.core.context_processors.i18n',
            'django.core.context_processors.media',
            'django.core.context_processors.static',
            'django.core.context_processors.tz',
            'django.contrib.messages.context_processors.messages',
            'django.core.context_processors.request',
        ]
    },

}]
# #### END TEMPLATE CONFIGURATION


Error reporting

LOGGING

예상치 못한 error 를 위한 logging 을 잘 설정해야 한다. 필요한 곳에 log 를 집어놓고, 이녀석이 error log 를 발생시키면 admin 에게 mail 로 알려주게 할 수 도 있다. 여러가지 예제는 아래 경로를 참고하자.

ADMIN 과 MANAGER

기본적으로 500 error 는 admin 에 설정된 주소로 mail 을 보내고, 404 관련 에러는 MANAGER 에 설정된 email 로 보낸다. 관련해서는 아래 링크를 참고하자.

Error page

기본적으로 error page 를 제공한다고 한다. 이 녀석들을 override 하려면 template folder 에 404.html, 500.html 403.html, 400.html 이런식으로 넣어주면 된다고 한다. view 를 수정해도 된다.



Python Options

django 는 아시다시피 python 을 사용한다. 이 python 을 실행할 때 -R option 을 사용하라고 한다. 이 녀석이 새로운 python instance 마다 새로운 salt 를 가지고 hash 를 만든다고 한다.

이것이 외부의 DoS 공격을 예방하게 해 준다고 한다. 추측은 Rainbow table attack 등을 막는데에 도움을 줄 듯 하기도 하다.





댓글 없음:

댓글 쓰기