為什麼這篇Gunicorn uwsgi 比較鄉民發文收入到精華區:因為在Gunicorn uwsgi 比較這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者kenduest (小州)看板Python標題Re: [問題] 新手對Web Server和We...
ㄖ※ 引述《weinine32 (隨意)》之銘言:[B
: 依學過Asp.net、php的理解是,網頁程式需放在Web Server (IIS、Apache、Nginx)
: 裡面才能執行。
: 而Python有Web Framework,似乎可以不需要Web Server就可以執行?
: 但是網路上又有人分享如何部署 django + nginx + uwsgi
: 想請問:
: 1) 直接使用Web Framework部署網頁和django + nginx + uwsgi的差異?
可能需要先說說 Python Web Server Gateway Interface 這東西比較好說下去?
這與 CGI 很類似。WSGI 基本上算是用 python 要寫 web 程式的一個標準,
詳細可以參考 PEP 333
python 自己本身就有 WSGI 協定架構的支援,只是一般直接用 python 這個
interpreter 來執行 WSGI 架構的程式碼速度不大好而且還有很多議題得處理,
所以會使用比較專門的 WSGI 程式來執行 python 的程式碼。寫 django 的時候
開發階段一般我們常會用 django runserver 命令跑一個 http server 在某個
port 上面工作,這時候主要是開發簡單方便,運作的速度效能就不是考慮重點。
實作 WSGI 協定的程式很多,就你文章內提到 uwsgi (uWSGI) 就是一種主流
的程式,因為他是使用 c 開發的程式所以處理與執行效能很好,其他像是還有
Gunicorn 以很常見,不過它程式碼還是以 Python 實作。實作 WSGI 的程式
基本上算是相當多。
所以用 django 開發的程式後續會用 uwsgi (uWSGI) 程式來啟動,而 uWSGI 程式
啟動時候可以指定 WSGI 還是 HTTP 溝通協定提供外部的存取。一般會以 WSGI
模式來啟動為效能考量。不過外部瀏覽器等當然還是以 HTTP 方式請求,所以還要
搭配一個 HTTP Server 像是 nginx 來使用。
nginx 本身設計上運作很有效率,所以效能上比 apache 好不少,而且本身內建
可以直接支援 UWSGI 程式溝通的能力,簡單設定檔案設定一下就可以把請求 pass
給所寫的 django 程式。另外用 uwsgi 本身還可以搭配其他不同設定,這會比
直接讓 uWSGI 載入 django app 之後直接 listen port 提供 HTTP 存取更好。
所以用 Django 這個 Framework 來說 runserver 就可以跑相關整個 HTTP 服務,
只是一般是開發階段用為主,正式 production 不會這樣使用...
: 2) 目前用Python寫網頁程式的主流方法是什麼?
web app 目前一般常見還是搭配 Django 比較多,小型一點有人會使用 Flask,
Flash 比較簡單陽春,要完備點比較多人是選 Django。Django 底層當然還是使用
WSGI,只是多一層封裝了。
: 3) 是否也可以用Gevent做Web Server? Gevent也是屬於Web Framework嗎?
: 謝謝
gevent 內也有 WSGI 項目,會用 Gevent 主要是它的 async 架構的設計寫
特定應用程式會很方便,只是目前比較少人會用 gevent 寫 web 程式,目前
一般大多都是用到它的 co-routine 一些特性,官網的例子:
>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']
一般網路請求存取都是 blocking mode 運作模式,若用傳統的方式要解析一堆主機
名稱的 ip 位址常常會花時間在等待網路回應上,一個解析完成再解析另外一個...
若過程一個卡住就等它 timeout。
用 gevent 的 co-routine 的特性就可以加快整段的運作速度。以往要解決,大多會使用
thread 方式來避開這類問題,而使用 gevent 在這個需求上就會單純不少。目前我把他當
python 2.x 世代上 asyncio 使用的一般 Library 來看待,只是談 coroutine 又是另外
一個大領域了。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.155.17
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1467123010.A.83F.html