OpenResty ™ 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。
OpenResty 通過匯聚各種設計精良的 Nginx 模塊(主要由 OpenResty 團隊自主開發),從而將 Nginx 有效地變成一個強大的通用 Web 應用平臺。這樣,Web 開發人員和系統工程師可以使用 Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊,快速構造出足以勝任 10K 乃至 1000K 以上單機并發連接的高性能 Web 應用系統。
OpenResty 的目標是讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。
以上是從官網拷過來的原話,我們通過寫一個hello world,來走進openresty開發之旅
下載地址
http://openresty.org/cn/download.html
有的人不會下windows版,所以我這里直接給出下載地址,現在是最新版本,學會了之后,可以自己下載
mac、linux 平臺
https://openresty.org/download/openresty-1.11.2.2.tar.gz
windows平臺
https://openresty.org/download/openresty-1.11.2.2-win32.zip
關于安裝
mac、linux安裝看這里 http://openresty.org/cn/installation.html
windows 直接之后直接啟動就可以了,不用安裝
安裝完之后別著急啟動
開始寫代碼了
打開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之類的,有悟性的同學在這里已經可以做很多事情了
文章列表
