Python服務器運維筆記:第二章Linux - 1.2.13 wsgi協議

前言:本文是學習網易微專業的《python全棧工程師》 中的《服務器運維開發工程師》專題的課程筆記,歡迎學習交流。同時感謝老師們的精彩傳授!

一、課程目標

  • wsgi協議
  • wsgi部署

二、詳情解讀

2.1.wsgi協議

nginx, apache這些http服務器只能響應靜態資源,比如請求圖片,html網頁,如果需要請求某個動態程序,必須調用cgi程序接口,pythoncgi接口規範爲wsgi協議。
在這裏插入圖片描述
wsgi - Python Web Server Gateway Interface,即:web服務器網關接口。如果想調用 python編寫的web程序,服務器只需要支持wsgi協議即可,該規範遵守文檔:PEP3333 V1.0.1

服務器方面:
當服務器接收到一個請求後,就會調用python所編寫的web程序,並且需要向該app傳遞兩個參數:environstart_response
在這裏插入圖片描述
web程序方面:
web程序需要從wsgi服務器傳來的environ中獲得request請求各項內容,通過start_response方法生成response響應內容。django、flask框架已經完成了這些內容,我們只要編寫業務邏輯就可以。
在這裏插入圖片描述

示例:

# application.py
def simple_app(environ, start_response):
	status = "200 OK"
	response_head = [{"Content-type", "text/plain;charset=utf-8"}]
	result = "Hello World"

	start_response(status, response_headers)
	return [bytes(result, encoding="utf-8"), b'\n']
# wsgi_server.py
from wsgiref.simple_server import make_server
from application import simple_app

port = 8000
server = make_server('127.0.0.1', port, simple_app)
print('服務器啓動,端口號:%d' % port)
server.serve_forever()

運行上面代碼,瀏覽器訪問:http://127.0.0.1:8000
在這裏插入圖片描述
在這裏插入圖片描述

2.2.wsgi服務器

支持wsgi服務器的有uwsgi、gunicorn等。配置方法都差不多,我們以uwsgi服務器爲例:
官方文檔:https://uwsgi-docs.readthedocs.io/
pypi.org搜索uwsgi
在這裏插入圖片描述

2.2.1.wsgi部署

Step1: 上傳項目文件到linux服務器:

創建服務器程序目錄,並將程序上傳到這個目錄下:

mkdir /wwwroot/

Step2:創建虛擬環境
創建虛擬環境時,注意python版本
1.進入程序目錄:

cd /wwwroot/flask-cms

2.修改Pipfilepython版本:

[requires]
python_version = "3.6.8" # 防止python檢查報錯

3.安裝虛擬環境:

pipenv install --python 3.6.8

Step3: 檢查虛擬環境:
1.激活虛擬環境:

pipenv shell

2.檢查擴展安裝:(檢查插件是否都已經安裝)

pip list

在這裏插入圖片描述
3.啓動內置服務器,檢查程序配置

flask run --host ip --port port  # 這是flask的啓動方式
python manage.py runserver	 # 這是django的啓動方式

比如:

flask run --host 192.168.3.40 --port 5000

查看程序有沒有配置上的錯誤,比如數據庫配置。
關閉或者修改防火牆,使用其他電腦訪問,是否正常。

Step4:安裝uWSGI服務器:
1.安裝c編譯器:

yum install gcc

2.安裝python3:

yum install python3 python3-devel.x86_64

3.安裝uWSGI

pip install https://projects.unbit.it/donwloads/uwsgi-2.0.18.tar.gz

在這裏插入圖片描述
Step4:運行uWSGI服務器:

uwsgi --http 192.168.3.40:8000 --module app:app

在這裏插入圖片描述
Step5: uWSGI服務器配置 - wsgi.ini

[uwsgi]
http=192.168.3.40:5000  # 運行http模式
chdir=/wwwroot/flask/flask-cms	# 項目目錄
module=app:app  
processes=4  # 啓動進程的數量,實際進程數要比這個數多一個
threads=1000  # 每個進程創建的線程數量
pidfile=/tmp/uwsgi.pid  # 進程的文件,這個文件會用於uwsgi服務器的重啓與停止

Step6: uWSGI服務器管理
啓動:

uwsgi -d --ini wsgi.ini  # -d 表示守護進程

重啓:

uwsgi --reload /tmp/uwsgi.pip

關閉:

uwsgi --stop /tmp/uwsgi.pid

uwsgi.ini內容示例:
(運行前需要創建好所配置路徑上的目錄,不然會報錯)
在這裏插入圖片描述
使用守護進程的方式啓動後,可以查看一下進程:

ps aux | grep uwsgi

在這裏插入圖片描述

2.3.nginx + wsgi部署

爲什麼要採用nginx + uwsgi形式?
雖然我們通過uwsgi可以提供web服務,但是網頁訪問中含有大量的靜態資源,比如html,js,css,圖片等等,這些請求直接就可以通過靜態web服務器提供就可以了。uwsgi提供靜態資源並沒有nginx這些服務器更有優勢。
在這裏插入圖片描述
第一種方案使用proxy_pass代理
這種方案,uwsgi運行於http模式:
在這裏插入圖片描述
第二種方案使用uwsgi_pass代理
這種方案,uwsgi運行於AF_UNIX socket模式
在這裏插入圖片描述
nginx服務器配置:

location /{
	include uwsgi_params;
	uwsgi_pass unix:///tmp/uwsgi.sock;
}

uwsgi服務器配置:

socket=/tmp/uwsgi.sock

示例如下:
在這裏插入圖片描述

三、課程小結

  • 01 wsgi協議
  • 02 wsgi實現
  • 03 uwsgi配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章