【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, 或者
【django】Nginx+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下部署Django(nginx+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