引言:web伺服器是連接配接使用者浏覽器與python伺服器端程式的中間節點,在網站建立的過程中起着重要的作用。目前最主流的web伺服器包括nginx、apache、lighthttpd、iis等。python伺服器端程式在linux平台下使用最廣泛的是nginx。
本文将帶您學習python程式與web伺服器連接配接的wsgi接口、nginx的安裝和配置方法,以及搭建ssl網站的技術。本文選自《python高效開發實戰——django、tornado、flask、twisted》一書。
wsgi是将python伺服器端程式連接配接到web伺服器的通用協定。由于wsgi的通用性,出現了獨立的wsgi程式,例如uwsgi和apache的mod_wsgi。
wsgi的全稱為web server gateway interface,也可稱作python web server gateway interface,開始于2003年,為python語言定義web伺服器和伺服器端程式的通用接口規範。因為wsgi在python中的成功,是以其他語言諸如perl和ruby也定義了類似wsgi作用的接口規範。wsgi的作用如圖。

從上圖中可見wsgi的接口分為兩個:一個是與web伺服器的接口,另一個是與伺服器端程式的接口。wsgi server與web伺服器的接口包括uwsgi、fast cgi等,伺服器端程式的開發者無須學習這部分的詳細内容。伺服器端的開發者需要關注的是wsgi與伺服器程式的接口。
wsgi的伺服器程式的接口非常簡單,以下是一個伺服器端程式的例子,将該檔案儲存為webapp.py:
該代碼隻定義了一個函數app,所有來自web伺服器的http請求都會由wsgi服務轉換為對該函數的調用。該示例的app函數中沒有複雜的處理,隻是通過start_response傳回了狀态碼,并通過return傳回了一個固定的http消息體。與該伺服器端程式相對應的是下面的wsgi server程式:
将該wsgi server的程式儲存為wsgi_server.py,通過下面的指令即可啟動一個web伺服器,該伺服器對所有的請求都傳回hello world頁面:
注意:雖然wsgi的設計目标是連接配接标準的web伺服器(nginx、apache等)與伺服器端程式,但wsgi server本身也可以作為web伺服器運作。由于性能方面的原因,該伺服器一般隻做測試使用,不能用于正式運作。
nginx 是由俄羅斯工程師開發的一個高性能htt和反向代理伺服器,其第1個公開版本0.1.0于2004年以開源形式釋出。自釋出後,它以運作穩定、配置簡單、資源消耗低而聞名。許多知名網站(百度、新浪、騰訊等)均采用nginx作為web伺服器。
因為nginx是python在linux環境下的首選web伺服器之一,是以本節以ubuntu linux為例示範nginx的安裝及配置方法。
在ubuntu linux中可以通過如下指令安裝nginx:
安裝結果如下。
安裝程式把nginx以服務的形式安裝在系統中,相關的程式及檔案路徑如下。
程式檔案:放在/usr/sbin/nginx目錄中。
全局配置檔案:/etc/nginx/nginx.conf。
通路日志檔案:/var/log/nginx/access.log。
錯誤日志檔案:/var/log/nginx/error.log。
站點配置檔案:/etc/nginx/sites-enabled/default。
安裝好後,可以通過如下指令啟動nginx伺服器:
停止nginx伺服器:
檢視nginx服務的狀态:
重新開機nginx伺服器:
nginx安裝後以預設方式啟動,在開發調試的過程中可能需要調整nginx的運作參數,這些運作參數通過全局配置檔案(nginx.conf)和站點配置檔案(sites-enabled/*)進行設定。對全局配置檔案(/etc/nginx/nginx.conf)中的關鍵可設定參數解析如下:
uwsgi是wsgi在linux中的一種實作,這樣開發者就無須自己編寫wsgi server了。
使用pip指令可以直接安裝uwsgi:
安裝完成後即可運作uwsgi指令啟動wsgi伺服器,uwsgi指令通過啟動參數的方式配置可選的運作方式。比如,如下指令可以運作uwsgi,用于加載之前編寫的伺服器端程式webapp.py:
啟動時用--http參數指定了監聽端口,用--wsgi-file指定了伺服器端的程式名。如上所示,uwsgi在啟動的過程中會輸出系統的一些環境資訊:伺服器名、程序數限制、伺服器硬體配置、最大檔案句柄數等。
除了在uwsgi啟動指令行中提供配置參數,uwsgi還允許通過一個配置檔案設定這些配置參數,比如可以編寫如下配置檔案,儲存在檔案名uwsgi.ini中:
啟動uwsgi時直接指定配置檔案即可:
此時用浏覽器通路伺服器的9090端口,效果如下。
除了http和wsgi-file參數,uwsgi還有很多其他參數,常用的如下。
socket:以wsgi的socket方式運作,并指定連接配接位址和端口。該socket接口是uwsgi與其他web伺服器(nginx/apache)等進行對接的方式。
chdir:指定uwsgi啟動後的目前目錄。
processes:指定啟動伺服器端程式的程序數。
threads:指定每個伺服器端程式的線程數。即伺服器端的總線程數為precessesthreads。
uid:指定運作uwsgi的linux使用者id。
比如,如下配置檔案用于用socket方式啟動一個uwsgi伺服器,并配置了程序和線程數:、
直接通過在站點配置檔案中為location配置uwsgi_pass,即可将nginx與uwsgi內建,建立一個基于nginx+python的正式站點。針對如下uwsgi接口有:
技巧:可以為一個uwsgi配置多個nginx server和location,這樣就輕松實作了以多域名通路同一個python程式。
普通http站點的協定與資料以明文方式在網絡上傳輸,而https(hypertext transfer protocol over secure socket layer)是以安全為目标的http通道,即在http下加入ssl層,通過ssl達到資料加密及身份認證的功能。目前幾乎所有的銀行、證券、公共交通的網站均以https方式搭建。
openssl是一個強大的免費socket層密碼庫,蘊含了主要的密碼算法、常用的密鑰和證書封裝管理功能及ssl協定。目前大多數網站通過openssl工具包搭建https站點,其步驟如下。
在伺服器中安裝openssl工具包。
生成ssl密鑰和證書。
将證書配置到web伺服器。
在用戶端安裝ca證書。
本節示範在linux ubuntu下openssl的使用方法,以及nginx在linux下的證書配置方式。windows中openssl的使用方式與linux中的完全一緻,讀者可以自行嘗試。
通過如下兩條指令安裝openssl:
指令運作成功後,openssl指令和配置檔案将被安裝到linux系統目錄中。
openssl指令:/usr/bin/openssl。
配置檔案:/usr/lib/ssl/*。
通過如下步驟生成ca證書ca.crt、伺服器密鑰檔案server.key和伺服器證書server.crt:
上述指令生成伺服器端證書時,必須在common nanme (cn) 字段中如實輸入站點的通路位址。即如果站點通過www.mysite.com通路,則必須定義cn=www.mysite.com;如果通過ip位址通路,則需設定cn為具體的ip位址。
在站點配置檔案/etc/nginx/sites-enabled/default中添加如下server段,可以定義一個基于https的接口,該接口的伺服器端程式仍舊為uwsgi接口127.0.0.1:3011。
其中需要注意的是參數ssl_certificate和ssl_certificate_key需要分别指定生成的伺服器證書和伺服器密鑰的全路徑檔案名。
至此,我們已經可以使用浏覽器通路伺服器的443端口進行https加密通信了。
想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。