原文地址:地址
這段時間一直在學Python,得益于Py(蜜汁微笑)的語言風格,寫起代碼來神速,曾經使用py爬豆瓣top250和知乎,用py的輪子爽的飛起。
先介紹一個django是什么。 django是基于python的restful風格的 web 開發框架。讓你只用很少的代碼就可以寫出一個web網站或者一個提供API支持的后臺。
為什么要使用nginx + uWSGI 部署服務
- django自己內置了一套遵循wsgi協議的web服務器,關于什么是wsgi,請看這里,但是,注意:django自帶的web服務器僅限于開發使用,說白了也就是性能不夠,不能支持線上生產環境的并發。
-
nginx + uwsgi 是現在市面上主流的部署django服務的做法,使用nginx + uwsgi實現動靜分離,動態請求分發給uwsgi,靜態請求也就是靜態的文件給nginx處理。結構圖如下所示
圖片來自網絡,侵刪
開始正題
前面是一些概念性的廢話,下面我們開始正題
服務器環境
centos 7.3 + python 3.5.2(環境可能不同,但原理是一樣的) vps : vultr
客戶端環境
win10 64位 ,xshell 連接服務器
python 源碼
一套簡單的博客系統,教程地址: http://zmrenwu.com/category/django-blog-tutorial/
開始部署
安裝Python依賴包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
安裝python版本
centos7自帶python版本 2.7,我們安裝3.5.2,
wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz # 下載python包
tar -xzvf Python-3.5.2.tgz -C /usr/local/src/ # src目錄是存放源碼的目錄解壓到src目錄
cd /usr/local/src/Python-3.5.2 # 跳轉到解壓目錄
./configure --prefix=/usr/local/python3 # 檢查
make && make install #安裝
將python添加到linux環境變量
cd /etc/profile.d/
export PATH="$PATH:/usr/local/python3/bin"
source ../profile # 重載文件
echo $PATH # 查看當前環境變量是否添加 如果發現后面有python3出現,代表成功
代碼上傳準備工作
- 我將源碼托管在github上,再在linux中用git拉下來,所以我們需要安裝git
- git安裝命令
yum -y install git
mysql安裝
centos7中推薦使用mariadb,如果你項目中沒有用到mysql你可以不安裝
yum install mariadb-server mariadb 安裝
systemctl start mariadb #啟動mysql
mysql -u root -p #登錄mysql 密碼默認為空 執行下方的創建數據庫語句
CREATE DATABASE `blog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; # 創建數據庫,后面我們會用到
exit # 退出數據庫
拉取blog代碼 并使用django自帶的服務器運行####
前面都是準備工作,下面我們來點看得見的東西。將我們的項目運行起來。如果你不是使用我的源碼,請保證你的代碼可以通過runserver跑起來,這樣才可以談得上在服務器上部署,下面請跟著一起做,每一步都盡量相同
cd /opt/
mkdir blog
cd blog
mkdir script # 新建一個文件夾,我們后面有用,現在先不用管
git clone https://github.com/loopq/django_blog.git # 拉取源碼
前面我們已經拉取了代碼,接下來我們運行一下,看看我們的代碼是不是好的!
cd django_blog # 來到django_blog工程目錄下
rm -rf static_all # 刪除這個文件夾,后面我們再創建
pip3 install -r requirements.txt # 安裝項目所需要的依賴
python3 manage.py makemigrations # 遷移數據庫
python3 manage.py migrate # 生成數據庫
python3 manage.py createsuperuser #生成超級管理員,輸入賬戶和密碼。密碼需要兩次相同
python3 manage.py runserver 0:8000 #運行django服務器,瀏覽器頁面上訪問你的ip:8000/blog/,如果出錯,請對照上方的步驟一步一步來(注意,請保證你的8000端口是開放給外部的,或者直接把防火墻給關掉)
這時候如果你的web界面是正常的話(何為正常,類似下方),沒有數據是正常的,因為數據庫是全新的,我們來添加點數據,瀏覽器輸入你的ip:8000/admin/進入管理員界面,賬號和密碼是上方生成超級管理員的賬號和密碼。
添加數據的步驟我就不演示了(懶,手動逃跑),這是django自帶的后臺管理,很強大是不是。多玩玩就會了。添加完數據之后回首頁刷新,數據就出來了,回xshellctrl+c 停止django服務
OK,現在我們可以保證django代碼是正確的。接下來進入正菜
uwsgi安裝 和 配置
uwsgi安裝
pip3 install uwsgi # 安裝
uwsgi 啟動服務
其實僅僅使用uwsgi也是可以發布django的,只不過因為uwsgi又要處理動態請求,又要處理靜態文件,效率沒有加入nginx高,所以才加入nginx。下方是uwsgi啟動的命令,使用這個可以得到和上方一樣的效果。
uwsgi --http :8000 --module blogproject.wsgi --static-map=/static=static
但是實際情況下,不會直接用命令行啟動,都是使用配置文件,下面開始。
cd /opt/blog/script/
nano uwsgi.ini # 編輯配置文件 nano是我使用的編輯器,vi,vim都可以使用
# 配置文件內容 ,如果你的工程目錄和名字和我的不一樣,需要修改下方的 blog 字段 和 django_blog 字段,blog和django_blog是文件夾,blogproject是項目名
[uwsgi]
# 項目目錄
chdir=/opt/blog/django_blog/
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 指定項目的application
module=blogproject.wsgi:application
# 指定sock的文件路徑
socket=/opt/blog/script/uwsgi.sock
# 啟用主進程
master=true
# 進程個數
workers=5
pidfile=/opt/blog/script/uwsgi.pid
# 自動移除unix Socket和pid文件當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩沖
post-buffering=512
# 設置日志目錄
daemonize=/opt/blog/script/uwsgi.log
# 配置文件內容結束
# uwsgi 命令
uwsgi --ini uwsgi.ini 啟動
uwsgi --stop uwsgi.pid 停止
ps -ef | grep -i uwsgi 檢查uwsgi有沒有啟動
檢查uwsgi已經啟動的情況下,我們進行下一步nginx的安裝,如果沒有啟動,或者出了問題,一步一步排查原因吧
nginx 安裝及設置
nginx安裝
yum -y install nginx
訪問 ip:80端口出現nginx歡迎頁 代表 nginx安裝成功
nginx配置
cd /etc/nginx/conf.d
為什么一定要在這里?因為在nginx的配置文件中有這么一行
include /etc/nginx/conf.d/*.conf
配置文件詳細編寫
這里就很重要了,是配置文件的編寫
server {
listen 80; # 監聽哪個端口
server_name 45.32.71.174 ; # 你的ip地址 或者是域名,如果是域名需要解析dns,這個自行搞定
access_log /var/log/nginx/access.log main; # 日志記錄
error_log /var/log/nginx/error.log; # nginx錯誤日志,可自行設置,但必須保證提前建立好該目錄和文件
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-
php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定項目路徑uwsgi
location / {
include uwsgi_params;
uwsgi_connect_timeout 30;
uwsgi_pass unix:/opt/blog/script/uwsgi.sock; # 這里需要改為你的目錄(如果你和我的目錄一致不需要改動)
}
# 指定靜態文件路徑
location /static/ {
alias /opt/blog/django_blog/static/; # 這里需要改為你的目錄(如果你和我的目錄一致不需要改動)
index index.html index.htm;
}
}
在這里編寫的配置文件都會被自動包含,編寫完成之后使用
nginx -t
確認編寫正確,出來的信息尾部帶有successful表示成功,有錯誤去錯誤日志里面看詳細日志,一點點改就行。
nginx + uwsgi 運行 及 檢查
service nginx stop
uwsgi --stop uwsgi.pid(如果已經啟動 停止)
uwsgi --ini uwsgi.ini
service nginx start
以為到這里就完了?
訪問admin頁面試試?
為什么我們的CSS和js都失效了?我們的首頁可都是好的呀。這是怎么肥四!?
原來啊是因為admin是django自帶的,css和js等靜態文件都在源碼里面,是找不到的。
收集靜態文件
setting文件加入:
STATIC_ROOT = os.path.join(BASE_DIR, 'static_all')
在項目路徑下執行
python3 manage.py collectstatic --noinput # 收集文件
你可以在項目目錄下看到static_all文件夾,里面就包含整個項目的靜態文件 和 admin的相關靜態文件
別忘了在 nginx的配置文件中配置 靜態文件所在地,我們還需要他處理靜態請求呢。
nginx配置文件更改完之后最好重啟,因為nginx對靜態文件是有緩存的。
ok,到這里就全部結束。That's DONE!
參考鏈接:
https://docs.djangoproject.com/en/1.11/howto/static-files/deployment/
http://www.lxweimin.com/p/80393ae41a5f
http://www.lxweimin.com/p/6d4e0cad4bf9
這個是視頻,51cto的,講師很不錯
歷時一天半,搞定。 莫名的自豪感哈 ~
簡書小透明,第一次發帖哈哈。First Blood...