{"title":"배포 전 체크리스트","version":"2.2","locale":"ko","docname":"howto/deployment/checklist","url":"/ko/2.2/howto/deployment/checklist/","canonical":"https://djangodocs.dev/ko/2.2/howto/deployment/checklist/","summary":"인터넷은 적대적인 환경입니다. 여러분의 장고 프로젝트를 배포하기 전에, 보안과 성능, 연산에 관련해서 설정을 다시 살펴볼 시간이 필요합니다. 장고는 보안 기능 을 많이 갖고 있습니다. 몇몇은 내장된 기능으로 항상 켜져있습니다. 다른 몇몇은 선택할 수 있는데 그 이유는 항상 보안 기능들이…","html":"<h1>배포 전 체크리스트<a class=\"heading-anchor\" href=\"#deployment-checklist\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>인터넷은 적대적인 환경입니다. 여러분의 장고 프로젝트를 배포하기 전에, 보안과 성능, 연산에 관련해서 설정을 다시 살펴볼 시간이 필요합니다.</p>\n<p>장고는 <a class=\"reference internal\" href=\"/ko/2.2/topics/security/\"><span class=\"doc\">보안 기능</span></a>을 많이 갖고 있습니다. 몇몇은 내장된 기능으로 항상 켜져있습니다. 다른 몇몇은 선택할 수 있는데 그 이유는 항상 보안 기능들이 적절하지 않거나 개발에 불편함을 가져올 수 있기 때문입니다. 예를 들어 강제로 HTTPS를 활성화 하는 것은 모든 웹사이트에 적합하지 않을 수도 있고, 로컬 개발환경에선 비실용적일 수도 있습니다.</p>\n<p>성능 최적화는 편의를 위한 또다른 범주의 거래입니다. 예를 들어, 캐싱은 상용 환경에서 유용할 수 있지만 로컬 개발 환경에서는 실용적이지 않을 수 있습니다. 오류 보고의 필요성에도 큰 차이가 있습니다.</p>\n<p>설정에 대한 체크리스트는 다음과 같습니다.</p>\n<ul class=\"simple\">\n<li><p>Django에서 예상되는 수준의 보안을 제공하도록 설정해야 합니다.</p></li>\n<li><p>각 환경에 맞도록 설정해야 합니다.</p></li>\n<li><p>선택적인 보안 기능들을 활성화시켜야 합니다.</p></li>\n<li><p>성능 최적화가 적용돼야 합니다.</p></li>\n<li><p>에러 보고가 제공되어야 합니다.</p></li>\n</ul>\n<p>이 설정들 중 대부분은 예민할 수 있고 감추어져야 합니다. 만약 여러분이 프로젝트의 소스코드를 배포한다면, 대부분은 개발 환경에 최적화된 설정으로 배포하고 상용 환경에서 사용할 별도의 설정을 사용할 것입니다.</p>\n<section id=\"run-manage-py-check-deploy\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">check</span> <span class=\"pre\">--deploy</span></code> 명령 실행<a class=\"heading-anchor\" href=\"#run-manage-py-check-deploy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Some of the checks described below can be automated using the <a class=\"reference internal\" href=\"/ko/2.2/ref/django-admin/#cmdoption-check-deploy\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">check</span>\n<span class=\"pre\">--deploy</span></code></a> option. Be sure to run it against your production settings file as\ndescribed in the option’s documentation.</p>\n</section>\n<section id=\"critical-settings\">\n<h2>Critical settings<a class=\"heading-anchor\" href=\"#critical-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"secret-key\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a><a class=\"heading-anchor\" href=\"#secret-key\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><strong>The secret key must be a large random value and it must be kept secret.</strong></p>\n<p>Make sure that the key used in production isn’t used anywhere else and avoid\ncommitting it to source control. This reduces the number of vectors from which\nan attacker may acquire the key.</p>\n<p>Instead of hardcoding the secret key in your settings module, consider loading\nit from an environment variable:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"n\">SECRET_KEY</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;SECRET_KEY&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>or from a file:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&#39;/etc/secret_key.txt&#39;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n    <span class=\"n\">SECRET_KEY</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">strip</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"debug\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a><a class=\"heading-anchor\" href=\"#debug\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><strong>You must never enable debug in production.</strong></p>\n<p>You’re certainly developing your project with <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code></a>,\nsince this enables handy features like full tracebacks in your browser.</p>\n<p>For a production environment, though, this is a really bad idea, because it\nleaks lots of information about your project: excerpts of your source code,\nlocal variables, settings, libraries used, etc.</p>\n</section>\n</section>\n<section id=\"environment-specific-settings\">\n<h2>Environment-specific settings<a class=\"heading-anchor\" href=\"#environment-specific-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"allowed-hosts\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a><a class=\"heading-anchor\" href=\"#allowed-hosts\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code></a>, Django doesn’t work at all without a\nsuitable value for <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a>.</p>\n<p>This setting is required to protect your site against some CSRF attacks. If\nyou use a wildcard, you must perform your own validation of the <code class=\"docutils literal notranslate\"><span class=\"pre\">Host</span></code> HTTP\nheader, or otherwise ensure that you aren’t vulnerable to this category of\nattacks.</p>\n<p>You should also configure the Web server that sits in front of Django to\nvalidate the host. It should respond with a static error page or ignore\nrequests for incorrect hosts instead of forwarding the request to Django. This\nway you’ll avoid spurious errors in your Django logs (or emails if you have\nerror reporting configured that way). For example, on nginx you might setup a\ndefault server to return “444 No Response” on an unrecognized host:</p>\n<div class=\"code-block\" data-language=\"nginx\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Nginx</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Nginx code\"><code><span class=\"k\">server</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"kn\">listen</span><span class=\"w\"> </span><span class=\"mi\">80</span><span class=\"w\"> </span><span class=\"s\">default_server</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"kn\">return</span><span class=\"w\"> </span><span class=\"mi\">444</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"caches\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a><a class=\"heading-anchor\" href=\"#caches\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you’re using a cache, connection parameters may be different in development\nand in production. Django defaults to per-process <a class=\"reference internal\" href=\"/ko/2.2/topics/cache/#local-memory-caching\"><span class=\"std std-ref\">local-memory caching</span></a> which may not be desirable.</p>\n<p>Cache servers often have weak authentication. Make sure they only accept\nconnections from your application servers.</p>\n<p>If you’re using Memcached, consider using <a class=\"reference internal\" href=\"/ko/2.2/topics/http/sessions/#cached-sessions-backend\"><span class=\"std std-ref\">cached sessions</span></a> to improve performance.</p>\n</section>\n<section id=\"databases\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a><a class=\"heading-anchor\" href=\"#databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Database connection parameters are probably different in development and in\nproduction.</p>\n<p>Database passwords are very sensitive. You should protect them exactly like\n<a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>.</p>\n<p>For maximum security, make sure database servers only accept connections from\nyour application servers.</p>\n<p>If you haven’t set up backups for your database, do it right now!</p>\n</section>\n<section id=\"email-backend-and-related-settings\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_BACKEND</span></code></a> and related settings<a class=\"heading-anchor\" href=\"#email-backend-and-related-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If your site sends emails, these values need to be set correctly.</p>\n<p>By default, Django sends email from <a class=\"reference external\" href=\"mailto:webmaster&#37;&#52;&#48;localhost\">webmaster<span>&#64;</span>localhost</a> and <a class=\"reference external\" href=\"mailto:root&#37;&#52;&#48;localhost\">root<span>&#64;</span>localhost</a>.\nHowever, some mail providers reject email from these addresses. To use\ndifferent sender addresses, modify the <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DEFAULT_FROM_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_FROM_EMAIL</span></code></a> and\n<a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-SERVER_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SERVER_EMAIL</span></code></a> settings.</p>\n</section>\n<section id=\"static-root-and-static-url\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_ROOT</span></code></a> and <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_URL</span></code></a><a class=\"heading-anchor\" href=\"#static-root-and-static-url\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Static files are automatically served by the development server. In\nproduction, you must define a <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_ROOT</span></code></a> directory where\n<a class=\"reference internal\" href=\"/ko/2.2/ref/contrib/staticfiles/#django-admin-collectstatic\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">collectstatic</span></code></a> will copy them.</p>\n<p>See <a class=\"reference internal\" href=\"/ko/2.2/howto/static-files/\"><span class=\"doc\">정적 파일 관리하기(e.g. 이미지, 자바스크립트, CSS)</span></a> for more information.</p>\n</section>\n<section id=\"media-root-and-media-url\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> and <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a><a class=\"heading-anchor\" href=\"#media-root-and-media-url\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Media files are uploaded by your users. They’re untrusted! Make sure your web\nserver never attempts to interpret them. For instance, if a user uploads a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">.php</span></code> file, the web server shouldn’t execute it.</p>\n<p>Now is a good time to check your backup strategy for these files.</p>\n</section>\n<section id=\"file-upload-permissions\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-FILE_UPLOAD_PERMISSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_PERMISSIONS</span></code></a><a class=\"heading-anchor\" href=\"#file-upload-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>With the default file upload settings, files smaller than\n<a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-FILE_UPLOAD_MAX_MEMORY_SIZE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_MAX_MEMORY_SIZE</span></code></a> may be stored with a different mode\nthan larger files as described in <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-FILE_UPLOAD_PERMISSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_PERMISSIONS</span></code></a>.</p>\n<p>Setting <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-FILE_UPLOAD_PERMISSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_PERMISSIONS</span></code></a> ensures all files are uploaded with\nthe same permissions.</p>\n</section>\n</section>\n<section id=\"https\">\n<h2>HTTPS<a class=\"heading-anchor\" href=\"#https\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Any website which allows users to log in should enforce site-wide HTTPS to\navoid transmitting access tokens in clear. In Django, access tokens include\nthe login/password, the session cookie, and password reset tokens. (You can’t\ndo much to protect password reset tokens if you’re sending them by email.)</p>\n<p>Protecting sensitive areas such as the user account or the admin isn’t\nsufficient, because the same session cookie is used for HTTP and HTTPS. Your\nweb server must redirect all HTTP traffic to HTTPS, and only transmit HTTPS\nrequests to Django.</p>\n<p>Once you’ve set up HTTPS, enable the following settings.</p>\n<section id=\"csrf-cookie-secure\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-CSRF_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_COOKIE_SECURE</span></code></a><a class=\"heading-anchor\" href=\"#csrf-cookie-secure\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Set this to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> to avoid transmitting the CSRF cookie over HTTP\naccidentally.</p>\n</section>\n<section id=\"session-cookie-secure\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-SESSION_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_SECURE</span></code></a><a class=\"heading-anchor\" href=\"#session-cookie-secure\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Set this to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> to avoid transmitting the session cookie over HTTP\naccidentally.</p>\n</section>\n</section>\n<section id=\"performance-optimizations\">\n<h2>Performance optimizations<a class=\"heading-anchor\" href=\"#performance-optimizations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Setting <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code></a> disables several features that are\nonly useful in development. In addition, you can tune the following settings.</p>\n<section id=\"conn-max-age\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a><a class=\"heading-anchor\" href=\"#conn-max-age\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Enabling <a class=\"reference internal\" href=\"/ko/2.2/ref/databases/#persistent-database-connections\"><span class=\"std std-ref\">persistent database connections</span></a> can result in a nice speed-up when\nconnecting to the database accounts for a significant part of the request\nprocessing time.</p>\n<p>This helps a lot on virtualized hosts with limited network performance.</p>\n</section>\n<section id=\"templates\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a><a class=\"heading-anchor\" href=\"#templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Enabling the cached template loader often improves performance drastically, as\nit avoids compiling each template every time it needs to be rendered. See the\n<a class=\"reference internal\" href=\"/ko/2.2/ref/templates/api/#template-loaders\"><span class=\"std std-ref\">template loaders docs</span></a> for more information.</p>\n</section>\n</section>\n<section id=\"error-reporting\">\n<h2>Error reporting<a class=\"heading-anchor\" href=\"#error-reporting\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>By the time you push your code to production, it’s hopefully robust, but you\ncan’t rule out unexpected errors. Thankfully, Django can capture errors and\nnotify you accordingly.</p>\n<section id=\"logging\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a><a class=\"heading-anchor\" href=\"#logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Review your logging configuration before putting your website in production,\nand check that it works as expected as soon as you have received some traffic.</p>\n<p>See <a class=\"reference internal\" href=\"/ko/2.2/topics/logging/\"><span class=\"doc\">로깅</span></a> for details on logging.</p>\n</section>\n<section id=\"admins-and-managers\">\n<h3><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> and <a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-MANAGERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MANAGERS</span></code></a><a class=\"heading-anchor\" href=\"#admins-and-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> will be notified of 500 errors by email.</p>\n<p><a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-MANAGERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MANAGERS</span></code></a> will be notified of 404 errors.\n<a class=\"reference internal\" href=\"/ko/2.2/ref/settings/#std-setting-IGNORABLE_404_URLS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">IGNORABLE_404_URLS</span></code></a> can help filter out spurious reports.</p>\n<p>See <a class=\"reference internal\" href=\"/ko/2.2/howto/error-reporting/\"><span class=\"doc\">Error reporting</span></a> for details on error reporting by email.</p>\n<aside class=\"admonition-error-reporting-by-email-doesn-t-scale-very-well admonition\">\n<p class=\"admonition-title\">Error reporting by email doesn’t scale very well</p>\n<p>Consider using an error monitoring system such as <a class=\"reference external\" href=\"https://docs.sentry.io/\">Sentry</a> before your\ninbox is flooded by reports. Sentry can also aggregate logs.</p>\n</aside>\n</section>\n<section id=\"customize-the-default-error-views\">\n<h3>Customize the default error views<a class=\"heading-anchor\" href=\"#customize-the-default-error-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django includes default views and templates for several HTTP error codes. You\nmay want to override the default templates by creating the following templates\nin your root template directory: <code class=\"docutils literal notranslate\"><span class=\"pre\">404.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">403.html</span></code>, and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">400.html</span></code>. The <a class=\"reference internal\" href=\"/ko/2.2/ref/views/#error-views\"><span class=\"std std-ref\">default error views</span></a> that use these\ntemplates should suffice for 99% of Web applications, but you can\n<a class=\"reference internal\" href=\"/ko/2.2/topics/http/views/#customizing-error-views\"><span class=\"std std-ref\">customize them</span></a> as well.</p>\n</section>\n</section>","rootId":"deployment-checklist","toc":[{"title":"manage.py check --deploy 명령 실행","anchor":"run-manage-py-check-deploy","children":[]},{"title":"Critical settings","anchor":"critical-settings","children":[{"title":"SECRET_KEY","anchor":"secret-key","children":[]},{"title":"DEBUG","anchor":"debug","children":[]}]},{"title":"Environment-specific settings","anchor":"environment-specific-settings","children":[{"title":"ALLOWED_HOSTS","anchor":"allowed-hosts","children":[]},{"title":"CACHES","anchor":"caches","children":[]},{"title":"DATABASES","anchor":"databases","children":[]},{"title":"EMAIL_BACKEND and related settings","anchor":"email-backend-and-related-settings","children":[]},{"title":"STATIC_ROOT and STATIC_URL","anchor":"static-root-and-static-url","children":[]},{"title":"MEDIA_ROOT and MEDIA_URL","anchor":"media-root-and-media-url","children":[]},{"title":"FILE_UPLOAD_PERMISSIONS","anchor":"file-upload-permissions","children":[]}]},{"title":"HTTPS","anchor":"https","children":[{"title":"CSRF_COOKIE_SECURE","anchor":"csrf-cookie-secure","children":[]},{"title":"SESSION_COOKIE_SECURE","anchor":"session-cookie-secure","children":[]}]},{"title":"Performance optimizations","anchor":"performance-optimizations","children":[{"title":"CONN_MAX_AGE","anchor":"conn-max-age","children":[]},{"title":"TEMPLATES","anchor":"templates","children":[]}]},{"title":"Error reporting","anchor":"error-reporting","children":[{"title":"LOGGING","anchor":"logging","children":[]},{"title":"ADMINS and MANAGERS","anchor":"admins-and-managers","children":[]},{"title":"Customize the default error views","anchor":"customize-the-default-error-views","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"“How-to” 가이드","url":"/ko/2.2/howto/"},{"docname":"howto/deployment/index","title":"Django 배포하기","url":"/ko/2.2/howto/deployment/"}],"prev":{"docname":"howto/error-reporting","title":"Error reporting","url":"/ko/2.2/howto/error-reporting/"},"next":{"docname":"howto/upgrade-version","title":"Upgrading Django to a newer version","url":"/ko/2.2/howto/upgrade-version/"},"formats":{"html":"/ko/2.2/howto/deployment/checklist/","markdown":"/ko/2.2/howto/deployment/checklist.md","json":"/ko/2.2/howto/deployment/checklist.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/howto/deployment/checklist.txt","official":"https://docs.djangoproject.com/ko/2.2/howto/deployment/checklist/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}