uWSGI+nginx+django+virtualenv+supervisor部署項目

1、前言

在部署項目前,你已有一個可以在你本機測試過,能正常啓動的Django項目(畢竟本文主要講解部署Django項目),以及掌握了Linux系統的一些基本命令。html

相關連接:node

Centos7安裝python3和pippython

Centos7安裝MySQL5.7(yum)nginx

pipreqs(找當前項目依賴的包)git

virtualenv(虛擬環境)github

2、WSGI、uWSGI、uwsgi詳解

WSGI:(Web Server Gateway Interface)服務器網關接口,是一種協議。要實現WSGI協議,必須同時實現Web服務器和Web應用,由於它描述的是Web服務器(如nginx、uWSGI等服務器)如何與Web應用(如用Django框架寫的程序)進行通訊。django

uWSGI:是一個Web服務器,實現了WSGI協議、uwsgi協議、http協議等。它要作的就是把http協議轉化成語言支持的網絡協議。好比把http協議轉化成WSGI協議,讓Python能夠直接使用。 Nginx中HttpUwsgiModule的做用是與uWSGI服務器進行交換。flask

uwsgi:是一種線路協議,並不是是通訊協議,在此經常使用於在uWSGI服務器與其餘網絡服務器的數據通訊。uwsgi協議是一個uWSGI服務器自有的協議,它用於定義傳輸信息的類型。它與WSGI相比是兩樣東西。瀏覽器

3、uwsgi安裝與基本使用

uwsgi官網安全

pip3 install uwsgi

基本測試

新建一個test.py:

def application(env, start_response): start_response("200 OK", [("Content-Type", "text/html")]) return [b"Hello World"]

uwsgi熱加載python應用程序:

uwsgi --http :8000 --wsgi-file --py-autoreload=1 test.py

PS:若是執行了上面命令顯示 uwsgi: command not found

則配置軟連接,方便使用:

ln -s python安裝路徑/bin/uwsgi /usr/bin/uwsgi 例如個人: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

啓動成功後,打開瀏覽器,訪問"服務器公網IP:8000″(或者在本機訪問""http://localhost:8000),就能夠看到"Hello World"字樣了。

PS:我使用的是阿里雲服務器,若是你也是;項目部署好了,在瀏覽器打不開的話,能夠登陸服務器控制檯,添加安全組規則便可,具體請自行百度。

用uwsgi啓動flask

# app.py
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "這是個人第一個flask程序!"

if __name__ == "__main__": app.run()

PS:若是是flask程序,須要再加 --callable app

uwsgi --http :8000 --wsgi-file app.py --callable app

用uwsgi啓動django

修改配置文件,將 ALLOWED_HOSTS 設置爲:當前服務器IP或*,如:

ALLOWED_HOSTS = ["*",]

啓動django:

uwsgi --http :8000 --chdir /usr/local/django/mysite/ --wsgi-file mysite/wsgi.py

根據配置文件啓動

一、建立配置文件 uwsgi.ini

[uwsgi] # 指定ip端口(直接運行設置爲http、用nginx則設置爲socket)
http = 0.0.0.0:8000
# 執行項目的目錄
chdir = /usr/local/django/mysite/
# Django的wsgi.py文件
module = mysite.wsgi  # 至關於mysite/wsgi.py # 容許主進程存在
master = true # 開啓的進程數量
processes = 4
# 後臺運行
daemonize2 = true # uwsgi.pid文件能夠用來重啓和中止uwsgi服務
pidfile = %(chdir)/uwsgi/uwsgi.pid # uwsgi.status能夠用來查看uwsgi的服務狀態
stats = %(chdir)/uwsgi/uwsgi.status # 當服務器退出的時候自動清理環境 
vacuum = true # 將日誌打到指定的日誌文件
logto = /tmp/mysite.log # 虛擬環境
home=/root/envs/pdsite

二、根據配置文件啓動(注意路徑)

# 啓動
uwsgi --ini uwsgi.ini # 中止
uwsgi --stop uwsgi.pid # 重啓
uwsgi --reload uwsgi.pid # 查看uwsgi的服務狀態
uwsgi --connect-and-read uwsgi.status

此時訪問時,會出現找不到靜態文件的錯誤。

想要uwsgi處理靜態文件,須要先將django的靜態文件收集到制定目錄,而後再設置對應關係。

一、收集django靜態文件

  • 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR, "allstatic");
  • 執行 python3 manage.py collectstatic 命令,至此django項目全部相關靜態文件都會收集到指定目錄。

二、設置uwsgi靜態文件對應關係

在上面的 mysite.ini 文件中加入如下配置:

# static-map(映射一個資源到靜態文件區)
static-map = /static=/usr/local/django/mysite/allstatic

映射媒體文件(看你需不須要配置):

static-map = /media=/usr/local/django/mysite/media

再次使用配置文件方式啓動,全部靜態文件就能夠加載了。

4、Nginx

Nginx是一款輕量級的高性能Web服務器/反向代理服務器。咱們能夠利用Nginx作反向代理、負載均衡以及處理靜態文件。

安裝:點擊這裏

下面的全部配置都是爲Django項目配置的

uwsgi官網:使用uwsgi和Nginx設置Django和Web服務器

配置nginx

首先要確保你安裝的Nginx中有uwsgi_params文件哦,以下;沒有能夠從這裏獲取:點我

配置nginx.conf:

user root; worker_processes 4; error_log /opt/nginx/logs/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /opt/nginx/conf/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"'; access_log /opt/nginx/logs/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; # 定義負載均衡池,名字叫作django,池子中寫入uwsgi發佈django的socket地址
 upstream django { server 127.0.0.1:8001; } server { listen 80; server_name www.zouxin.top; charset utf-8; client_max_body_size 75M; location / { # nginx自帶ngx_http_uwsgi_module模塊,起到nginx和uwsgi交互做用
            # 經過uwsgi_pass設置服務器地址和協議,將動態請求轉發給uwsgi處理
 uwsgi_pass django; include uwsgi_params; } # nginx處理靜態頁面資源
        location /static { alias /usr/local/django/mysite/allstatic; } } }
View Code

這個nginx.conf文件告訴nginx從文件系統中提供媒體和靜態文件,以及處理須要django干預的請求。對於大型部署,讓一臺服務器處理靜態/媒體文件,另外一臺服務器處理django應用程序,被認爲是一種良好的作法,就目前而言,這樣作會很好。

部署靜態文件

在運行nginx以前,必須收集靜態文件夾中的全部Django靜態文件。這一步咱們已經在上面完成了。

配置uwsgi(ini文件)

[uwsgi] socket = 127.0.0.1:8001
chdir = /usr/local/django/mysite/ module = mysite.wsgi master = true processes = 4 daemonize2 = true pidfile = %(chdir)/uwsgi/uwsgi.pid stats = %(chdir)/uwsgi/uwsgi.status vacuum = true logto = /tmp/mysite.log static-map = /static=/usr/local/django/mysite/allstatic

啓動uwsgi和nginx(注意路徑)

# 啓動uwsgi
uwsgi --ini mysite.ini # 啓動nginx
cd /opt/nginx/sbin/ ./nginx

5、使用supervisor來管理process

官方文檔

項目正式部署的時候,咱們一般會將其轉化爲系統的守護進程,將其放到後臺運行,可是其並不會爲咱們監控進程的運行狀態,一旦進程崩潰,咱們的項目就沒法繼續提供服務。因此咱們要藉助supervisor,幫助咱們啓動uwsgi並維護(uwsgi進程關閉時,自動將其啓動起來)。

一、安裝

yum install supervisor

二、在/etc/supervisord.conf末尾添加上以下代碼

[program:mysite] ; mysite是進程的名字(後面要用) command=/root/envs/pdsite/bin/uwsgi --ini /usr/local/django/mysite/uwsgi/uwsgi.ini ; 虛擬環境下的uwsgi,和項目uwsgi.ini文件 priority=999 ; 程序運行的優先級(越小越優先) autostart=true ; supervisord啓動時,該程序也啓動 autorestart=true ; 異常退出時,自動重啓 startsecs=10 ; 程序啓動後持續10s後未發生異常,才表示啓動成功 startretries=3 ; 異常後,自動重啓次數 exitcodes=0,2 ; exit異常拋出的是0.2時才認爲是異常 stopsignal=QUIT ; 用於殺死進程的信號 stopwaitsecs=10 ; 向進程發出stopsignal後等待OS向supervisord返回SIGCHILD的時間,若超時則supervisord將使用SIGKILL殺進程 user=root ; 設置啓動該程序的帳號爲chrism log_stdout=true ; 若是爲True,則記錄程序日誌 log_stderr=false ; 若是爲True,則記錄程序錯誤日誌 logfile=/var/log/cat.log ; 程序日誌路徑 logfile_maxbytes=1MB ; 日誌文件最大大小 logfile_backups=10           ; 日誌文件最大數量

三、啓動supervisor

supervisord -c /etc/supervisord.conf

...

http://www.javashuo.com/article/p-hqwwbbrz-gk.html

...

...

相關文章
相關標籤/搜索