瀏覽器上網的過程簡單來講便是瀏覽器從服務器中獲取網站信息,通過渲染後將效果呈現給用戶。這裏側重介紹下在幕後默默工做着的服務器。
Web服務器是運行在物理服務器上的一個程序,永久地等待客戶端(主要是瀏覽器,好比Chrome,Firefox等)發送請求。Web服務器經過HTTP協議與客戶端通訊,當收到請求以後,若是是靜態文件的話Web服務器可直接返回,若是不是靜態文件的話須要有一個Web應用服務器根據不一樣的請求處理對應的業務邏輯生成相應的響應,以下圖所示。html
目前在UNIX和LINUX平臺下使用最普遍的免費Web服務器有Apache和Nginx。Nginx是高效的Web服務器和反向代理服務器,能夠用做負載均衡,與Apache相比,Nginx支持高併發,能夠支持百萬級的TCP鏈接,十萬級別的併發鏈接,部署簡單,內存消耗少,成本低,雖然動態請求處理沒有Apache豐富,但Nginx支持uWSGI的uwsgi協議,可將動態請求傳遞至uWSGI處理。python
這裏選擇使用Nginx和uWSGI相結合的應用,因爲Nginx是反向代理服務器,所以須要網絡上的Web應用服務器uWSGI負責具體的應用邏輯處理,雖然uWSGI也能夠做爲Web服務器應用在小規模網站,但配合Nginx使用能夠更好的利用Nginx在緩存、併發處理,安全防禦,日誌等方面的強大功能。
nginx
下面就來介紹下如何搭建Nginx+uWSGI環境來運行Python應用。web
下載源碼庫。Nginx服務器的安裝依託於openssl、zlib、pcre庫的支持,在安裝Nginx以前須要對這三個庫進行安裝,如下提供各個源碼庫的下載地址:
(1)openssl-fips-2.0.2.tar.gz(安全通信庫)https://www.openssl.org/source/
(2)zlib-1.2.7.tar.gz(數據壓縮庫)http://www.zlib.net/
(3)pcre-8.21.tar.gz(正則表達式庫)http://www.pcre.org
(4)nginx-1.2.6.tar.gz http://nginx.org/en/download....正則表達式
安裝源碼庫。在Shell終端界面中輸入Linux命令執行安裝。涉及到普通用戶執行root命令時權限不足的問題,可在命令前增長sudo指令解決。執行安裝分爲如下幾步:
(1)解壓文件。tar zxvf openssl-fips-2.0.2.tar.gz
(2)進入至存儲的文件夾路徑。cd openssl-fips-2.0.2
(3)運行shell配置腳本檢測運行環境,生成makefile文件。./configure(Nginx的配置腳本須要結合依託庫運行:./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2)shell
若運行環境不知足,如運行pcre配置文件時提示「configure: error: You need a C++ compiler for C++ support」,即缺乏C++編譯器,那麼須要安裝C++編譯器「sudo apt-get install g++」
(4)編譯源碼庫:make
(5)安裝源碼庫:make instaljson
執行測試命令:./nginx -t(在/usr/local/nginx/sbin路徑下執行),出現以下提示表示已經安裝成功瀏覽器
啓動/中止服務器緩存
(1)執行啓動命令:./nginx。啓動後在瀏覽器輸入http://localhost:80監聽本機80端口,出現以下圖所示內容,表示已經成功啓動nginx服務器
安全
(2)執行查看端口命令:netstat -ntlp
(3)篩選出nginx進程並打印:ps -ef|grep nginx
(4)Kill進程ID方式退出nginx進程:kill -QUIT
在介紹uWSGI服務器部署前,先梳理uwsgi、uWSGI、WSGI的區別:
WSGI(Web Server Gateway Interface)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口協議,只要web服務器和 web應用都遵照WSGI協議,那麼二者之間就能夠任意組合。
uwsgi是基於二進制的線路協議,與WSGI協議做用相同,但屬於uWSGI服務器自有協議
uWSGI是Web服務器,它實現了WSGI協議、uwsgi、http等協議
安裝uWSGI。此處經過pip安裝,也能夠下載源碼進行安裝。
pip install uwsgi
Python編寫應用程序server.py,在網頁上顯示「Hello World」,代碼以下:
def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
啓動uWSGI服務器。可經過命令方式啓動uWSGI,也能夠將參數寫在配置文件中(inixmljsonyaml),指定配置文件來啓動uWSGI(命令「uwsgi myapp.ini」)。
sudo uwsgi --http-socket :8001 --plugin python --wsgi-file server.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
--http-socket參數指定了HTTP監聽地址和端口,
--wsgi-file參數指定了WSGI應用程序入口,uWSGI會自動搜尋名爲」application」的應用對象並調用它。
--plugin python參數指定uWSGI 使用 python 插件去解析文件
--master 參數配置主進程
--processes 參數配置多進程
--threads參數配置多線程
--stats 參數配置在指定地址訪問狀態信息,以下圖在」127.0.0.1:9191″獲取JSON格式的運行信息
配置文件內容以下: [uwsgi] http-socket=:8001 plugins = python wsgi-file=server.py master=true processes=4 threads=2 stats=127.0.0.1:9191
瀏覽器URL輸入」http://localhost:8001″,能夠訪問到server.py執行的結果」Hello World!」
更多關於uWSGI的介紹可參考官網文檔:http://uwsgi-docs.readthedocs...
Ngx_http_uwsgi_module模塊起到Nginx服務器與uWSGI服務器交互做用,經過對uwsgi_pass設置服務器地址和協議,可將動態內容傳遞至uWSGI處理。
配置uWSGI。將uWSGI的HTTP端口監聽改成socket端口監聽,即配置文件中的「http-socket」項改成「socket」項。
[uwsgi] socket=127.0.0.1:3031 plugins = python wsgi-file=server.py master=true processes=4 threads=2 stats=127.0.0.1:9191
配置Nginx。打開Nginx的配置文件nginx.conf(Ubuntu上路徑「/usr/local/nginx/conf」),須要執行「sudo chmod -R 777 nginx.conf」下降配置文件權限纔可對服務器相關屬性進行配置
配置代碼以下: server { listen 80; server_name localhost; location / { #root html; #index index.html index.htm; include uwsgi_params;#加載uWSGI配置參數 uwsgi_pass 127.0.0.1:3031;#請求轉發至」127.0.0.1:3031″端口上,即uWSGI服務器 } }
啓動uWSGI服務器和nginx服務器,再次訪問」http://localhost:80」時會看到python應用程序返回「Hello World!」,表示已經完成nginx服務器對uWSGI服務器的反向代理功能。
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf sudo service nginx restart$ uwsgi myapp.ini