1. 程式人生 > >django為什麼線上部署的時候要用到 uwsgi 和 nginx

django為什麼線上部署的時候要用到 uwsgi 和 nginx

首先你要明確幾個概念及其作用(注意大小寫的區別):

  • WSGI
  • uWSGI
  • uwsgi
  • Nginx

WSGI 是一種協議,不是任何包不是任何伺服器,就和 TCP 協議一樣。它定義了 Web 伺服器和 Web 應用程式之前如何通訊的規範。

至於為什麼和 Python 扯在一起?因為這個協議是由 Python 在 2003 年提出的。(參考:PEP-333 和 PEP-3333 )

WSGI is the Web Server Gateway Interface. It is a specification that describes how a web server communicates with web applications, and how web applications can be chained together to process one request.

uWSGI 是一個全功能的 HTTP 伺服器,他要做的就是把 HTTP 協議轉化成語言支援的網路協議。比如把 HTTP 協議轉化成 WSGI 協議,讓 Python 可以直接使用。

The uWSGI project aims at developing a full stack for building hosting services.

Application servers (for various programming languages and protocols), proxies, process managers and monitors are all implemented using a common api and a common configuration style.

uwsgi 是一種 uWSGI 的內部協議,使用二進位制方式和其他應用程式進行通訊。

The uwsgi (lowercase!) protocol is the native protocol used by the uWSGI server.

It is a binary protocol that can carry any type of data. The first 4 bytes of a uwsgi packet describe the type of the data contained by the packet.

Nginx 是一個 Web 伺服器其中的 HTTP 伺服器功能和 uWSGI 功能很類似,但是 Nginx 還可以用作更多用途,比如最常用的反向代理功能。

所以用一張圖來描述一下這個過程:

接下是為什麼不能用 Django 的 Web 伺服器直接部署

Django 是一個 Web 框架,框架的作用在於處理 request 和 reponse,其他的不是框架所關心的內容。所以怎麼部署 Django 不是 Django 所需要關心的。

Django 所提供的是一個開發伺服器,這個開發伺服器,沒有經過安全測試,而且使用的是 Python 自帶的 simple HTTPServer 建立的,在安全性和效率上都是不行的。

DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests.

在 Django 原始碼中可以很清楚的看出來,runserver 起來的 HTTPServer 就是 Python 自帶的 simple_server。

以下是最新版本 Django 有關 runserver command 的程式碼節選

而 WSGIServer 又的父類就是 wsgiref.simple_server。既然是 simple 了很多東西都是不太可以的。

既然 uWSGI 可以完成 Nginx 功能,那為什麼又要用 Nginx

因為 Nginx 牛逼啊,能直接在 Ninx 層面就完成很多事情,比如靜態檔案、反向代理、轉發等需求。

參考