OpenResty ™ 是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建可以處理超高併發、擴展性極高的動態 Web 應用、Web 服務和動態網關。html
OpenResty 經過匯聚各類設計精良的 Nginx 模塊(主要由 OpenResty 團隊自主開發),從而將 Nginx 有效地變成一個強大的通用 Web 應用平臺。這樣,Web 開發人員和系統工程師可使用 Lua 腳本語言調動 Nginx 支持的各類 C 以及 Lua 模塊,快速構造出足以勝任 10K 乃至 1000K 以上單機併發鏈接的高性能 Web 應用系統。前端
OpenResty 的目標是讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不只僅對 HTTP 客戶端請求,甚至於對遠程後端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。mysql
以上是從官網拷過來的原話,咱們經過寫一個hello world,來走進openresty開發之旅linux
下載地址
http://openresty.org/cn/downl...nginx
有的人不會下windows版,因此我這裏直接給出下載地址,如今是最新版本,學會了以後,能夠本身下載git
mac、linux 平臺
https://openresty.org/downloa...github
windows平臺
https://openresty.org/downloa...web
關於安裝
mac、linux安裝看這裏 http://openresty.org/cn/insta...
windows 直接以後直接啓動就能夠了,不用安裝ajax
安裝完以後彆着急啓動redis
開始寫代碼了
打開nginx目錄下的conf/nginx.conf文件
在server中新增如下代碼
location /hello { default_type text/html; content_by_lua ' ngx.say("<p>hello, world</p>") '; }
相似這樣
http { server { listen 80; server_name localhost; location / { default_type text/html; content_by_lua ' ngx.say("<p>hello, world</p>") '; } } }
如今啓動nginx,而後訪問 http://localhost/hello,不出意外的話應該就OK了,若是你以前啓動了,那麼須要reload一下,nginx的基本操做這裏就不介紹了
經過ngx.say 咱們能夠往客戶端輸出響應文本,在整個request週期內能夠屢次調用,接受的參數是字符串,若是輸出table會報錯
還有一個輸出的函數是ngx.print,一樣也是輸出響應內容
這裏有一個坑,就是調用ngx.say會在輸出咱們的內容以後會額外輸出一個換行,可是ngx.print就不會,我以前一個同事用lua輸出了一個200,而後前端用ajax調用,判斷是否200,死活是false,看輸出的內容就是200,差點懷疑人生,幸好我比較機智,直接查看ajax請求源碼,發現行號多了一行,就是那個換行,若是不仔細根本看不出來,這個坑被我一個同事踩了
上面的代碼直接把lua代碼寫到nginx配置裏面了,維護起來不是很方便,並且寫代碼的時候也沒有語法高亮,提示這些,比較蛋疼,咱們把它拿出來一個單獨的文件,並放到一個nginx下面單獨的lua目錄下,方便管理
lua/hello.lua
ngx.say("<p>hello, world</p>")
nginx.conf 改爲這樣
location / { default_type text/html; content_by_lua_file lua/hello.lua; }
而後nginx reload 一下,再看效果,應該是同樣的
咱們修改一下hello.lua,在hello,world後面加一個!號,刷新瀏覽器發現沒有任何變化,這是由於lua代碼被緩存了,這就致使咱們修改代碼,就必須reload nginx 在能看到效果,若是是這樣,那簡直要瘋了,其實要解決這個問題很簡單,只要在nginx.conf裏面把lua緩存給禁止掉就好了,固然在生產線上必定要把緩存打開,否則效果大打折扣
禁止lua緩存
server { listen 80; server_name localhost; lua_code_cache off; # 這個能夠放在server下面,也能夠凡在location下面,做用的範圍也不同,爲了簡單直接放這裏了 location / { default_type text/html; content_by_lua_file lua/hello.lua; } }
改完以後reload一下nginx,這裏重點聲明一下修改nginx配置必需要reload,不然是沒有效果的
如今咱們再改hello.lua,而後刷新瀏覽器就會發現能夠實時生效了
觀察以上代碼其實還會發現一個問題,若是咱們想要處理不少個請求,那不是要在nginx裏面配置N個location嗎,咱們確定不會這麼作,這裏能夠經過nginx正在匹配動態指定lua文件名,便可完成咱們的需求,後臺我再介紹如何打造一個屬於咱們的mvc輕量級框架,這裏咱們先這麼作
location 改爲這樣
location ~ /lua/(.+) { content_by_lua_file lua/$1.lua; }
reload nginx
這個時候訪問hello world的請求url就變成了
http://localhost/lua/hello 了
同理,咱們在lua文件裏面建立一個welcome.lua的話,就能夠經過
http://localhost/lua/welcome 來訪問了
以此類推,咱們就能夠經過新增多個文件來處理不一樣的請求了,並且修改了還能實時生效,剩下的就是完成業務代碼了,好比調一下redis返回數據,或者mysql之類的,有悟性的同窗在這裏已經能夠作不少事情了
示例代碼 參見demo1部分