1. 程式人生 > >【python專案部署】Nginx+uWSGI+Django部署

【python專案部署】Nginx+uWSGI+Django部署

前言

Django開發實際線上部署的最優架構:Nginx+uWSGI+Django。
採用動/靜分離高效的WEB設計。

WEB發展史回顧

這裡寫圖片描述

wsgi概念

WSGI,全稱 Web Server Gateway Interface,
或者 Python Web Server Gateway Interface ,
是為 Python 語言定義的 Web 伺服器和 Web 應用程式或框架之間的一種簡單而通用的介面。
自從 WSGI 被開發出來以後,許多其它語言中也出現了類似介面。

很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。
當然效能都不好,自帶的 web server
更多的是測試用途,釋出時則使用生產環境的WSGI server或者是聯合 nginx 做 uwsgi

uWSGI概念

WSGI是一種Web伺服器閘道器介面。
它是一個Web伺服器(如nginx)與應用伺服器(如uWSGI伺服器)通訊的一種規範。

uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。
Nginx中HttpUwsgiModule的作用是與uWSGI伺服器進行交換。

WSGI / uwsgi / uWSGI 三者區別:

WSGI是一種通訊協議。
uwsgi同WSGI一樣是一種通訊協議。
而uWSGI是實現了uwsgi和WSGI兩種協議的Web伺服器。

為什麼有了uWSGI為什麼還需要nginx?
因為nginx具備優秀的靜態內容處理能力,然後將動態內容轉發給uWSGI伺服器,這樣可以達到很好的客戶端響應。


Nginx+uWSGI+Django架構圖

這裡寫圖片描述

Nginx+uWSGI+Django部署流程

1、上傳專案至目標伺服器並安裝專案所需的模組
包整專案能正常通過runserver啟動並且檢查沒有問題


----------


2、安裝uwsgi 並使用uWSGI啟動這個服務

執行這條命令的時候:一定要在這個專案目錄中~ 
uwsgi --http 192.168.31.123:80 --file teacher/wsgi.py --static-map=/static=static


----------


3、使用配置檔案啟動uWSGI[ini]
    [uwsgi]
    # 專案目錄
chdir=/opt/project_teacher/teacher/ # 啟動uwsgi的使用者名稱和使用者組 uid=root gid=root # 指定專案的application module=teacher.wsgi:application # 指定sock的檔案路徑 socket=/opt/project_teacher/script/uwsgi.sock # 啟用主程序 master=true # 程序個數 workers=5 pidfile=/opt/project_teacher/script/uwsgi.pid # 自動移除unix Socket和pid檔案當服務停止的時候 vacuum=true # 序列化接受的內容,如果可能的話 thunder-lock=true # 啟用執行緒 enable-threads=true # 設定自中斷時間 harakiri=30 # 設定緩衝 post-buffering=4096 # 設定日誌目錄 daemonize=/opt/project_teacher/script/uwsgi.log ---------- 4、安裝Nginx vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo # 下面這行centos根據你自己的作業系統修改比如:OS/rehel # 6是你Linux系統的版本,可以通過URL檢視路徑是否正確 baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1 # 安裝nginx yum -y install nginx # 新增配置檔案 vim teacher.conf # 這個名字隨便起,最好是和專案一個名字 server { listen 80; server_name 10.129.205.183 ; access_log /var/log/nginx/access.log main; 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/project_teacher/script/uwsgi.sock; } # 指定靜態檔案路徑 location /static/ { alias /opt/project_teacher/teacher/static/; index index.html index.htm; } } ---------- 5、新增預設靜態檔案目錄 vim ../teacher/teacher/settings.py STATIC_ROOT = os.path.join(BASE_DIR, "static_all") Nginx配置靜態檔案簡單修改 ---------- 6、新增管理指令碼 cd /etc/init.d/ vim manage_teacher #! /bin/sh # chkconfig: 345 85 15 # 上面一行註釋:哪些Linux級別需要啟動manage_teacher(3,4,5);啟動序號(85);關閉序號(15)。 # description: manage script is the teacher daemon. # Author: luotianshuai # 指定專案目錄 PROJECT_DIR="/opt/project_teacher/teacher" # 指定指令碼目錄在哪裡 SCRIPTS_DIR="/opt/project_teacher/script" # 描述 DESC="teacher daemon" # 名稱 NAME="teacher" # 指令碼名稱 SCRIPT_FILENAME="manage_teacher.sh" # 指令碼目錄名稱 SCRIPTNAME=`pwd`/$SCRIPT_FILENAME # PID PID="uwsgi.pid" # 啟動函式 d_start(){ # 進入到專案目錄 cd $SCRIPTS_DIR # 判斷這個PID是否存在 if [ ! -f $PID ];then echo -e "\n\033[34m$NAME專案啟動中........\033[0m" # 如果不存在執行 uwsgi --ini uwsgi.ini killall nginx /etc/init.d/nginx start # 自動收集靜態檔案 cd $PROJECT_DIR && python3 manage.py collectstatic --noinput echo -e "\n\033[32m$NAME 專案啟動完成........\033[0m" exit 0 fi echo -e "\n\033[33m$NAME 專案已啟動請勿重複啟動\033[0m" } # 關閉函式 # 關閉專案 d_stop(){ # 進入指令碼目錄 cd $SCRIPTS_DIR # 判斷這個pid檔案是否存在 if [ ! -f "uwsgi.pid" ];then # 這個專案已經關閉了 echo -e "\n\033[33m$NAME 專案已經關閉了請先啟動\033[0m" fi echo -e "\n\033[34m$NAME 專案關閉中........\033[0m" echo -e "\nStop $DESC: $NAME" # 如果沒有關閉 uwsgi --stop uwsgi.pid # 是否停掉Nginx根據實際需要來操作~~!因為Nginx有對靜態檔案快取[注意] killall nginx /etc/init.d/nginx start echo -e "\n\033[32m$NAME 專案關閉完成........\033[0m" } d_restart(){ d_stop sleep 1 d_start } case "$1" in start) echo -e "\nstarting $DESC: $NAME" d_start ;; stop) echo -e "\nStop $DESC: $NAME" d_stop ;; restart) echo -e "\nRestart $DESC: $NAME" d_restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac # 新增服務 chkconfig --add manage_teacher # 開機啟動 [[email protected] init.d]# chkconfig manage_teacher on # 檢視啟動級別 [[email protected] init.d]# chkconfig --list manage_teacher manage_teacher 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 然後就可以通過命令 [[email protected] ~]# service manage_teacher start [[email protected] ~]# service manage_teacher stop [[email protected] ~]# service manage_teacher restart

快速部署[一鍵部署]


3、快速部署[一鍵部署指令碼] 
   --你現在沒有時間看原理和實際部署
   --一鍵部署的指令碼 deployment.sh  去部署Nginx+uWSGI+Django
   --可能會有一些侷限性


# 一鍵部署操作步驟
------------------------------------------
1、上傳專案
2、安裝模組和uwsgi
3、仔細閱讀一鍵部署文件說明
您需要修改的地方有:
# [config1]專案名稱
PROJECT_NAME="teacher"

# [config2]nginx域名或者IP地址和埠,我們用來訪問的
SERVER_NAME="192.168.31.123" #也可以是域名
SERVER_PORT=80

# 過載環境變數
export PATH=\$PATH:/usr/local/python3.6/bin  # 這裡是你python的bin目錄

4、執行部署指令碼

5、執行指令碼命令:
service manage_你的專案名 start|stop|restart|

# 以專案名teacher為例:  
service manage_teacher  {start|stop|restart}


# 系統版本是CentOS 6.5 Python 3.6.1

一鍵部署指令碼具體內容:

#! /bin/sh
# description:一鍵部署Nginx+uWSGI+Django
# Author: luotianshuaiA

#使用說明
#1、環境:
#一鍵部署指令碼前提您已經保證Django可以通過runserver啟動起來並且測試無程式碼問題
#
#2、目錄要求:
#請保證這個指令碼,和專案在同一級目錄
#    [[email protected] opt]# tree -L 1 project_teacher/
#    project_teacher/
#    |-- deploy_project.sh  #部署指令碼
#    `-- teacher  #專案目錄
#
#    1 directory, 1 file
#    [[email protected] opt]#
#
#    # 比如指令碼在/opt/project_teacher目錄下面那麼請把專案上傳到這個目錄下面
#3、您需要的配置項有
#[config1]
#[config2]
#
#4、本指令碼使用會自動新增Nginx配置,請確保沒有安裝Nginx,並且系統為Centos6.5
#

# 這裡不需要動,保證指令碼目錄所在的目錄中包含了專案目錄即可
MANAGE_DIR=`pwd`
#**************************您的配置區域其他的無需修改**************************
# [config1]專案名稱
PROJECT_NAME="teacher"
# [config2]nginx域名或者IP地址和埠,我們用來訪問的
SERVER_NAME="192.168.31.123" #也可以是域名
SERVER_PORT=80

#******************************************************************************
# 專案目錄
PROJECT_DIR=$MANAGE_DIR/$PROJECT_NAME


# 檢查專案目錄是否存在
check_project(){
if [ ! -d $PROJECT_DIR ]; then
echo -e "\n\033[33m PROJECT_DIR 沒有指定,請指定專案目錄\033[0m"
exit 0
elif [ -d $PROJECT_DIR ]; then
echo -e "\033[32m專案目錄存在是:$PROJECT_DIR........\033[0m"
fi


}


# 建立指令碼管理配置
make_script_init(){
echo -e "\033[32m開始建立script目錄........\033[0m"
mkdir script
echo -e "\033[32m開始建立管理檔案........\033[0m"
cat > script/manage_$PROJECT_NAME<<EOF
#! /bin/sh
# chkconfig: 345 85 15
# 上面一行註釋:哪些Linux級別需要啟動manage_teacher(3,4,5);啟動序號(85);關閉序號(15)。
# description: manage script is the $PROJECT_NAME daemon.
# Author: luotianshuai
# 過載環境變數
export PATH=\$PATH:/usr/local/python3.6/bin
# 指定專案目錄
PROJECT_DIR=$PROJECT_DIR
# 指定指令碼目錄在哪裡
SCRIPTS_DIR=$MANAGE_DIR/script
# 描述
DESC="$PROJECT_NAME daemon"
# 名稱
NAME=$PROJECT_NAME
# 指令碼名稱
SCRIPT_FILENAME=manage_$PROJECT_NAME
# 指令碼目錄名稱
SCRIPTNAME=$MANAGE_DIR/script
# PID
PID="uwsgi.pid"

# 啟動函式
d_start(){
# 進入到專案目錄
cd $MANAGE_DIR/script/
# 判斷這個PID是否存在
if [ ! -f "uwsgi.pid" ];then
echo -e "\n\033[34m$NAME專案啟動中........\033[0m"
# 如果不存在執行
uwsgi --ini uwsgi.ini
killall nginx
/etc/init.d/nginx start
# 自動收集靜態檔案
cd $MANAGE_DIR/$PROJECT_NAME&& python3 manage.py collectstatic --noinput
echo -e "\n\033[32m$NAME 專案啟動完成........\033[0m"
exit 0
fi
echo -e "\n\033[33m$NAME 專案已啟動請勿重複啟動\033[0m"
}
# 關閉函式
# 關閉專案
d_stop(){
# 進入指令碼目錄
cd $MANAGE_DIR/script/
# 判斷這個pid檔案是否存在
if [ ! -f "uwsgi.pid" ];then
# 這個專案已經關閉了
echo -e "\n\033[33m$NAME 專案已經關閉了請先啟動\033[0m"
fi
echo -e "\n\033[34m$NAME 專案關閉中........\033[0m"
echo -e "\nStop $DESC: $NAME"
# 如果沒有關閉
uwsgi --stop uwsgi.pid
# 是否停掉Nginx根據實際需要來操作~~!因為Nginx有對靜態檔案快取[注意]
killall nginx
/etc/init.d/nginx start
echo -e "\n\033[32m$NAME 專案關閉完成........\033[0m"
}

d_restart(){
d_stop
sleep 1
d_start
}

case "\$1" in
start)
echo -e "\nstarting $DESC: $NAME"
d_start
;;
stop)
echo -e "\nStop $DESC: $NAME"
d_stop
;;
restart)
echo -e "\nRestart $DESC: $NAME"
d_restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 3
;;
esac
EOF
chmod 755 $MANAGE_DIR/script/manage_$PROJECT_NAME
echo -e "\033[32m開始新增uwsgi.ini配置檔案........\033[0m"
cat > script/uwsgi.ini<<EOF
[uwsgi]
# 專案目錄
chdir=$PROJECT_DIR
# 啟動uwsgi的使用者名稱和使用者組
uid=root
gid=root
# 指定專案的application
module=$PROJECT_NAME.wsgi:application
# 指定sock的檔案路徑
socket=$MANAGE_DIR/script/uwsgi.sock
# 啟用主程序
master=true
# 程序個數
workers=5
pidfile=$MANAGE_DIR/script/uwsgi.pid
# 自動移除unix Socket和pid檔案當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啟用執行緒
enable-threads=true
# 設定自中斷時間
harakiri=30
# 設定緩衝
post-buffering=4096
# 設定日誌目錄
daemonize=$MANAGE_DIR/script/uwsgi.log
EOF
echo  "STATIC_ROOT = os.path.join(BASE_DIR, 'static_all')">> $MANAGE_DIR/$PROJECT_NAME/$PROJECT_NAME/settings.py
}

make_nginx_init(){
echo -e "\033[32m初始化Nginx........\033[0m"
cat > /etc/yum.repos.d/nginx.repo<<EOF
[nginx]
name=nginx repo
# 下面這行centos根據你自己的作業系統修改比如:OS/rehel
# 6是你Linux系統的版本,可以通過URL檢視路徑是否正確
baseurl=http://nginx.org/packages/centos/6/\$basearch/
gpgcheck=0
enabled=1
EOF
yum -y install nginx
echo -e "\033[32m新增Nginx配置檔案........\033[0m"

cat > /etc/nginx/conf.d/$PROJECT_NAME.conf<<EOF
    server {
                    listen $SERVER_PORT;
                    server_name $SERVER_NAME ;
                    access_log  /var/log/nginx/access.log  main;
                    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:$MANAGE_DIR/script/uwsgi.sock;
                    }
                    # 指定靜態檔案路徑
                    location /static/ {
                        alias  $MANAGE_DIR/$PROJECT_NAME/static_all/;
                        index  index.html index.htm;
                    }

    }
EOF
}
add_server(){
echo -e "\033[32m新增管理至服務........\033[0m"
cp $MANAGE_DIR/script/manage_$PROJECT_NAME /etc/init.d/
chkconfig --add /etc/init.d/manage_$PROJECT_NAME
chkconfig /etc/init.d/manage_$PROJECT_NAME on

# 啟動服務
echo -e "\033[32m啟動服務........\033[0m"
service manage_$PROJECT_NAME start
}


check_project
make_script_init
make_nginx_init
add_server

相關推薦

python專案部署Nginx+uWSGI+Django部署

前言 Django開發實際線上部署的最優架構:Nginx+uWSGI+Django。 採用動/靜分離高效的WEB設計。 WEB發展史回顧 wsgi概念 WSGI,全稱 Web Server Gateway Interface, 或者

djangoNginx+uWSGI+Django部署我的部落格網站

一.前言 我們通常將nginx作為伺服器最前端,它將接收WEB的所有請求,統一管理請求。然後nginx把所有靜態請求自己來處理(這是NGINX的強項),並將將所有非靜態請求通過uwsgi傳遞給Django,由Django來進行處理,從而完成一次WEB請求。

ubuntu 16.04部署python項目(Nginx+uwsgi+django

也有 src cnblogs 就是 主機 serve .cn ket essential 嘗試在linux上部署項目,先從最熟悉的python項目開始吧。 1、安裝Nginx 命令:sudo apt-get install nginx 2、安裝uwsgi,從pip倉庫安裝

Django專案部署nginx+uWSGI+django+virtualenv+supervisor釋出web伺服器 )

一、簡介 WSGI是Web伺服器閘道器介面。它是一個規範,描述了Web伺服器如何與Web應用程式通訊,以及Web應用程式如何連結在一起以處理一個請求,(接收請求,處理請求,響應請求) 基於wsgi執行的框架有bottle,DJango,Flask,用於解析動態HTTP請求 支援WSGI的伺服器

Nginx+uWSGI+Django部署web服務器

使用配置 -- tin 排除 允許 發布 enable ble chdir 目錄 Nginx+uWSGI+Django部署web服務器 環境說明 前言 搭建項目 Django部署 編輯luffy/luffy/settings.py 編輯luffy/app01/views.

Nginx+uWSGI+Django部署web伺服器

一.搭建專案     1.建立一個虛擬環境         建議個人學習和測試的話,直接建在 /home/ubuntu/使用者/ 目錄下, virtualenv -p python3 py

Django項目部署nginx+uWSGI+django+virtualenv+supervisor發布web服務器 )

通過命令 code 應用程序服務器 不同 靜態文件處理 運行 web服務 文件 mysq 一、簡介 WSGI是Web服務器網關接口。它是一個規範,描述了Web服務器如何與Web應用程序通信,以及Web應用程序如何鏈接在一起以處理一個請求,(接收請求,處理請求,響應請求

python3 nginx+uwsgi+Django 部署

安裝Nginx(centos7) 1.新增源 2.安裝 sudo yum install -y nginx 3.啟動nginx systemctl start nginx.service systemctl restart nginx.service syst

nginx+uWSGI+django部署

①安裝uwsgi pip install uwsgi 測試uwsgi是否安裝成功 ②安裝django django建立專案:django-admin.py startproject projectname 測試django專案是否建立成功 ③連線djang

nginx + uwsgi + django部署

virtualenv 配置虛擬環境 檢測是否已安裝virtualenv virtualenv --version 若沒有顯示版本號則表示沒有安裝virtualenv 安裝virtualenv pip install virtualenv 建立

Python技術棧04 CentOS7部署Django專案

CentOS7部署Django專案 1. 雲伺服器 這裡使用的是騰訊雲 選擇系統:CentOS7.3 記住雲伺服器登入密碼 2. 配置Python3環境 預設Python環境為python2.7,yum安裝是需要python2的環境的 安裝Python3: y

專案部署nginx+uwsgi+django

1.概念 Django專案(web應用) web服務 nginx:高併發處理的好 Apache:穩定 LAMP:Linux Apache MySQL Python/Php/Per1 LNMP:Linux Nginx    My

Nginx+Uwsgi+Django+Python伺服器部署及除錯(更新0.1)

Nginx+Uwsgi+Django+Python伺服器部署 環境:Ubuntu16.04 1.python開發環境 安裝pyenv,python,virtualenv,需要使用python虛擬環境env 2.安裝配置nginx 安裝 sudo apt-get ins

nginx+uWSGI+django+virtualenv+supervisor部署釋出web專案

 Nginx (engine x) 是一個高效能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。 wsgi是PythonWeb伺服器閘道器介面(Web Server Gateway Interface),WSGI是作為Web伺服器與Web應用程式或應用框架之間的一種低級別的介面,以提升可移

Centos7+nginx+uwsgi部署我的Django專案

前不久寫了個小的部落格專案,想著將它部署到伺服器上去,因為是第一次部署專案,有很多的東西都不這麼懂,走了很多的彎路,現在部署成功了,怕以後忘記了就記錄下筆記 首先我的專案結構如下: 關於伺服器的遠端連線,我用的伺服器是阿里雲的輕量應用伺服器,連線資料庫的軟體通過WinSCP來連線我的伺

解決django專案部署nginx+uwsgi伺服器admin後臺樣式消失的問題

摘要: uwsgi為主要伺服器,nginx為反向代理伺服器 部署完成之後發現django後臺admin訪問時無樣式 解決方法如下: 1.先開啟django專案中settings.py檔案(/bl

五步教你實現使用Nginx+uWSGI+Django方法部署Django程序

設置 wsgi alias admin 生效 server static 出現 mar 新建一個XML文件: djangochina_socket.xml,將它放在/data/www/org_management目錄下: Nginx采用8077端口與uWSGI通訊,請確保此

Nginx+uWsgi生產部署Django

web服務器 上傳 完成 分享圖片 ram onf utf targe 還需 部署得過程很簡單,部署得核心在於,為什麽要這樣做,每一個參數代表什麽意思,最終的目的是得了解,一些基概念性的東西。 uWsgi簡介 說Uwsgi之前,先說一下Wsgi。 什麽是Wsgi?

centos7下部署Djangonginx+uwsgi+django+python3)

參考文獻: https://blog.csdn.net/anifans9350/article/details/80145535 https://www.cnblogs.com/dalanjing/p/8636338.html   0.安裝步驟預覽(1)系統預設自帶python2.x,所以需

nginx+uWSGI+django+virtualenv+supervisor部署發布web項目

content its object src Pythonweb system perm 會有 targe Nginx (engine x) 是一個高性能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。 wsgi是PythonWeb服務器網關接口(We