如果是新服務器先要進行基本的配置
django環境搭建。開發環境與生產環境中的應用一般會有兩套不同的配置。比如 DEBUG 選項,數據庫配置等。
對于 setting.py 文件, 在生產環境中我們要設置 DEBUG, SECRET_KEY 以及數據庫密碼等私密的設置。為了項目的安全這些設置應該最好從環境變量加載,或從僅供服務的文件中讀取。
django docker。為了更好的統一線上和線下兩個環境, 我們使用 python-dotenv
工具. 有了這個工具, 我們可以將配置信息寫在 .env
文件中,然后使用下面的代碼加載配置信息到環境變量中:
# settings.py
from dotenv import load_dotenv
load_dotenv()
具體配置方法:
pip install python-dotenv
.env
文件(與manage.py 同目錄), 并添加配置DJANGO_DEBUG=Ture
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
文件中。這樣部署的時候就不用修改源代碼了。
其他配置:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT 指明了靜態文件的收集目錄,到生產環境中有用
pip freeze > requirements.txt
會生成一個 requirements.txt 文件, 里面包含了虛擬環境中安裝的所有依賴。
到了服務器上,只需要執行
pip install -r requirements.txt
就能安裝里面列的所有庫了。
注意到
.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 的安裝不做說明, 具體講述如何讓 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
如果上面的命令沒有出錯的話,一般就沒有問題了。
當使用 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
command
,directory
和user
設置告訴supervisor如何運行應用程序。 如果計算機啟動或崩潰,autostart
和autorestart
設置會使microblog自動重新啟動。 stopasgroup
和killasgroup
選項確保當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
由 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地址,應該可以看到訪問成功了。
當應用更新的時候,往往需要重復下列的過程:
git pull
.env
文件, 增加環境變量pip install -r requirements.txt
python manage.py collectstatic
python manage.py makemigrations
python manage.py migrate
sudo supervisorctl restart blogproject
sudo service nginx reload
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态