Linux生產環境下部署Django+Nginx+uwsgi
本文是在上一篇 “ Linux作業系統下部署Jenkins環境,資料遷移(備機部署)以及主從節點的配置 ”基礎上進行延伸,Jenkins+Django+Nginx+uWSGI才是一套解決方案。
之所採用Django+Nginx+uwsgi的解決方案,是由於python manage.py runserver 0:8081形式啟動Django,只適用於環境測試。當退出終端,甚至退出執行python manage.py runserver,就會發現無法對Django進行訪問。為了解決這個問題,在企業中都會使用Django+Nginx+uwsgi 的解決方案。
目錄
環境準備
Num | Software | Version |
1 | Python | 3.6 |
2 | Django | 1.11.9 |
3 | mysqlclient | 1.3.13 |
4 | Mysql | 5.7 |
5 | Uwsgi | 2.0.17 |
環境部署
說明:本文部署的服務絕大多數,均採用原始碼編譯安裝的方式進行。且所使用軟體版本,均是編者在自身生產環境下采用的,軟體版本視個人情況而言。
Python3.6部署
[-> ~# opt] wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
[-> ~# opt] yum install gcc make openssl-devel pcre-devel zlib-devel sqlite-devel python-devel -y
[-> ~# opt] cd Python-3.6.0
[-> ~# Python-3.6.0] ./configure --prefix=/usr/local make && make install # 如果沒有安裝gcc make 等包,在編譯安裝時會出錯
如果編譯安裝後沒有pip的使用者,可以自行到官網進行下載 https://pypi.org/project/pip/。但其實一般來說,原始碼編譯安裝後都會有pip,只是在使用pip的時候,系統預設呼叫的是 "/usr/bin" 路徑下。而我們編譯安裝的是在 "/usr/local/bin/"路徑下。所以,我們可以做個連結到"/usr/bin"下 (ln -s /usr/local/bin/pip /usr/bin/pip)來解決。
如果實在是沒有的使用者,在下載後,解壓後進入到pip檔案內使用如下命令進行安裝:
[-> ~# opt] tar -xvf pip-18.0.tar
[-> ~# opt] cd pip-18.0
[-> ~# pip-18.0] python setup.py install
Mysql部署
[-> ~# opt] wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
[-> ~# opt] yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
[-> ~# opt] systemctl start mysqld
[-> ~# opt] systemctl enable mysqld
[-> ~# opt] grep password /var/log/mysqld.log # 檢視資料庫初始化密碼
[-> ~# opt] ss -antulp | grep :3306 # 檢視資料庫是否已啟動
Mysql 資料庫命令列的基本操作可以網上自行學習,這裡就不過多闡述。
Django部署
Django的部署,在編者以往的文章 “ 使用Python、Django、Bootstrap編寫Web頁面,以及利用ansible-cmdb、ansible等模組,在web介面獲取批量伺服器配置資訊,以及實現批量管理伺服器 ”有較為詳細的安裝部署步驟,不懂的讀者可以前去查閱。
在虛擬環境下安裝所需要的模組:
(dj_env)[-> ~# dj_env] pip install django==1.11.9
(dj_env)[-> ~# dj_env] pip install mysqlclient==1.3.13
(dj_env)[-> ~# dj_env] pip install uwsgi==2.0.17
(dj_env)[-> ~# dj_env] pip list # 檢視列表是否安裝成功,成功如下圖
Package Version
----------- -------
Django 1.11.9
mysqlclient 1.3.13
pip 18.0
pytz 2018.5
setuptools 28.8.0
uWSGI 2.0.17
新增uwsgi檔案:(建議建立在django app 同級目錄下)
(dj_env)[-> ~# dj_app] vim uwsgi.ini
# 內容如下:
[uwsgi]
chdir = /opt/dj_app/dj_app # 指定工作目錄
socket = 127.0.0.1:8081 # 通過套接字的方式進行訪問,埠可因個人實際情況進行修改,
# 如果不想直接寫入,可以生成stock檔案,然後進行制定
#socket = ./uwsgi.sock # 如果這裡使用uwsgi.sock檔案,則在nginx.conf檔案內的uwsgi_pass檔案就必須是soc檔案的絕對路徑
module=oms.wsgi:application
chmod-socket = 664
static-map=/static=./static # 靜態檔案路徑
master = true # 主程序
vacuum = true # 重啟或退出時清理檔案
workers = 2 # 子程序數
uid = scon # 指定啟動的使用者
gid = scon
pidfile = ./uwsgi8081.pid # 建立pid程序檔案,主要用於啟動、停止該程序
daemonize = ./uwsgi8081.log # 啟動的日誌檔案
# 在使用uwsgi --ini uwsgi.ini命令前,建議先使用命令pkill uwsgi,然後使用lsof -i 8081,看下有沒有服務佔用此埠。如果有則kill掉
(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini # 類似初始化,生成相關檔案,從ini檔案中獲取配置
Nginx服務部署
[-> ~# opt] wget http://nginx.org/download/nginx-1.11.2.tar.gz
[-> ~# opt] tar -xvf nginx-1.11.2.tar.gz
[-> ~# opt] cd nginx-1.11.2
[-> ~# nginx-1.11.2] ./configure --prefix=/usr/local/nginx
[-> ~# nginx-1.11.2] make && make install
啟動Nginx服務
[-> ~# opt] ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
[-> ~# opt] nginx # 啟動服務
[-> ~# opt] lsof -i 80 # 檢視哪個服務佔用80埠,然後kill掉
修改Nginx配置檔案:
[-> ~# opt] vim //usr/local/nginx/conf/nginx.conf
# 修改為如下:80埠對映多埠
server {
listen 80;
server_name localhost;
location / {
# proxy_pass 127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#uwsgi_pass unix:uwsgi.sock的絕對路徑;
uwsgi_pass 129.0.0.1:8081;
include uwsgi_params;
}
}
... ...
server {
listen 80;
server_name www.a.com;
location / {
proxy_pass 127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[-> ~# opt] ngins -t # 如果出現ok,說明配置檔案修改無誤,如果有報錯,則需要解決
[-> ~# opt] nginx -s reload # 重新載入nginx配置檔案
到這裡,Django+Nginx+uwsgi 就已經部署完成了,此時我們使用如下命令:
(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini
(dj_env)[-> ~# dj_app] ss -antulp # 檢視8081埠是否已經由uwsgi啟動,如果是則成功。
最後,訪問 “ http://127.0.0.1:8081 ”,就可以看到Django頁面的 “ It Work”。
本文旨在提供參考,如有錯誤,歡迎大家指正。幫助編者不斷的改進!