一、前言
之前在本地主機上寫了一個django專案,最近又買了阿里云的學生服務器,就想著把這個django專案部署到服務器上,如今完成部署,發現自己踩過好多坑,就寫了這篇文章來記錄一下自己踩的坑,希望對你有幫助,第一次寫文章,如有出錯,請多多包涵與指正,
二、部署前的準備
- 有一臺可以連接公網的服務器(我的系統是ubuntu 18.04.5)
- 可以運行的django專案
- 了解git與github(用于給服務器上傳django專案)
- 了解一些基礎的linux操作指令
- 一個可用的域名(如果沒有也沒關系,服務器公網ip也可以登錄網站)
- 新手最好有一個可視化的SFTP工具(如WinSCP,可以方便操作)
三、開始部署
3.1搭建環境
如果你的服務器是“嶄新出廠”的,請創建一個普通用戶并賦予他超級權限,因為在root下部署代碼不是很安全,且有可能出錯,
創建一個擁有超級權限的用戶步驟如下:
#創建新用戶wss
root@VM-0-7-ubuntu:~# useradd -m -s /bin/bash wss
#新創建的用戶加入超級權限組
root@VM-0-7-ubuntu:~# usermod -a -G sudo wss
#為新用戶設定密碼
root@VM-0-7-ubuntu:~# passwd wss
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
#切換到創建的新用戶
root@VM-0-7-ubuntu:~# su - wss
#切換成功,@符號前面已經是新用戶名而不是 root 了
wss@VM-0-7-ubuntu:~#
同時,記得更新一下系統,避免版本太老帶來的一些困惑,(因為某些原因,我下面使用的還是root,沒有用wss用戶)
root@VM-0-7-ubuntu:~# sudo apt-get update
root@VM-0-7-ubuntu:~# sudo apt-get upgrade
安裝一些必備的軟體(挨個復制)
root@VM-0-7-ubuntu:~# sudo apt-get install nginx
root@VM-0-7-ubuntu:~# sudo apt-get install git python3 python3-pip
root@VM-0-7-ubuntu:~# sudo pip3 install virtualenv
#安裝mysql
root@VM-0-7-ubuntu:~# sudo apt-get install mysql-server
root@VM-0-7-ubuntu:~# apt-get isntall mysql-client
#安裝程序中會提示設定密碼什么的,注意設定了不要忘了,安裝完成之后可以使用如下命令來檢查是否安裝成功:
root@VM-0-7-ubuntu:~# sudo netstat -tap | grep mysql
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp 0 0 localhost:mysql *:* LISTEN
#登陸mysql資料庫可以通過如下命令
root@VM-0-7-ubuntu:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#查看當前的資料庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| blog |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
3.2專案的部署
首先是要將專案的代碼復制到服務器中,這里用到了git與github網站,git可以到官網下載安裝,github需要注冊,因為我django專案的撰寫是用pycharm完成的,它自身可以和github連接,所以很方便,如果沒有pycharm可以去其他文章,學習如何將代碼用git傳到github上,由于github有時(大部分時候)連接不上去,我這里推薦一個加速器(DevSidecar),具體使用與下載如下,
為了方便專案的管理,以及服務器的充分使用,我們需要手動設定云服務器的目錄結構,我的專案部署目錄一般如下(推薦新手用Winscp完成目錄結構的設定,簡單明了):
root@VM-0-7-ubuntu:~# tree -L 3
.
└── sites
└── shuangblog.com
├── env
└── myblog
- sites用于放置網站原始碼(django專案)的(因為有時服務器會部署多個網站原始碼(django專案),為了方便管理,將他們放置在sites檔案夾下),
- shuangblog.com檔案夾則是一個以一個域名命名的檔案夾,這個檔案夾代表了一個名為‘shuangblog.com’的網站,包含網站運行的虛擬環境與django原始碼,
- env檔案夾是放置的是虛擬環境
- myblog檔案夾放置的是django專案原始碼
以上目錄,你可以用Winscp創建,也可以用下面的命令創建
#這里 ~ 代表當前用戶的 home 目錄,即 /home/wss/
root@VM-0-7-ubuntu:~# mkdir -p ~/sites/shuangblog.com
#創建虛擬環境,先進入到 shuangblog.com 目錄下,然后運行 virtualenv 命令創建虛擬環境
root@VM-0-7-ubuntu:~# cd ~/sites/shuangblog.com
root@VM-0-7-ubuntu:~/sites/shuangblog.com# virtualenv --python=python3 env
注意這里使用 --python=python3 來指定克隆 Python3 的環境,因為 ubuntu 系統默認安裝了 Python2,如果不特別指定的話 Virtualenv 默認克隆的是 Python2 的環境,
下一步就是專案的克隆,把從本地上傳到github上的專案代碼拉取到與服務器的指定目錄下:
#克隆代碼,先進入到 shuangblog.com 目錄下
root@VM-0-7-ubuntu:~# cd ~/sites/shuangblog.com
#將創建一個名為myblog的檔案夾,并把github的代碼克隆到其中
root@VM-0-7-ubuntu:~/sites/shuangblog.com# git@github.com:11cookies11/zero.git myblog
完成上面的步驟后,我的整個目錄如下:
.
└── shuangblog.com
├── env
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
└── myblog
├── access.log
├── db.sqlite3
├── djangoProject1
├── manage.py
├── myapps
├── nohup.out
├── __pycache__
├── requirements.txt
├── static
├── static_all
├── templates
└── test
3.3讓專案在服務器運行起來
虛擬環境雖然已經創建,專案也已經拉到服務器,但是環境中還沒有安裝專案的依賴,所以現在要根據專案的依賴檔案去安裝依賴,這樣專案才能夠運行,
- 進入虛擬環境
- 目錄切換到requirements.txt所在的目錄
- 安裝依賴
root@VM-0-7-ubuntu:~# cd ~/sites/shuangblog.com
root@VM-0-7-ubuntu:~/sites/shuangblog.com# source env/bin/activate
(env) root@VM-0-7-ubuntu:~/sites/shuangblog.com# cd myblog
(env) root@VM-0-7-ubuntu:~/sites/shuangblog.com/myblog# ls
apps blog manage.py media README.md requirements.txt settings.py static templates tendcode.sock
(env)root@VM-0-7-ubuntu:~/sites/shuangblog.com/myblog# pip install -r requirements.txt
其中的requirements.txt記錄這django專案運行所需要的各種庫,它一般是由本地主機生成的,可以參考如下,
3.4、遷移,專案運行(按照本地運行Django專案的流程進行)
下面的一些步驟在這里不在詳細講解,主要包括:
- 創建資料遷移
root@VM-0-7-ubuntu:~# python manage.py makemigrations
root@VM-0-7-ubuntu:~# python manage.py migrate
- 創建管理員賬號
root@VM-0-7-ubuntu:~# python manage.py createsuperuser
- 靜態檔案收集(這比較重要,會影響到之后配置Gunicorn以及Nginx,可以看一下文章
主要是設定setting.py:
1.DEBUG改成False,只有關閉了除錯模式,后面才能讓nginx來尋找靜態檔案,
2.ALLOW_HOSTS,加入你的域名,(或,和)服務器ip,我還加了127.0.0.1方便本地觀察,
3.設定STATIC_ROOT,建議可以直接設為os.path.join(BASE_DIR, ‘static_allc/’),也就把檔案夾在manage.py的根目錄里,
root@VM-0-7-ubuntu:~# python manage.py collectstatic
- 專案啟動
root@VM-0-7-ubuntu:~# python manage.py runserver 0.0.0.0:8000
運行成功后,可以通過公網ip訪問到網站,不過記住將服務器的公網ip放在django專案的setting.py檔案中的設定里在可以,比如你的服務器ip為23.345.234.123:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '.gaojiawen.top','23.345.234.123']
四、配置Gunicorn以及Nginx
4.1、安裝配置Gunicorn
- 在虛擬環境中安裝 Gunicorn;
(env) root@VM-0-7-ubuntu:~/sites/shuangblog.com/myblog# pip install gunicorn
Requirement already satisfied: gunicorn in /home/wss/sites/shuangblog.com/env/lib/python3.5/site-packages (19.9.0)
- 創建專案的 Gunicorn 組態檔(退出虛擬環境):
#組態檔名為gunicorn_tendcode.service
root@VM-0-7-ubuntu:~/sites/shuangblog.com/myblog# sudo vim /etc/systemd/system/gunicorn_tendcode.service
- 具體的配置資訊如下
打開組態檔
root@VM-0-7-ubuntu:/etc/systemd/system# vi gunicorn_tendcode.service
配置內容如下
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/root/sites/shuangblog.com/myblog
ExecStart=/root/sites/shuangblog.com/env/bin/gunicorn --access-logfile - --workers 2 --bind 127.0.0.1:8001 djangoProject1.wsgi:application
[Install]
WantedBy=multi-user.target
User 填寫自己當前用戶名稱
WorkingDirectory 填寫專案的地址
ExecStart 中第一個地址是虛擬環境中 gunicorn 的目錄,所以只需要改前半部分虛擬環境的地址即可
workers 2 這里是表示2個行程,可以自己改
unix 這里的地址是用于監聽的地址,作用相當于橋梁,連接Gunicorn以及Nginx的通訊,
blog.wsgi 表示的是專案中 wsgi.py 的地址,我的專案中就是在 djangoProject1檔案夾下,所以寫成:djangoProject1.wsgi:之后的application不要改變,
- 啟動組態檔
root@VM-0-7-ubuntu:~# sudo systemctl start gunicorn_tendcode
root@VM-0-7-ubuntu:~# sudo systemctl enable gunicorn_tendcode
查看服務的狀態可以使用命令:
root@VM-0-7-ubuntu:~# sudo systemctl status gunicorn_tendcode
正常運作如下:
上面的命令啟動沒有問題可以看看自己的專案的跟目錄下面,應該會多一個 tendcod.sock 檔案的,
后續如果對 gunicorn 組態檔做了修改:
#那么應該先使用這個命令之后重啟
root@VM-0-7-ubuntu:~# sudo systemctl daemon-reload
#再重啟
root@VM-0-7-ubuntu:~# sudo systemctl restart gunicorn_tendcode
4.2、配置Nginx
接下是配置 Nginx 來處理用戶請求,
root@VM-0-7-ubuntu:~# sudo vi /etc/nginx/sites-available/mynginx
先在服務器的 /etc/nginx/sites-available/ 目錄下新建一個組態檔,檔案名為mynginx,并且寫入配置資訊
#組態檔如下
server {
# 埠和域名
listen 80;
server_name 23.345.234.123;
# 日志
# static 和 media 的地址
location /static/ {
alias /root/sites/shuangblog.com/myblog/static_all/;
}
# gunicorn 中生成的檔案的地址
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8001/;
}
}
服務的公網ip為 23.345.234.123,
所有URL 帶有 /static 的請求均由 Nginx 處理,alias 指明了靜態檔案的存放目錄,(加快靜態檔案的訪問速度,提高用戶使用觀感,提高網站靜態檔案處理能力)
其它請求轉發給 Gunicorn處理,(提高網站處理能力)
由上可知 Nginx 與 Gunicorn的作用
我們在 /etc/nginx/sites-available/ 放置了組態檔,接下來需要創建一個符號鏈接,把這個組態檔加入到啟用的網站串列中去,被啟用網站的目錄在 /etc/nginx/sites-enabled/,你可以理解為從 sites-available/ 目錄下發送了一個組態檔的快捷方式到 sites-enabled/ 目錄,具體命令如下:
root@VM-0-7-ubuntu:~# sudo ln -s /etc/nginx/sites-available/mynginx /etc/nginx/sites-enabled
運行完畢之后可以查看一下 Nginx 的運營情況,看看會不會報錯:
(env) root@VM-0-7-ubuntu:/etc/nginx/sites-available# sudo nginx -t
[sudo] password for wss:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果上面這句沒有報錯,那么恭喜你,你的組態檔沒有問題,可以繼續下一步,如果報錯了,需要按照報錯的資訊去更改組態檔中對應行的代碼,好好檢查一下吧!
重啟一下 Nginx:
root@VM-0-7-ubuntu:~# sudo systemctl restart nginx
五、后續的維護
之后的專案維護中,如果更改了 gunicorn 的組態檔,那么需要依次執行下面兩條陳述句去重啟服務,如果只是修改了 Django 專案的內容,只需要單獨執行第二條重啟命令即可:
root@VM-0-7-ubuntu:~# sudo systemctl daemon-reload
root@VM-0-7-ubuntu:~# sudo systemctl restart gunicorn_tendcode
如果修改了 Nginx 的組態檔,那么需要依次執行下面兩條陳述句去重啟服務:
root@VM-0-7-ubuntu:~# sudo nginx -t
root@VM-0-7-ubuntu:~# sudo systemctl restart nginx
六、參考文章內容鏈接
- 在 Linux 服務器上使用 Nginx + Gunicorn 部署 Django 專案的正確姿勢
- nginx+uwsgi 和nginx+gunicorn區別、如何部署
- 初次部署django+gunicorn+nginx
- 在 Linux 服務器上使用 Nginx + Gunicorn 部署 Django 專案的主要流程
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299956.html
標籤:其他
上一篇:Nginx 服務器
下一篇:青龍面板重啟后打不開的解決方案
