基於CentOS 7 ,用Nginx + uWSGI 部署Django項目上線 【多圖、詳細、附項目源碼】

先放一張佈置完成的圖,爲來者勖!

另外,此篇博客集多個博客之精華。這是我第二遍部署,重新申請的虛擬主機,並且一次成功。

網址是 http://157.230.141.185,音樂網站。感興趣的小夥伴可以進去聽聽音樂喲~ 目前數據庫裏面有13首。
國外服務器,打開可能慢一些,稍安~~

估計2019.03 - 04月一直掛着這臺虛擬機。後期若刪除,導致無法訪問還望理解~  ✿✿ヽ(°▽°)ノ✿

希望對你有所幫助,有問題請留言~ 歡迎交流。

一些細節的東西后期我會慢慢加上~

資源鏈接

鏈接:https://pan.baidu.com/s/10-9gyVWRUKt0p5fjYxpTJQ  提取碼:v0a1 
包括項目以及數據庫excel文件

正文部分開始:^_^

部署前的準備工作

1. 申請DigitalOcean虛擬主機,這裏選用的系統是CentOS

多說一句:之所以選擇DigitalOcean 是因爲對於學郵註冊的用戶,充值5 $ 送50 $。。。 要不肯定首選國內的阿里雲呀-_-#

假設你已經有相應賬戶。。。

若沒有,這是邀請鏈接https://m.do.co/c/76433b03b4ed  嘿嘿... 這個沒被牆,放心點開~

因爲是測試部署項目,選擇5美元每月的就行,服務器地點任意,這裏選擇的是舊金山。然後點擊創建

會得到一個有公網ip的虛擬機

下面用ssh工具遠程連接,這裏我用的是Git Bash,昨天嘗試部署踩坑時用的是putty。ftp工具我用的是SSH Secure File Transfer Client。 僅供參考!^_^

MAC系統請自動查閱想用的ssh工具和ftp工具

ssh ->     ftp ->    

 

2.修改root密碼,並進入Terminal

然後就可以進行享受命令行帶來的快感了。。。/手動捂臉 @_@

3.上傳Django項目至 /home/ 目錄

之所以單拉出來講,並放這麼靠前。主要是用的是國外服務器,上傳速度慢。。。項目大小40多M呢,估計需要上傳半個小時。。。T_T

FTP工具提前登場~~~~~~~~~ 撒花 ✿✿ヽ(°▽°)ノ✿

登錄之後的樣子,需要把music項目文件夾 上傳至 home/ 目錄,右鍵upload,讓它慢慢上傳着~~~

4.安裝MySQL -- 如果你的項目中沒用到,則跳過即可。(看一下也無妨,萬一以後用到呢)

這裏安裝的是5.7,關於選擇5還是8的版本,自行Google喲~

在 https://dev.mysql.com/downloads/repo/yum/ 找到 yum 源 rpm 安裝包

安裝yum 源

# 先安裝Linux的wget工具,用於網上下載文件。
yum -y install wget

# 下載rpm安裝包
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 安裝 mysql 源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

用下面的命令檢查 mysql 源是否安裝成功,出現下圖即爲安裝源安裝成功

yum repolist enabled | grep "mysql.*-community.*"

安裝MySQL  -- (別緊張,馬上就好。前面是安裝源)

yum install -y mysql-community-server  # 執行完這句纔算安裝完成

一些相關命令

# 查看mysql服務狀態
systemctl status mysqld

# 啓動mysql服務
systemctl start mysqld

# 停止mysql服務
systemctl stop mysqld


# 設置開機啓動
systemctl enable mysqld
# 然後重載所有修改過的配置文件
systemctl daemon-reload

mysql 安裝完成之後,生成的默認密碼在 /var/log/mysqld.log 文件中。使用 grep 命令找到日誌中的密碼。

grep 'temporary password' /var/log/mysqld.log

首次通過初始密碼登錄後,使用以下命令修改密碼

mysql -uroot -p  # 首次登陸不用輸如密碼

# 修改密碼,第一次不用flush 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';  

# 修改密碼也可以用下面的語句
mysql> set password for 'root'@'localhost'=password('MyNewPass4!'); 

以後通過 update set 語句修改密碼

mysql> use mysql;
mysql> update user set password=PASSWORD('MyNewPass5!') where user='root';
mysql> flush privileges;  # 需要flush

注意:mysql 5.7 默認安裝了密碼安全檢查插件(validate_password),默認密碼檢查策略要求密碼必須包含:大小寫字母、數字和特殊符號,並且長度不能少於8位。否則會提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 錯誤。查看 MySQL官網密碼詳細策略

查看編碼,(修改前)

設置默認編碼爲utf-8:

mysql 安裝後默認不支持中文,需要修改編碼。
修改 /etc/my.cnf 配置文件,在相關節點(沒有則自行添加)下添加編碼配置,如下:

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

重啓mysql服務,查詢編碼。可以看到已經改過來了

shell> systemctl restart mysqld
shell> mysql -uroot -p
mysql> show variables like 'character%';

默認配置文件路徑:

配置文件:/etc/my.cnf
日誌文件:/var/log/var/log/mysqld.log
服務啓動腳本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

創建項目數據庫

CREATE DATABASE 你的數據庫名稱 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

ps:這裏的字符集用utf8mb4 或者用utf8mb4_unicode_ci 都可以。記得輸入你的數據庫名稱哦~

至此,數據庫配置完畢~~~  再次撒花✿✿ヽ(°▽°)ノ✿

5. 安裝Python3 -- 爲什麼把python3放在這一步,因爲下一步的遷移和收集需要用到。(這個解釋能接受嗎?^_^)

# 安裝前準備 -- 臥槽 又是準備。。。

# 安裝Linux的wget工具,用於網上下載文件。

yum -y install wget  # 前面安裝mysql的時候好像安裝了 wget工具。(人家是爲了保證步驟的完整性才放到這裏的,嘿...)

# GCC編譯器環境,安裝Python3時所需要的環境

yum -y install gcc

#  Python3 使用的依賴組件

yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite*-devel mysql-devel

 

# 然後用 wget 下載Python3.6 壓縮包 (在home目錄下)

wget "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz"

# 解壓

tar -zxvf Python-3.6.3.tgz

 

解壓得到的Python-3.6.3文件夾是我們需要的開發環境。

最後將Python-3.6.3編譯到CentOS7 系統

# 進圖 Python-3.6.3文件夾

cd Python-3.6.3

# 依次輸入編譯指令 (指令含義參考 https://www.linuxidc.com/Linux/2011-02/32211.htm)

sudo ./configure

make && make install

國外服務器下載python,咔咔就是快。以上按命令來即可。。。就不配圖了哈~

還是配一張吧~ 檢驗python3 有木有安裝成功。 或者命令行直接輸入python3。

(另外,系統自帶python2.7的版本,別去管他。安裝完3版本之後 用到的地方就敲python3

6. 安裝Django 和 mysqlclient (因爲下一步要用 (⊙o⊙)…

pip3 install mysqlclient

pip3 install django

7. Django項目settings.py文件修改 、遷移生成數據表 以及 收集靜態文件

修改settings.py

DEBUG = False  # 關閉debug模式

ALLOWED_HOSTS = ['*']  # 允許任意域名主機訪問
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'music_db',
        'USER': 'root',
        'PASSWORD': 'mysql密碼',
        'HOST': '127.0.0.1',  # 注意:這裏就是localhost,不能修改成公網ip
        'PORT': '3306',
    }
}
...
# STATIC_ROOT用於項目部署上線的靜態資源文件
STATIC_ROOT = 'collected_static/'
STATIC_URL = '/static/'
# STATICFILES_DIRS用於收集admin的靜態資源文件
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]

# 切記 STATIC_ROOT 和 STATICFILES_DIRS 不能重名!

注意:關於 STATIC_ROOT 和 STATICFILES_DIRS 路徑的聯繫、區別 與配置,請移步https://www.qikqiak.com/post/django-staticroot-staticfilesdirs-function/

下面的兩步就是需要用到python3 的地方。    撒花~ ✿✿ヽ(°▽°)ノ✿

遷移生成數據表

在 /home/music/ 目錄下 依次執行:

python3 manage.py makemigrations  # 不加app名 代表對所有app執行此操作

python3 manage.py migrate

去數據庫查看

趁熱打鐵:插入數據文件。細節性的東西先甭管,複製粘貼執行即可~

這裏有4分數據文件,我已經轉成對應的額SQL語句。如下:

由於表格之前有外鍵約束,下面的SQL得先執行前兩條,後執行後兩條!!!

INSERT INTO `music_db`.`index_label` (`label_id`, `label_name`) VALUES (1, '情感天地'),(2, '搖滾金屬'),(3, '經典流行'),(4, '環境心情'),(5, '午後場景'),(6, '歲月流金'),(7, '青春校園');
INSERT INTO `music_db`.`index_song` (`song_id`, `song_name`, `song_singer`, `song_time`, `song_album`, `song_languages`, `song_type`, `song_release`, `song_img`, `song_lyrics`, `song_file`, `label_id`) VALUES (1, '愛 都是對的', '胡夏', '04:20', '胡 愛夏', '國語', '流行', '2010-12-08', '1.jpg', '暫無歌詞', '1.m4a', 3),(2, '體面', '於文文', '04:42', '《前任3:再見前任》電影插曲', '國語', '傷感','2017-12-25', '2.jpg', '暫無歌詞', '2.m4a', 4),(3, '三國戀', 'Tank', '04:06', 'Fighting!生存之道', '國語', '搖滾', '2006-04-15', '3.jpg', '暫無歌詞', '3.m4a', 2),(4, '會長大的幸福', 'Tank', '04:32', '第三回合', '國語', '勵志', '2009-05-29', '4.jpg', '暫無歌詞', '4.m4a', 4),(5, '滿滿', '梁文音/王錚亮', '04:44', '愛,一直存在', '國語', '甜蜜', '2009-11-20', '5.jpg', '暫無歌詞', '5.m4a', 1),(6, '別再記起', '吳若希', '04:04', '別再記起', '粵語', '場景', '2017-12-07', '6.jpg', '暫無歌詞', '6.m4a', 4),(7, '愛的魔法', '金莎', '03:11', '他不愛我', '國語', '甜蜜', '2012-03-19', '7.jpg', '暫無歌詞', '7.m4a', 1),(8, '演員', '薛之謙', '04:11', '演員', '國語', '流行', '2015-06-05', '8.jpg', '暫無歌詞', '8.m4a', 3),(9, '放愛情一個假', '許慧欣', '03:24', '謎', '國語', '安靜', '2006-10-01', '9.jpg', '暫無歌詞', '9.m4a', 4),(10, 'Volar', '側田', '03:52', 'No Protection', '粵語', '搖滾', '2006-07-05', '10.jpg', '暫無歌詞', '10.m4a', 2),(11, '好心分手', '王力宏/盧巧音', '03:00', '2 Love 致情摯愛', '國語', '傷感', '2015-07-24', '11.jpg', '11.txt', '11.m4a', 1),(12, '就是這樣', '林採欣', '05:13', '單曲', '國語', '流行', '2016-10-10', '12.jpg', '暫無歌詞', '12.m4a', 3),(13, '愛過了 又怎樣', '張惠春', '04:09', '單曲', '國語', '流行', '2016-09-07', '13.jpg', '暫無歌詞', '13.m4a', 3);
INSERT INTO `music_db`.`index_dynamic` (`dynamic_id`, `dynamic_plays`, `dynamic_search`, `dynamic_down`, `song_id`) VALUES (1, 35, 45, 22, 1),(2, 47, 17, 21, 2),(3, 38, 34, 14, 3),(4, 4, 6, 2, 4),(5, 28, 7, 5, 5),(6, 206, 65, 42, 6),(7, 154, 53, 20, 7),(8, 15, 16, 33, 8),(9, 9, 12, 18, 9),(10, 68, 65, 35, 10),(11, 125, 70, 51, 11),(12, 53, 32, 45, 12),(13, 106, 54, 12, 13);
INSERT INTO `music_db`.`index_comment` (`comment_id`, `comment_text`, `comment_user`, `comment_date`, `song_id`) VALUES (1, '幾好聽', '匿名用戶', '2018-04-20', 6),(2, '幾好聽', '匿名用戶', '2018-04-20', 6),(3, '阿朵發放', '匿名用戶', '2018-04-20', 6),(4, '阿朵發放', '匿名用戶', '2018-04-20', 6),(5, '阿朵發放', '匿名用戶', '2018-04-20', 6),(6, '阿朵發放', '匿名用戶', '2018-04-20', 6),(7, '阿朵發放', '匿名用戶', '2018-04-20', 6),(8, '好好聽', '匿名用戶', '2018-04-27', 11);

挑一個數據表看一下里面的數據~ 滿足你們的好奇心 ^_^

收集靜態文件

python3 manage.py collectstatic

ok... 至此準備工作完畢~  撒花~ ✿✿ヽ(°▽°)ノ✿

安裝uWSGI 和 Nginx  -- 此處才正式開始部署工作

uWSGI 和 Nginx 的解釋後面慢慢加進來吧。着急的小夥伴自行Google喲~ 

8.部署 uWSGI 服務器

uWSGI是一個web服務器,它實現了WSGI、uWSGI 和 HTTP 等協議。Nginx中 HttpUwsgiModule 的作用是與 uWSGI 服務器進行交換。 WSGI 是一種 Web 服務器網關接口,它是一個 Web 服務器與 Web應用 通信 的一種規範。(這裏 web服務器 是 Nginx服務器,web應用是Django)。

部署 uWSGI 服務器之前,需要在Python3 中安裝相應的板塊,使用pip3 安裝即可。

pip3 install uwsgi

完成之後,測試uWSGI 服務器能否正常運行。指令如下:

#  /home/music 是項目 music 的絕對路徑,music.wsgi 是項目music 裏面的 wsgi.py 文件

uwsgi --http :8009 --chdir /home/music -w music.wsgi

輸入ip:8009 查看

吼~  一切正常~  撒花~ ✿✿ヽ(°▽°)ノ✿

下一步:ctrl + c 退出,然後編輯

music_uwsgi.ini 配置文件 (放在music項目目錄下即可)

[uwsgi]
# Django-related settings
# 下面端口號隨便指定一個,需要與nginx保持一致。但不能是80端口,因爲nginx服務監聽的就是80端口
socket= 157.230.141.185:8888

# the base directory (full path)
chdir=/home/music


# Django s wsgi file
module=music.wsgi:application

# process-related settings
# master
master=true

#maximum num of worker processes
processes=4

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum=true

然後。。。

啓動一下配置文件

uwsgi --ini music_uwsgi.ini

然後再次訪問 ip:8888 (因爲我們選擇的端口是8888)

顯示如下:

不要緊張。。。 因爲我們還未配置Nginx。。。 -_-#

ctrl + c 停了uwsgi 服務,進行一下步!

9. 安裝 Nginx 部署項目 ----  最後一步,生活要有儀式感  撒花~ ✿✿ヽ(°▽°)ノ✿

 

# 添加 Nginx 安裝源

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 使用yum 安裝 Nginx

yum -y install nginx

然後切換到 /etc/nginx/ 目錄,打開並編輯 nginx.conf 文件。

# 在最後那個大括號 } 內,新增如下內容

    server  {
        listen      80;  # 監聽80端口
        server_name     157.230.141.185;
        charset    UTF-8;
        access_log      /var/log/nginx/myweb_access.log;
        error_log       /var/log/nginx/myweb_error.log;

        client_max_body_size    75M;

        location / {
            include uwsgi_params;
            uwsgi_pass  157.230.141.185:8888;  # 這裏ip和端口號 要和uwsgi.ini文件中一致
            uwsgi_read_timeout  2;
        }

        location    /static/ {
            expires 30d;
            autoindex   on;
            add_header  Cache-Control private;
            alias   /home/music/collected_static/;  # 這裏要是收集靜態文件的路徑
        }
    }

然後啓動Nginx服務

sudo nginx -c /etc/nginx/nginx.conf

sudo nginx -s reload

# 最後再次執行

uwsgi --ini music_uwsgi.ini

部署完畢!!!

瀏覽器輸入網址 157.230.141.185 這次不用加端口號

成功啦!!! 撒花~ ✿✿ヽ(°▽°)ノ✿ ~ ✿✿ヽ(°▽°)ノ✿  ~ ✿✿ヽ(°▽°)ノ✿   

再看一下後臺命令行:

當然也可以設置在後臺運行 加上 -d 即可。

也可以把訪問記錄寫到 日誌 裏面。 

相關工作後期慢慢加上吧。

 

Nginx 操作

# 停止
ps -ef | grep nginx

# 從容停止Nginx:
kill -QUIT 主進程號

# 快速停止Nginx:
kill -TERM 主進程號

# 強制停止Nginx:
pkill -9 nginx

nginx -t -c /path/to/nginx.conf 測試nginx配置文件是否正確

關閉nginx:

nginx -s stop  :快速停止nginx

nginx -s quit  :完整有序的停止nginx

 

 

Reference:

1. https://www.jianshu.com/p/1dab9a4d0d5f

2. https://www.jianshu.com/p/c72e9dd2ab9b

3. http://www.itmuch.com/install/nginx-yum-install-in-centos7/

4. http://www.usday.cn/blog/51

5. https://blog.csdn.net/kriszhang/article/details/68941829

6. https://python012.github.io/2018/06/28/deploy-django-project-in-DigitalOcean-ubuntu/

7. https://www.qikqiak.com/post/django-staticroot-staticfilesdirs-function/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章