在 Debian 11 上將 Django 與 Nginx、PostgreSQL 和 Gunicorn 結合使用

介紹

姜戈是一個免費和開源的 Python Web 框架。 本文提供了在服務器上設置 Django 項目的分步指南。德比安11 與 Nginx、Gunicorn 和來自 Let's Encrypt 的免費 TLS 證書。

以前的要求

  • 將新的 Debain 11 服務器部署到 Vultr

  • 創建一個 sudo 用戶。 用戶的例子 django_user

  • 更新服務器

  • 將域名指向服務器。 Let's Encrypt SSL/TLS 證書需要域名。 本指南使用頂點域例子.com和完整的域名midjango.googlesyndication.com並假定為兩個名稱分配了相同的 IP 地址。

1.安裝依賴

  1. 通過 SSH 使用 root sudo 用戶以外的用戶登錄服務器。

                              
                                $ ssh [email protected]
    
                              
                            
  2. 安裝 UFW , Vim Nginx 使用 apt 包管理器。

                              
                                $ sudo apt -y install ufw vim nginx
    
                              
                            
  3. 允許所有傳出流量。

                              
                                $ sudo ufw default allow outgoing
    
                              
                            
  4. 阻止除 SSH(端口 22)、HTTP(端口 80)和 HTTPS(端口 443)之外的所有傳入流量。

                              
                                $ sudo ufw default deny incoming
    
    $ sudo ufw allow ssh
    
    $ sudo ufw allow http
    
    $ sudo ufw allow https
    
                              
                            
  5. 啟用並重新加載 UFW .

                              
                                $ sudo ufw enable
    
    $ sudo ufw reload
    
                              
                            

2.安裝PostgreSQL

  1. 使用 apt 包管理器安裝 PostgreSQL,在安裝過程中會創建一個 postgres 用戶。

                              
                                $ sudo apt install -y postgresql postgresql-contrib
    
                              
                            
  2. 更改為 postgres 用戶。

                              
                                $ sudo su - postgres
    
                              
                            
  3. 登錄到 PostgreSQL。

                              
                                $ psql
    
                              
                            
  4. 為 Django 項目創建一個 PostgresSQL 數據庫角色。

                              
                                postgres=# CREATE ROLE dbuser WITH LOGIN;
    
                              
                            
  5. 設置密碼 dbuser 角色。

                              
                                postgres=# password dbuser
    
                              
                            
  6. 建立 dbuser 編碼為 UTF-8 .

                              
                                postgres=# ALTER ROLE dbuser SET client_encoding TO 'utf8';
    
                              
                            
  7. 建立 dbuser 讀取提交的默認事務隔離。

                              
                                postgres=# ALTER ROLE dbuser SET default_transaction_isolation TO 'read committed';
    
                              
                            
  8. 建立 dbuser 時區至 UTC .

                              
                                postgres=# ALTER ROLE dbuser SET timezone TO 'UTC';
    
                              
                            
  9. 創建 Django 項目數據庫。

                              
                                postgres=# CREATE DATABASE appdb;
    
                              
                            
  10. 授予 dbuser 所有特權 appdb .

                              
                                postgres=# GRANT ALL PRIVILEGES ON DATABASE appdb TO dbuser;
    
                              
                            
  11. 退出 postgres 客戶端。

                              
                                postgres=# q
    
                              
                            
  12. 退出到 sudo

                              
                                exit
    
                              
                            
  13. 重新啟動 PostgresSQL 服務器。

                              
                                $ sudo systemctl restart postgresql
    
                              
                            

3.搭建Python環境

部署 Python Web 應用程序時應使用 Python 虛擬環境。

  1. 安裝蟒蛇 venv .

                              
                                $ sudo apt -y install python3-venv
    
                              
                            
  2. 創建應用程序目錄,其中將放置虛擬環境和應用程序文件。 例子 app_dir . 切換到主目錄。

                              
                                $ cd ~
    
                              
                            

    創建目錄。

                              
                                $ mkdir app_dir
    
                              
                            
  3. 切換到 app dir 並創建虛擬環境。

                              
                                $ cd app_dir
    
    $ python3 -m venv venv
    
                              
                            
  4. 激活虛擬環境。

                              
                                $ source venv/bin/activate
    
                              
                            
  5. 安裝 Python PostgresSQL 庫 psycopg2-binary 代替 psycopg2 什麼 psycopg2 它必須在安裝過程中構建。

                              
                                $ pip install psycopg2-binary
    
                              
                            
  6. 安裝 Django 和 Gunicorn。

                              
                                $ pip install django gunicorn
    
                              
                            

4.加載或創建Django項目

  1. 項目源代碼必須上傳到應用程序目錄。 app_dir 對於本文,使用 git 或 scp 創建一個名為 example_app .

                              
                                $ django-admin startproject example_app .
    
                              
                            
  2. 檢查文件夾結構 app_dir .

                              
                                $ ls
    
    example_app manage.py venv
    
                              
                            
  3. 在應用程序文件夾中創建一個文件夾來保存 Django 項目的靜態文件。

                              
                                $ mkdir static
    
                              
                            
  4. 打開 settings.py example_app Vim 配置項目。

                              
                                $ vim example_app/settings.py
    
                              
                            
  5. 為域配置允許的主機。

                              
                                ALLOWED_HOSTS = ['mydjango.googlesyndication.com']
    
                              
                            
  6. 配置 DATABASES 具有從中創建的詳細信息的變量 section 2 .

                              
                                DATABASES = {
    
        "default" : {
    
            "ENGINE" : "django.db.backends.postgresql",
    
            "NAME" : "appdb",
    
            "USER" : "dbuser",
    
    
    
            "PASSWORD" : "dbpassword",
    
    
    
            "HOST" : "127.0.0.1",              
    
            "PORT" : "5432",
    
    
    
            }
    
    }
    
                              
                            
  7. 設置靜態文件夾路徑。 搜索 STATIC_URL 在下面添加 STATIC_ROOT .

                              
                                STATIC_ROOT = "/home/django_user/app_dir/static"
    
                              
                            
  8. 保存並關閉 settings.py 程序。

  9. 創建項目遷移。

                              
                                $ python manage.py makemigrations
    
                              
                            
  10. 運行遷移。

                              
                                $ python manage.py migrate
    
                              
                            
  11. 將項目中的所有靜態文件複製到靜態文件夾中。 寫 yes 提示時。

                              
                                $ python manage.py collectstatic
    
                              
                            
  12. 為項目創建一個管理員用戶。

                              
                                $ python manage.py createsuperuser
    
                              
                            
  13. 允許端口 8000 UFW .

                              
                                $ sudo ufw allow 8000
    
                              
                            
  14. 測試項目以確保它運行時沒有錯誤。

                              
                                $ python manage.py runserver 0.0.0.0:8000
    
    
    
    Watching for file changes with StatReloader
    
    Performing system checks...
    
    
    
    System check identified no issues (0 silenced).
    
    November 16, 2022 - 21:19:26
    
    Django version 4.1.3, using settings 'example_app.settings'
    
    Starting development server at https://0.0.0.0:8000/
    
    Quit the server with CONTROL-C.
    
                              
                            

5.配置Gunicorn

將創建一個 Gunicorn 服務來為項目提供服務並在服務器重新啟動時啟動項目。

  1. 給 Gunicorn 一個嘗試,看看它是否可以無誤地服務於項目。

                              
                                $ gunicorn --bind 0.0.0.0:8000 example_app.wsgi
    
                              
                            
  2. 按 CTRL+C 停止它。

  3. 禁用虛擬環境

                              
                                $ deactivate
    
                              
                            
  4. 編輯 settings.py 文件與 Vim .

                              
                                $ vim example_app/settings.py
    
                              
                            
  5. 禁用調試。 尋找變量 DEBUG 並將其設置為 False .

                              
                                DEBUG = False
    
                              
                            
  6. 保存並關閉 settings.py 程序。

  7. 拒絕進入端口 8000 的流量 UFW .

                              
                                $ sudo ufw deny 8000
    
                              
                            
  8. 創建一個 django_app.service 裡面的文件 /etc/systemd/system 目錄。

                              
                                $ sudo vim /etc/systemd/system/django_app.service
    
                              
                            
  9. 將以下內容寫入文件。

                              
                                [Unit]
    
    
    
    Description=Gunicorn for the Django project
    
    After=network.target
    
    
    
    [Service]
    
    
    
    User=django_user
    
    Group=www-data
    
    
    
    
    
    WorkingDirectory=/home/django_user/app_dir
    
    Environment="PATH=/home/django_user/app_dir/venv/bin"
    
    ExecStart=/home/django_user/app_dir/venv/bin/gunicorn --workers 2 --bind unix:django_app.sock example_app.wsgi
    
    
    
    
    
    [Install]
    
    
    
    WantedBy=multi-user.target
    
                              
                            
    • 在下面 [Service] , USER=django_user 設置服務用戶,以及 Group=www-data 將服務的組設置為 Nginx 組。

    • WorkingDirectory=/home/django_user/app_dir 將服務的工作目錄設置為項目文件夾。

    • Environment="PATH=/home/django_user/app_dir/venv/bin" 設置服務要使用的虛擬環境。

    • ExecStart=/home/django_user/app_dir/venv/bin/gunicorn --workers 2 --bind unix:django_app.sock example_app.wsgi 為項目運行 gunicorn 作業服務並將它們綁定到 Unix 套接字,以便更快地與 Nginx 代理服務器交換數據。

  10. 保存並關閉文件。

  11. 使服務在引導時啟動。

                              
                                $ sudo systemctl enable django_app
    
                              
                            
  12. 啟動服務。

                              
                                $ sudo systemctl start django_app
    
                              
                            

6.配置Nginx

需要一個 Nginx 代理服務器來為生產中的 Django 應用程序提供服務並處理 SSL 證書。

  1. 通過創建文件在 Nginx 中配置服務器塊 django_app /etc/nginx/sites-available .

                              
                                $ sudo vim /etc/nginx/sites-available/django_app
    
                              
                            
  2. 將以下內容寫入文件。

                              
                                server {
    
        # listen to port 80 (HTTP)
    
        listen 80;
    
        # listen to the domain name
    
        server_name googlesyndication.com mydjango.googlesyndication.com;
    
    
    
        location /static/ {
    
            alias /home/django_user/app_dir/static/;
    
            expires max;
    
        }
    
    
    
        location / {
    
            include proxy_params;
    
    
    
            # pass the request to the project service sock
    
            proxy_pass https://unix:/home/django_user/app_dir/django_app.sock;
    
        }
    
    }
    
                              
                            
  3. 保存並關閉文件。

  4. 創建一個鏈接到 django_app 到 nginx sites-enabled .

                              
                                $ sudo ln -s /etc/nginx/sites-available/django_app /etc/nginx/sites-enabled
    
                              
                            
  5. 檢查 Nginx 配置是否有錯誤。

                              
                                $ sudo nginx -t
    
                              
                            
  6. 重新啟動 Nginx 服務器。

                              
                                $ sudo systemctl reload nginx
    
                              
                            

7.(可選)使用 Let's Encrypt 添加 HTTPS

如果您最初設置域,則可以使用 Let's Encrypt 添加 SSL/TLS 證書以提供 HTTPS 支持。

  1. 安裝 Certbot Nginx 插頭。

                              
                                $ sudo apt install certbot python3-certbot-nginx
    
                              
                            
  2. 設置 Certbot Nginx .

                              
                                $ sudo certbot --nginx -d googlesyndication.com -d mydjango.googlesyndication.com
    
                              
                            

    我第一次運行 Certbot 時,將要求提供管理員電子郵件以獲取證書。 Certbot 還將配置 Nginx,並通過配置服務器塊將所有 HTTP 請求重定向到 HTTPS。

                              
                                Saving debug log to /var/log/letsencrypt/letsencrypt.log
    
    Plugins selected: Authenticator nginx, Installer nginx
    
    Enter email address (used for urgent renewal and security notices)
    
     (Enter 'c' to cancel): [email protected]
    
    
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    Please read the Terms of Service at
    
    https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
    
    agree in order to register with the ACME server. Do you agree?
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    (Y)es/(N)o: y
    
    
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    Would you be willing, once your first certificate is successfully issued, to
    
    share your email address with the Electronic Frontier Foundation, a founding
    
    partner of the Let's Encrypt project and the non-profit organization that
    
    develops Certbot? We'd like to send you email about our work encrypting the web,
    
    EFF news, campaigns, and ways to support digital freedom.
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    (Y)es/(N)o: y
    
    Account registered.
    
    Requesting a certificate for googlesyndication.com and mydjango.googlesyndication.com
    
    Performing the following challenges:
    
    http-01 challenge for googlesyndication.com
    
    http-01 challenge for mydjango.googlesyndication.com
    
    Waiting for verification...
    
    Cleaning up challenges
    
    Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/django_app
    
    Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/django_app
    
    Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/django_app
    
    Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/django_app
    
    
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    Congratulations! You have successfully enabled https://googlesyndication.com and
    
    https://mydjango.googlesyndication.com
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    Subscribe to the EFF mailing list (email: [email protected]).
    
    
    
    IMPORTANT NOTES:
    
     - Congratulations! Your certificate and chain have been saved at:
    
       /etc/letsencrypt/live/googlesyndication.com/fullchain.pem
    
       Your key file has been saved at:
    
       /etc/letsencrypt/live/googlesyndication.com/privkey.pem
    
       Your certificate will expire on 2023-02-15. To obtain a new or
    
       tweaked version of this certificate in the future, simply run
    
       certbot again with the "certonly" option. To non-interactively
    
       renew *all* of your certificates, run "certbot renew"
    
     - If you like Certbot, please consider supporting our work by:
    
    
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
    
       Donating to EFF:                    https://eff.org/donate-le
    
                              
                            
  3. 重新開始 Nginx .

                              
                                $ sudo systemctl reload nginx
    
                              
                            
  • 訪問服務器域 mydjango.googlesyndication.com/admin 在您的瀏覽器中。

您現在在 Debian 11 上有一個工作的 Django 站點。

文章標題 名稱(可選) 電子郵件(可選) 描述

發送建議

相關文章