前言:本文是學習網易微專業的《python全棧工程師》 中的《服務器運維開發工程師》專題的課程筆記,歡迎學習交流。同時感謝老師們的精彩傳授!
一、課程目標
wsgi
協議wsgi
部署
二、詳情解讀
2.1.wsgi
協議
nginx, apache
這些http
服務器只能響應靜態資源,比如請求圖片,html
網頁,如果需要請求某個動態程序,必須調用cgi
程序接口,python
的cgi
接口規範爲wsgi
協議。
wsgi - Python Web Server Gateway Interface
,即:web
服務器網關接口。如果想調用 python
編寫的web
程序,服務器只需要支持wsgi
協議即可,該規範遵守文檔:PEP3333 V1.0.1
服務器方面:
當服務器接收到一個請求後,就會調用python
所編寫的web
程序,並且需要向該app
傳遞兩個參數:environ
與start_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.修改Pipfile
中python
版本:
[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
配置