openresty 前端開發入門一

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部分

相關文章
相關標籤/搜索