Django筆記/佈署Django專案

於 2022年11月19日 (六) 14:53 由 Tankianting討論 | 貢獻 所做的修訂 →‎佈署到 WSGI/ASGI
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

摘自 Django 文件:

佈署的檢核表

本段包含以下內容:

  • 安全性設定
  • 佈署環境和其他環境有不同處
  • 可選的安全特點
  • 效能最佳化
  • 錯誤報告功能

以下本文:

  • 執行manage.py check --deploy
  • settings.py 的 SECRET_KEY 密鑰要設定,範例:
with open('/etc/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()
  • 避免其他人知道漏洞之所在,DEBUG = True要變成 False。
  • ALLOWED_HOSTS = ['this_server.example.com'] 要設定為這臺機器。
  • 資料庫密碼建議另外儲存
  • EMAIL_BACKEND 和相關設定值要設定好。如:EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'(設定為 SMTP 發信)。參考:https://docs.djangoproject.com/en/4.1/topics/email/
  • STATIC_ROOT 和 STATIC_URL 的值(靜態資料)。
  • STATICFILES_DIRS 靜態資料目錄設置,如:
STATICFILES_DIRS = [
    "/home/special.polls.com/polls/static",
    "/home/polls.com/polls/static",
    "/opt/webfiles/common",
]
  • 多媒體資料:MEDIA_ROOT and MEDIA_URL
  • 強制以 HTTPS 傳送:
    • CSRF_COOKIE_SECURE = True # 避免 CSRF 安全機制的 cookie 明碼傳輸
    • SESSION_COOKIE_SECURE = True # Session Cookie 避免明碼傳輸
  • 設置 Debug = False 可以關掉佈署上線時不必要的功能。
  • 錯誤 log 記錄功能

佈署到 WSGI/ASGI

首先爲了要讓伺服器支援Python 作爲 CGI 語言,所以需要安裝 WSGI(較傳統)或是 ASGI(非同步 async 友善,較新)。

官方支援說明:

  • WSGI(亦可用 Gunicorn)

其他伺服器類設定

設定Gunicorn(這可能沒有用)

   /etc/systemd/system/gunicorn.service                                                               

Group=www-data
WorkingDirectory=/root/lianlok                
ExecStart=/usr/local/bin/gunicorn(或其他絕對路徑) --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock lianlok.wsgi:application
[Install]
WantedBy=multi-user.target

設定 nginx

site-available 裏面的 test 設定檔為:

前提要先 ./manage.py runserver 8080。

server {
listen 80;
server_name 127.0.0.1;

# https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-in-production
# location /static/ { # STATIC_URL
#    alias /home/www/example.com/static/; # STATIC_ROOT
#                  }

    access_log /root/log/lianlok-access.log;
    error_log /root/log/lianlok-error.log;

    location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://127.0.0.1:8080;
        }
}

佈署到網站託管 (web hosting) 網站