1. 程式人生 > >openresty 前端開發入門一

openresty 前端開發入門一

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開發之旅

有的人不會下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之類的,有悟性的同學在這裡已經可以做很多事情了

示例程式碼 參見demo1部分