Django雖然沒有講完,但是基礎部分已經講完了,根據前四篇文章:
- Django學習路線之從虛擬環境開始Django初體驗
- Django學習路線之URL與視圖
- Django學習路線之Django自帶模板語言DTL
- Django學習路線之MySQL驅動安裝及簡單連接(文末附簡單圖書管理系統實例)
再加上這篇文章,您已經可以自己完成一個簡單的Django項目了。但是,項目做出來是需要別人訪問並使用的,因此還需要部署項目。
這篇文章是基於CentOS + nginx + uwsgi 的部署方法。
下面是四大步驟:
1. 生產環境部署準備
爲什麼要用雲服務器部署?
像這樣查到的ip地址,是動態變化的,可能重啓一下路由就變了:
我們是通過IP地址訪問網站的,而IP地址一變,就訪問不到了,而用雲服務器能固定IP
購買ECS雲服務器
進入阿里雲購買一臺ECS雲服務器,配置根據自己的需求進行選擇,買的過程就不多說了,阿里雲的產品文檔寫的都挺清楚的,系統選擇CentOS,當然選擇Ubuntu也是可以的,但是比較常用的還是CentOS
下面是已經購買好的ECS雲服務器:
如果您是第一次使用雲服務,還需要重置實例密碼,具體操作可以查看阿里雲的產品文檔:
配置安全組規則
新建一個安全組規則,點擊快速添加:
開放必要的端口:
爲什麼要配置安全組呢?
安全組負責管理是否放行來自公網或者內網的訪問請求。
爲安全起見,安全組入方向大多采取拒絕訪問策略。
因此,如果不配置安全組,可能無法遠程連接數據庫等
通過Xshell測試連接雲服務器
剛剛已經開放了端口22,下面我們就用Xshell訪問服務器:
點擊同意並保存:
這時輸入系統的賬戶和密碼:
這樣就算連接成功了:
2. 阿里雲部署安裝必要的軟件
安裝Python3
CentOS 8.1 已經預先安裝了Python3:
但是老版本只安裝了Python2,如果你用的是老版本,那就需要手動安裝Python3
1.安裝依賴包
yum install opensll-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ opensll-devel libffi-devel python-devel mariadb-devel
2.下載Python源碼
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar -xzvf Python-3.7.3.tgz -C /tmp
cd /tmp/Python-3.7.3
3.把Python3.7安裝到 /usr/local目錄
./configure --prefix=/usr/local
make
make altinstall # 這一步比較耗時
4.更改/usr/bin/python鏈接
ln -s /usr/local/bin/python3.7 /usr/bin/python3
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
安裝maridb
mariadb跟MySQL是一樣的,centos中已經集成了,安裝非常簡單
1.安裝命令
sudo yum install mariadb-server
安裝好後:
2.啓動、重啓
sudo systemctl start mariadb
sudo systemctl restart mariadb
開啓數據庫服務:
然後也可以show databases查看數據庫,最後按Ctrl+C退出
下面我們試一下在本地連接一下服務器裏的數據:
測試連接時是失敗的,失敗的原因是我們還需要綁定一下端口
3.設置安全規則,配置MySQL端口
在根目錄下:
vim /etc/my.cnf
進入後:
輸入 i 進入編輯模式:
添加兩行:
[mysqld]
bind-address = 0.0.0.0
按ESC退出編輯模式,輸入:wq保存並退出
重啓服務:
sudo systemctl restart mariadb
然後再進入數據庫:
4.設置外部ip可以訪問
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
如下圖所示:
這時回到SQLyog測試連接:
可以看到連接成功了,密碼是剛剛的123456
這裏說一句,爲了演示方便,所以我設置了一個簡單的密碼,但是在實際項目中,密碼應該複雜些,否則很危險
來show databases:
和本地查看的結果是一樣的:
安裝redis
yum install redis
service redis start
然後開啓redis服務:
安裝Nginx
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
安裝virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
yum install python-setuptools python-devel
pip install virtualenvwrapper
3. 上傳並啓動項目
將項目所用到的本地數據庫導出
先把本地的數據庫文件導出:
將導出的數據庫上傳至服務器
下面我們把在本地導出的數據庫導入服務器:
現在再來執行以下show databases:
查看裏面的數據表:
查表:
這就是上一篇文章裏用到的數據表
使用FileZilla上傳項目文件
如下圖所示連接服務器:
成功連接後:
選中需要上傳的項目,右鍵點擊上傳即可:
成功上傳:
回到Xshell,看一下文件有沒有成功上傳:
啓動項目
還記得前幾篇文章裏講的方法嗎:
python3 manage.py runserver 0.0.0.0:8000
這裏我們直接運行是會報錯的,因爲我們還有一些資源庫沒有安裝:
下面我們把這些庫都裝一下,另外,我在安裝mysqlcilent時出了點問題,這時我們先執行這一條命令:
yum install python3-devel mariadb-devel -y
然後再:
pip3 install mysqlclient
安裝成功!啓動項目:
這時咱們來訪問一下:
這時我們要回到settings.py文件:
將ALLOWED_HOSTS改成*:
ALLOWED_HOSTS = ['*']
另外,正式上線的話,DEBUG = True應該也改一下
修改好以後,再來運行一下項目:
這時就可以正常訪問了!
4. 配置Nginx以及uwsgi
剛剛已經成功把項目跑起來了,但是那樣的方式其實並不是特別好,在訪問時需要輸入端口號,不安全
接下來我們通過使用uwsgi的方式來跑項目
安裝uwsgi
pip3 install uwsgi
安裝的過程中,可能會有一點慢
測試uwsgi
uwsgi --http :8000 --module django_db_demo.wsgi
出現下面的界面是正常的:
再來訪問一下網站:
配置Nginx
先在項目的目錄下新建一個名爲conf的文件夾,再在conf這個文件下新建兩個目錄,分別是nginx和uwsgi:
在nginx下新建一個uc_nginx.conf文件並在裏面添加以下內容:
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 101.201.181.229; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /root/logic_online/media; # 指向django的media目錄
}
location /static {
alias /root/logic_online/static; # 指向django的static目錄
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
這裏要注意的是,server_name要改成自己的域名或IP
然後再在uwsgi這個目錄下新建uwsgi.ini配置文件,並添加如下內容:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /root/django_db_demo
# Django's wsgi file
module = django_db_demo.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8001
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = /root/.virtualenvs/django_db_demo
#logto = /tmp/mylog.log
如果不用虛擬環境,後面那塊可以不寫:
- chdir:表示需要操作的目錄,也就是項目的目錄
- module:wsgi文件的路徑
- processes:進程數
- virtualenv:虛擬環境的目錄
然後將這個conf文件夾上傳至服務器:
在用之前,我們先來改一個文件:
vim /etc/nginx/nginx.conf
將nginx改成root
重啓Nginx服務:
sudo systemctl restart nginx
將改配置文件加入到Nginx的啓動配置文件中
sudo ln -s 你的目錄/logic_online/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
當然也可以直接找到這個文件,然後用cp命令複製過去:
cp uc_nginx.conf /etc/nginx/conf.d/
執行完以後記得重啓Nginx服務:
sudo systemctl restart nginx
接下來進入項目所在目錄,並執行以下命令即可:
uwsgi yourfile.ini
這時就不需要輸入端口號了:
到這裏,Django項目就全部部署結束了!