Django + Gunicorn + Nginx 部署 Ubuntu 服務器
Django + Gunicorn + Nginx 部署服務器
獲取騰訊雲 root權限
本人的服務器使用的是騰訊雲,騰訊雲默認是沒有開放 root 用戶的,我們來創建 root 用戶。
創建 root 賬號並設置密碼。
sudo passwd root
設置 root 賬戶登錄需要密碼。
sudo vim /etc/ssh/sshd_config
修改 without-password 為 yes。
PermitRootLogin yes
重啟 ssh 服務。
sudo service ssh restart
關閉窗口,重新使用 root 賬號登錄。
PS: 平時的話我們使用用戶賬號登錄就行了,上面只是為了獲取 root 權限。
更新下系統
sudo apt-get update
sudo apt-get upgrade
安裝必要的軟件
這裏我們需要用到的軟件有: Nginx、Pytohn3、Git、pip 和 virtualenv。
sudo apt-get install nginx
sudo apt-get install python3
sudo apt-get install python3-pip
sudo apt-get install git
sudo pip3 install virtualenv
啟動 Nginx服務
sudo service nginx start
在瀏覽器中輸入域名,如果能成功看到 Nginx 歡迎頁面,便說明我們的Nginx 服務是成功啟動的。
部署 Django 代碼
我們將從本地上傳到 GitHub 的代碼下載到我們的服務器中(這裏以我的博客代碼為例)。
我們還要設置 Django 代碼的存放路徑,我的路徑是在 /home/ubuntu/sites/weixuqin.cn 下。
mkdir -p /home/ubuntu/sites/weixuqin.cn
cd /home/ubuntu/sites/weixuqin.cn
git clone https://github.com/weixuqin/django_blog.git
創建虛擬環境並激活
virtualenv --python=python3 env source env/bin/activate
接下來我們便可以在虛擬環境中通過 pip 安裝需要的依賴庫了。
移動到下載好的源碼目錄:django_blog,安裝需要的依賴庫。
cd django_blog
pip install -r requirements.txt
收集靜態文件
pytohon manage.py collectstatic
安裝 mysql
由於我的博客使用的是 MySQL 數據庫,Linux 並沒有帶有 MySQL,所以需要我們另外安裝。
使用 apt-get 安裝並設置密碼。
sudo apt-get install mysql-server
安裝完成後進入數據庫。
mysql -u root -p
創建名為 blog 的數據庫。
create database blog;
在 settings.py 中設置 debug 為 False,同時設置可用域名,並修改數據庫密碼,
DEBUG = False
ALLOWED_HOSTS = [‘*‘]
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘: ‘blog‘,
‘USER‘:‘root‘,
‘PASSWORD‘: ‘‘,
‘HOST‘: ‘localhost‘,
‘PORT‘: ‘‘,
}
}
生成數據庫文件和創建一個Django 超級用戶。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
更改 MySQL 數據庫默認編碼格式
liunx 上 MySQL 數據庫的默認編碼方式不是 utf8,一定要自己更改後使用,剛開始自己使用默認方式創建數據庫,結果到了管理後臺寫文章的時候發現文章全部亂碼(如下圖),所以一定要註意數據庫編碼格式。
進入 MySQL,查看 MySQL 編碼。
show variables like ‘%character%‘;
可以看到數據庫默認編碼為 latin1
需要修改MySQL 配置文件: /etc/mysql/my.cnf
打開 my.cnf ,在各項中添加如下語句。
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
保存並退出。
再次執行 show variables like ‘%character%‘;
,便可以看到編碼已經修改了。
刪除原來創建的數據庫,並重新創建一個同名數據庫,執行 python manage.py migrate
, 再次打開後臺編寫文章,我們的文章便不再顯示亂碼了。
Nginx 部署
在服務器 /etc/nginx/sites-available/ 目錄下新建一個配置文件(這裏以我的為例)。
sudo vim django_blog
打開文件。
server {
charset utf-8;
listen 80;
server_name weixuqin.cn;
location /media {
alias /home/ubuntu/sites/weixuqin.cn/django_blog/uploads;
}
location /static {
alias /home/ubuntu/sites/weixuqin.cn/django_blog/staticfiles;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/weixuqin.cn.socket;
}
}
設置監聽端口,指定媒體文件和靜態文件存放地址等。.socket 文件會自動生成,我們可以不用去管這個文件。
創建一個符號鏈接,將上述配置文件放到啟用的網站列表中區。被啟用網站的目錄在 /etc/nginx/sites-enabled/ 。
sudo ln -s /etc/nginx/sites-available/django_blog /etc/nginx/sites-enabled/django_blog
使用 Gunicorn 管理進程
我們使用 gunicorn 來管理多個進程。
在虛擬環境下安裝。
pip install gunicorn
移動到 django 項目中,用 Gunicorn 啟動服務器進程。
gunicorn --bind unix:/tmp/weixuqin.cn.socket django_blog.wsgi:application
在瀏覽器中輸入域名,便能看到訪問成功了。
PS: 如果輸入域名後還是出現 Nginx 的歡迎界面,可能是 /etc/nginx/site-enabled/ 的默認文件 default覆蓋了我們自定義的配置文件,將 default 刪除即可,並重新啟動 Nginx。
sudo rm default
sudo service nginx reload
創建 Gunicorn自啟動腳本
如果手動啟動 Gunicorn,一旦服務器重啟後我們便需要再次執行啟動命令,未免太過麻煩,我們創建腳本來實現 Gunicorn 的自動啟動。
在 /etc/init/ 下新建一個 .conf 文件。
sudo vim /etc/init/gunicorn-weixuqin.cn.conf
start on net-device-up
stop on shutdown
respawn
setuid ubuntu
chdir /home/ubuntu/sites/weixuqin.cn/django_blog
exec ../env/bin/gunicorn --bind unix:/tmp/weixuqin.cn.socket django_blog.wsgi:application
- start on net-device-up 只在服務器聯網時啟動 Gunicorn。
- 進程崩潰後,respawn 自動重啟 Gunicorn。
- setuid 以 ubuntu 用戶的身份運行 Gunicorn 進程。
- chdir 指定 Gunicorn 運行目錄(項目目錄)。
- exec 開啟服務器進程。
啟動 gunicor
sudo start gunicorn-weixuqin.cn
如果以後更新了代碼,只需重啟下 Nginx 和 Gunicorn 就行了。
sudo service nginx reload
sudo restart gunicorn-weixuqin.cn
到這裏,如果一路順利的話,打開瀏覽器輸入你的域名,便能看到正確部署後的 Django 項目生成後的頁面了。
(比如我的)
PS: 為啥數據庫類型不支持 emoji 表情符號的,我明明在 Markdown 寫了好多好玩的表情符號(╯-_-)╯~╩╩
歡迎大家訪問我的博客 weixuqin.cn
Django + Gunicorn + Nginx 部署 Ubuntu 服務器