天天看點

10、nginx+uwsgi+django部署(動靜分離)

10.1、說明:

1、介紹:

建立Django項目,可以通過 pyhon3 manage.py runserver 0.0.0.0:8080 & 指令更友善地調試程式,但是如果當一個項目完成了之後,

需要部署到真正的環境,就需要考慮其穩定性。通過Nginx+Uwsgi部署自己的項目,nginx對于處理靜态資源能力強,利用Nginx處理靜

态資源請求,而對于動态請求,nginx将其轉發到uwsgi處理,Uwsgi處理背景的動态請求後再轉發給nginx,實作動靜分離。

nginx+uwsgi動靜分離架構圖:

2、環境:

(1)伺服器名稱及ip位址配置:

伺服器名稱 ip位址
nfs01 172.16.1.31

(2)軟體配置:

nfs01伺服器上安裝的 django 是 2.1.4 版本,python 是 3.7.0 版本。

實驗用的django項目的python版本和django版本與伺服器上安裝的版本保持一緻。

注意:如果伺服器上的python版本、django版本與django項目所使用的python版本、django版本不符合,客

戶端會包 500 的錯誤。浏覽器顯示 Internal Server Error,指令行可以看到如下錯誤

--- no python application found, check your startup logs for errors ---

10.2、安裝uwsgi:

1、pip安裝:

[root@nfs01 ~]# pip3.7 install uwsgi

2、編譯安裝(推薦):

(1)下載下傳源碼包:

[root@nfs01 ~]# mkdir -p tools/

[root@nfs01 ~]# cd tools/

[root@nfs01 tools]# wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

(2)編譯:

[root@nfs01 tools]# mkdir -p /application/

[root@nfs01 tools]# tar -xzf uwsgi-latest.tar.gz -C /application/

[root@nfs01 tools]# cd /application/uwsgi-2.0.18/

[root@nfs01 uwsgi-2.0.18]# python3.7 uwsgiconfig.py --build

[root@nfs01 uwsgi-2.0.18]# python3.7 setup.py install

#到此uwsgi編譯完成,在/application/uwsgi-2.0.18目錄下會生成一個uwsgi可執行檔案

(3)建立軟連接配接:

[root@nfs01 uwsgi-2.0.18]# ln -s /application/uwsgi-2.0.18/ /application/uwsgi

[root@nfs01 uwsgi-2.0.18]# ln -s /application/uwsgi-2.0.18/uwsgi /usr/bin/uwsgi

(4)檢視uwsgi的版本:

[root@nfs01 uwsgi-2.0.18]# uwsgi --version

2.0.18

(5)檢視uwsgi所使用的python版本:

[root@nfs01 uwsgi-2.0.18]# uwsgi --python --version

3、測試uwsgi:

(1)在/application/uwsgi-2.0.18/目錄下建立foobar.py檔案,代碼如下:

def application(env, start_response):

start_response('200 OK', [('Content-Type','text/html')])

return [b"Hello World"]

(2)啟動 uWSGI 來運作一個 HTTP 伺服器,将程式部署在HTTP端口 8080 上:

[root@nfs01 uwsgi-2.0.18]# uwsgi --http 0.0.0.0:8080 --wsgi-file foobar.py

(3)在浏覽器上進行通路:

10.3、使用uwsgi啟動django項目:

1、上傳一個django項目:

[root@nfs01 uwsgi-2.0.18]# mkdir -p /data/www/

[root@nfs01 uwsgi-2.0.18]# cd /data/www/

[root@nfs01 www]# rz -y

rz waiting to receive.

Starting zmodem transfer. Press Ctrl+C to cancel.

Transferring django_demo1.zip...

100% 171 KB 171 KB/sec 00:00:01 0 Errors

[root@nfs01 www]# unzip django_demo1.zip 1>/dev/null

[root@nfs01 www]# mv django_demo1.zip /tmp/

[root@nfs01 www]# tree -L 2 django_demo1/

2、使用uwsgi指令啟動django項目:

(1)啟動項目:

[root@nfs01 www]# cd django_demo1/

[root@nfs01 django_demo1]# uwsgi --http 0.0.0.0:8080 --file django_demo1/wsgi.py --static-map=/static=static

# 參數詳解:

# --http:啟動項目的IP位址和端口。

# --file:指定Django項目中wsgi檔案,一般建立Django項目時自動生成。

# --static-map:指定靜态資源存放的目錄。

[root@nfs01 django_demo1]# ps -ef | grep uwsgi | grep -v grep

補充:直接ctrl+c就可将django項目服務殺死。

(2)在浏覽器中通路:

3、使用uwsgi配置檔案啟動django項目:

(1)在/data/www/目錄中建立script目錄用于存放uwsgi的配置檔案及相關啟動檔案:

[root@nfs01 django_demo1]# cd /data/www/

[root@nfs01 www]# mkdir -p script

[root@nfs01 www]# cd script/

[root@nfs01 script]# cat uwsgi.ini

[uwsgi]

chdir=/data/www/django_demo1

#指定django項目的目錄。

module=django_demo1.wsgi:application

#指定django項目的應用程式=>/data/www/django_demo1/django_demo1/wsgi.py。

socket=/data/www/script/uwsgi.sock

#指定django項目的socket檔案路徑,用于和其它程式進行通信。

workers=1

#指定django項目的程序個數,根據cpu的核數來指定。

pidfile=/data/www/script/uwsgi.pid

#指定django項目的背景程序pid檔案路徑,用于辨別目前django項目所處的狀态。

http=0.0.0.0:8080

#指定django項目的ip位址和端口号。

static-map=/static=/data/www/django_demo1/static

#指定django項目的靜态檔案目錄。

uid=root

gid=root

#指定啟動django項目的使用者名和使用者組。

master=true

#django項目啟用主程序。

vacuum=true

#當django項目服務停止的時候自動移除相應的 socket 檔案和 pid 檔案。

thunder-lock=true

#django項目序列化接受的内容。

enable-threads=true

#django項目啟用線程。

harakiri=30

#django項目自動中斷時間,機關是秒(s)。

post-buffering=4096

#django項目設定的緩沖。

daemonize=/data/www/script/uwsgi.log

#django項目的日志檔案路徑。

(2)啟動django項目:

[root@nfs01 script]# uwsgi --ini uwsgi.ini

[root@nfs01 script]# ls

[root@nfs01 script]# ps -ef | grep uwsgi | grep -v grep

[root@nfs01 script]# netstat -tunlp | grep 8080

(3)在浏覽器中進行通路:

(4)通過uwsgi 配置檔案管理django項目的其它指令:

1)重載django項目:

[root@nfs01 script]# uwsgi --reload uwsgi.ini

2)停止django項目:

[root@nfs01 script]# uwsgi --stop uwsgi.pid

(5)将django服務加入開機自啟動:

[root@nfs01 script]# echo "uwsgi --ini /data/www/script/uwsgi.ini" >>/etc/rc.local

10.4、nginx+uwsig啟動項目,實作動靜分離:

1、安裝nginx:

(1)下載下傳nginx:

[root@nfs01 script]# cd /root/tools/

[root@nfs01 tools]# wget http://nginx.org/download/nginx-1.16.0.tar.gz

(2)安裝:

[root@nfs01 tools]# yum install openssl openssl-devel gcc pcre pcre-devel -y

[root@nfs01 tools]# useradd -M -s /sbin/nologin www

[root@nfs01 tools]# tar -xzf nginx-1.16.0.tar.gz

[root@nfs01 tools]# cd nginx-1.16.0/

[root@nfs01 nginx-1.16.0]# ./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.16.0/

[root@nfs01 nginx-1.16.0]# make install

[root@nfs01 nginx-1.16.0]# ln -s /application/nginx-1.16.0/ /application/nginx

(3)啟動nginx:

[root@nfs01 nginx-1.16.0]# cd /application/

[root@nfs01 application]# nginx/sbin/nginx

[root@nfs01 application]# netstat -tunlp | grep 80

(4)通路驗證:

2、配置nginx:

(1)清理注釋的配置:

[root@nfs01 application]# sed -ri.bak "/#|^$/d" nginx/conf/nginx.conf

(2)建立nginx的配置檔案目錄:

[root@nfs01 application]# mkdir nginx/conf/conf.d/ -p

(3)修改配置檔案:

1)主配置檔案:

[root@nfs01 application]# vim nginx/conf/nginx.conf

worker_processes 1;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

include conf.d/*.conf;

2)包含配置檔案:

[root@nfs01 application]# cat nginx/conf/conf.d/uwsgi.conf

server{

listen 80;

server_name 0.0.0.0;

access_log logs/uwsgi_access.log;

error_log logs/uwsgi_error.log;

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;

# 項目路徑

location / {

include uwsgi_params;

# 導入一個uwsgi子產品,它是用來和uwsgi進行通訊的。

uwsgi_connect_timeout 30;

# uwsgi的逾時時間。

uwsgi_pass unix:/data/www/script/uwsgi.sock;

# uwsgi的socket檔案所在路徑,用戶端所有的動态請求都會直接傳給它。

}

# 靜态檔案路徑

location /static/ {

alias /data/www/django_demo1/static/;

# 注意這裡的靜态檔案目錄後面必須要加左斜杠,否則會找不到靜态資源。

index index.html index.htm;

# 錯誤頁面配置

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

(4)驗證nginx配置檔案:

[root@nfs01 application]# nginx/sbin/nginx -t

3、重新開機nginx服務:

[root@nfs01 application]# nginx/sbin/nginx -s reload

4、将nginx服務加入到開機自啟動:

[root@nfs01 application]# echo "/application/nginx/sbin/nginx" >>/etc/rc.local

5、在浏覽其中通路: