django環境搭建,在 Linux 上部署 Django 應用,nginx+gunicorn+supervisor

 2023-11-19 阅读 30 评论 0

摘要:如果是新服務器先要進行基本的配置 部署前應用配置 django環境搭建。開發環境與生產環境中的應用一般會有兩套不同的配置。比如 DEBUG 選項,數據庫配置等。 對于 setting.py 文件, 在生產環境中我們要設置 DEBUG, SECRET_KEY 以及數據庫密碼等私密的設置。為了項目的安

如果是新服務器先要進行基本的配置

部署前應用配置

django環境搭建。開發環境與生產環境中的應用一般會有兩套不同的配置。比如 DEBUG 選項,數據庫配置等。

對于 setting.py 文件, 在生產環境中我們要設置 DEBUG, SECRET_KEY 以及數據庫密碼等私密的設置。為了項目的安全這些設置應該最好從環境變量加載,或從僅供服務的文件中讀取。

django docker。為了更好的統一線上和線下兩個環境, 我們使用 python-dotenv 工具. 有了這個工具, 我們可以將配置信息寫在 .env 文件中,然后使用下面的代碼加載配置信息到環境變量中:

# settings.py
from dotenv import load_dotenv
load_dotenv()

具體配置方法:

  1. 進入虛擬環境, 安裝 python-dotenv
pip install python-dotenv
  1. 在 Django 項目根目錄處建立 .env 文件(與manage.py 同目錄), 并添加配置
DJANGO_DEBUG=Ture
  1. 修改 setting.py 文件,將一些關鍵配置改成從環境變量中讀取, 沒有就設為默認值
import os
from dotenv import load_dotenv
load_dotenv()SECRET_KEY = os.environ.get('SECRET_KEY', 'mzi&f@)*4985)m19oj+x-hg4$hi!478v)+dz)bh+mgiz!zjg9n')
DEBUG = os.environ.get('DJANGO_DEBUG', False)
# 當 DEBUG=Flase 時, 設置的能夠訪問的主機
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '.xxmblog.top', '<服務器的IP地址>']
# 數據庫設置, 便于在生產環境中直接改為 MySQL 數據庫
DATABASES = {'default': {'ENGINE': os.environ.get('DATABASE_ENGINE') or 'django.db.backends.sqlite3','NAME': os.environ.get('DATABASE_NAME') or os.path.join(BASE_DIR, 'db.sqlite3'),'USER': os.environ.get('DATABASE_USER'),     # 用戶名,可以自己創建用戶'PASSWORD': os.environ.get('DATABASE_PASSWORD'),  # 密碼'HOST': os.environ.get('DATABASE_HOST'),  # mysql服務所在的主機ip'PORT': os.environ.get('DATABASE_PORT'),         # mysql服務端口}
}
# ...
STATIC_URL = '/static/'
# 增加下面的, 便于在生產環境中收集靜態文件
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

接下來,關鍵的是,.env 保存一些私密的配置,不要添加到git中。

開發環境的 .env:

DJANGO_DEBUG 為非空字符串時為 Ture, 不設置默認為 Flase
# 其他一些數據庫配置

生產環境中的 .env 設置后面單獨說明。

當有其他生產環境和開發環境不同的配置時,都讓Django從環境變量中讀取,我們就寫在.env 文件中。這樣部署的時候就不用修改源代碼了。

其他配置:

  • 靜態文件收集
    為了使 Nginx 方便的處理靜態文件的請求,生產環境中需要將全部靜態文件收集到一個統一的目錄下。
    先添加如下配置:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT 指明了靜態文件的收集目錄,到生產環境中有用

  • 導出依賴庫
    進入虛擬環境, 執行下列命令
pip freeze > requirements.txt

會生成一個 requirements.txt 文件, 里面包含了虛擬環境中安裝的所有依賴。
到了服務器上,只需要執行

pip install -r requirements.txt

就能安裝里面列的所有庫了。

上傳到 Github

注意到
.env文件不能上傳,服務器應該自己建一個
db.sqlite3 不上傳, 因為這是本地的測試數據庫, 到了生產環境, 應該用其他的數據庫了
venv 文件夾不上傳

在服務器上安裝應用

在自己的家目錄下(如 home/xxm/) 創建文件夾

?  ~ mkdir sites
?  ~ mkdir sites/www.xxmblog.com

所有的網站放在 sites 目錄中,網站的項目以域名區分, 進入 www.xxmblog.com 目錄。
通過 git clone 將應用下載到該目錄中
然后進入項目目錄并創建虛擬環境:

$ python3 -m venv venv
$ source venv/bin/activate

此時的項目結構:

home/xxm/sites/www.xxmblog.top/blog-django/blogproject/venv/.gitignorerequirements.txt

安裝項目依賴

先安裝必要的包

(venv) $ pip install -r requirements.txt

除了requirements.txt中的包之外,還要安裝生產部署需要的兩個包。gunicorn軟件包是Python應用程序的生產Web服務器。 mysqlclient 軟件包包含MySQL驅動程序

(venv) $ pip install gunicorn mysqlclient

如果安裝 mysqlclient 出現錯誤, 運行下面的命令。

sudo apt-get install python-dev python3-dev
sudo apt-get install libmysqlclient-dev
pip install pymysql
pip install mysqlclient

配置 MySQL

MySQL 的安裝不做說明, 具體講述如何讓 Django 使用 MySQL 數據庫。

下列命令創建名為 blog-django 的新數據庫,并創建一個具有完全訪問權限的同名用戶:

mysql> create database blogdjango character set utf8 collate utf8_bin;
mysql> create user 'blogdjango'@'localhost' identified by '<db-password>';
mysql> grant all privileges on blogdjango.* to 'blogdjango'@'localhost';
mysql> flush privileges;
mysql> quit;

需要用你選擇的密碼來替換<db-password>, 這將是 blogdjango 數據庫用戶的密碼,所以不要使用你已為root用戶選擇的密碼

接下來就是修改 setting.py 文件,讓 Django 使用剛剛創建的數據庫。但是由于我們前面使用了 dotenv,seeting.py 的一些配置已經從環境變量中讀取, 所以我們只需配置 .env 文件即可

配置 .env

創建一個 .env 文件, 與 manage.py 同目錄。

在里面輸入:

SECRET_KEY=<隨機字符串>
DATABASE_ENGINE=django.db.backends.mysql
DATABASE_NAME=blogdjango
DATABASE_USER=blogdjango
DATABASE_PASSWORD=<剛剛創建用的密碼>
DATABASE_HOST=localhost
DATABASE_PORT=3306

SECRET_KEY 使用一個隨機字符串
DJANGO_DEBUG 不設置時,DEBUG為FALSE
其他為MySQL的數據庫配置

收集靜態文件

虛擬環境下繼續運行 python manage.py collectstatic 命令收集靜態文件到 static 目錄下:

數據庫遷移

虛擬環境下繼續運行 python manage.py migrate 命令創建數據庫文件:

python manage.py makemigrations
python manage.py migrate

創建超級用戶

虛擬環境下繼續運行 python manage.py createsuperuser 命令創建一個超級用戶,方便我們進入 Django 管理后臺

嘗試運行一下應用

python manage.py runserver

如果上面的命令沒有出錯的話,一般就沒有問題了。

設置 Gunicorn 和 Supervisor

當使用 python manage.py runserver 運行服務器時, 我們使用的是 Django 自帶的Web服務器。這個服務器在開發過程中很有用,但并不適用于生產環境,所以我們改用 Gunicorn, 它是一個純粹的Python Web服務器, 并且支持高并發。

嘗試在 gunicorn 下啟動 blogproject:

gunicorn -b localhost:8000 -w 4 blogproject.wsgi:application

-b 告訴 gunicorn 在哪里監聽請求,我在8000端口上監聽了內部網絡接口。在沒有外部訪問的情況下,運行 Python Web 服務器很快。當有外部請求的時候,我們就需要一個更快的Web服務器,比如 nginx,它可以優化客戶端的所有靜態文件的請求,并將任何請求轉發到內部服務器。后面我們會設置 nginx。
-w 配置gunicorn將運行多少worker
blogproject.wsgi:application 告訴gunicorn如何加載應用程序實例. 冒號前的名稱是包含應用程序的模塊,冒號后面的名稱是此應用程序的名稱。

運行了上面的命令后,我們看到:

(venv) ?  blogproject git:(master) ? gunicorn -b localhost:8000 -w 4 blogproject.wsgi:application
[2019-08-16 11:18:50 +0800] [5674] [INFO] Starting gunicorn 19.9.0
[2019-08-16 11:18:50 +0800] [5674] [INFO] Listening at: http://127.0.0.1:8000 (5674)
[2019-08-16 11:18:50 +0800] [5674] [INFO] Using worker: sync
[2019-08-16 11:18:50 +0800] [5677] [INFO] Booting worker with pid: 5677
[2019-08-16 11:18:50 +0800] [5678] [INFO] Booting worker with pid: 5678
[2019-08-16 11:18:50 +0800] [5680] [INFO] Booting worker with pid: 5680
[2019-08-16 11:18:50 +0800] [5679] [INFO] Booting worker with pid: 5679

gunicorn 監聽 http://127.0.0.1:8000, 并啟動了4個worker.
[Ctrl+C] 退出進程。

可以看到,目前我們想要啟動服務器,每次都要輸入一遍上面的命令,如果進程崩潰了,還要手動輸入上面的命令讓服務器重新啟動。這真的很傻,所以我們使用一個 supervisor 的應用。

supervisor 的功能:

  • 可以讓這個進程后臺運行,并持續監控
  • 如果服務器崩潰退出,這個進程可以重新自動啟動
  • 而且如果機器重新啟動,服務器在啟動時自動運行,而無需人工登錄和啟動

安裝:

sudo apt-get install supervisor

supervisor 使用配置文件來告訴它要監視什么程序以及如何在必要時重新啟動它們

配置文件必須存儲在 /etc/supervisor/conf.d

對于我們這個 blogproject 應用,我們創建一個 blogproject.conf 配置文件:
/etc/supervisor/conf.d/blogproject.conf:Supervisor配置。

[program:blogproject]
command=/home/xxm/sites/www.xxmblog.com/blog-django/venv/bin/gunicorn -b localhost:8000 -w 4 blogproject.wsgi:application
directory=/home/xxm/sites/www.xxmblog.com/blog-django/blogproject
user=xxm
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

commanddirectoryuser設置告訴supervisor如何運行應用程序。 如果計算機啟動或崩潰,autostartautorestart設置會使microblog自動重新啟動。 stopasgroupkillasgroup選項確保當supervisor需要停止應用程序來重新啟動它時,它仍然會調度成頂級gunicorn進程的子進程。

編寫此配置文件后,必須重載supervisor服務的配置才能導入它:

$ sudo supervisorctl reload

像這樣,這個gunicorn web服務器就已經啟動和運行,并處于監控之中!

查看狀態:

sudo supervisorctl status

如果出現下面的內容,可能是配置文件出錯了

blogproject                      FATAL     Exited too quickly (process log may have details)

如果是下面表示正在運行:

blogproject                      RUNNING   pid 5865, uptime 0:00:03

其他命令

sudo supervisorctl stop xxx # 關閉 xxx
sudo supervisorctl restart xxx # 重啟 xxx

配置 Nginx

由 gunicorn 啟動的 blogproject 應用服務器現在運行在本地端口8000. 我們想要讓服務器能夠被外部世界訪問。

首先打開兩個端口 80 和 443 用來處理應用程序的 Web 通訊。如果是阿里云服務器需要在控制臺上配置安全組。

我們直接使用 https, 配置端口80將所有流量轉發到將要加密的端口443.

首先創建一個 SSL 證書, 這個證書只能用來測試,當用戶訪問的時候, Web 瀏覽器會警告用戶證書不是由可信證書頒發機構頒發的。

mkdir certs
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \-keyout certs/key.pem -out certs/cert.pem

生成的時候填寫的信息,將包含在 SSL 證書中, 用戶在瀏覽器訪問的時候可以查看。

命令的結果將生成名為key.pem和cert.pem的兩個文件。

為了使用 nginx, 為我們就要編寫一個配置文件,這個文件位于 /etc/nginx/sites-enabled 中,
通常剛安裝完 Ngnix,在這個位置有一個默認的測試站點, 我們將其刪除:

$ sudo rm /etc/nginx/sites-enabled/default

然后創建 blogproject 配置文件:
/etc/nginx/sites-enabled/blogproject:Nginx配置。

server {# 監聽 80 端口listen 80;server_name _;location / {# redirect any requests to the same URL but on httpsreturn 301 https://$host$request_uri;}
}
server {# 監聽 443 端口listen 443 ssl;# 服務器域名server_name _;# 剛剛生成的自簽名ssl證書的位置ssl_certificate /home/xxm/sites/www.xxmblog.com/blog-django/certs/cert.pem;ssl_certificate_key /home/xxm/sites/www.xxmblog.com/blog-django/certs/key.pem;# 將訪問和錯誤日志寫入 /var/logaccess_log /var/log/microblog_access.log;error_log /var/log/microblog_error.log;location / {# forward application requests to the gunicorn serverproxy_pass http://localhost:8000;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 所有URL 帶有 /static 的請求均由 Nginx 處理,alias 指明了靜態文件的存放目錄。location /static {alias /home/xxm/sites/www.xxmblog.com/blog-django/blogproject/static;expires 30d;}
}

添加此文件后,你需要告訴nginx重新加載配置以激活它:

$ sudo service nginx reload

瀏覽器輸入域名或者服務器的IP地址,應該可以看到訪問成功了。

應用更新

當應用更新的時候,往往需要重復下列的過程:

  1. 從 github 中拉取應用
git pull
  1. 可能需要修改 .env 文件, 增加環境變量
  2. 進入虛擬環境, 安裝額外的依賴
pip install -r requirements.txt
  1. 收集靜態文件
python manage.py collectstatic
  1. 數據庫遷移
python manage.py makemigrations
python manage.py migrate
  1. 重啟進程
sudo supervisorctl restart blogproject
  1. 重啟nginx
sudo service nginx reload

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/181152.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息