1. Lua
// 官方網站 http://www.lua.org/ 下載源碼包
// 由於配合 nginx 使用, 所以使用 5.1.X 版本
$ tar xvzf lua-5.1.5.tar.gz $ cd lua-5.1.5 $ make macosx $ sudo make install // 一定要 sudo
------- 下面是安裝輸出信息 ------
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib \
/usr/local/man/man1 /usr/local/share/lua/5.1 /usr/local/lib/lua/5.1
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h \
../etc/lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1
// 以上就完成了Lua的安裝, 一般情況下安裝過程不會報錯
// 如果報錯需要根據報錯信息檢查是否缺少環境依賴
------- 測試一下 ----
$ lua
lua > print("hello, lua")
// 退出 control + d
2. luaJIT
// LuaJIT是一個利用JIT編譯技術把Lua腳本直接編譯成機器碼由CPU運行 // 官方網站 http://luajit.org/download
// 版本 2.0 為穩定版 $ tar xzvf LuaJIT-2.0.2.tar.gz $ cd LuaJIT-2.0.2 $ make $ sudo make install -------- 特別注意 --------- // 聲明環境變量, 目的是編譯Nginx源碼時, 告訴Nginx去哪里找luajit, 具體路徑可能不同
// 默認安裝路徑都在 /usr/local 下
$ export LUAJIT_LIB=/usr/local/lib $ export LUAJIT_INC=/usr/local/include/luajit-2.0
3. ngx_devel_kit 和 lua-nginx-module
// 直接去 github 下載 zip文件 解壓即可 $ tar xvf ngx_devel_kit-master.zip $ tar xvf lua-nginx-module-master.zip // 在之后編輯 nginx 源碼時, 需要關聯這兩個文件夾
4. nginx
// 官方網站 http://nginx.org/download/
// 如果 ./configure 出錯, 一般提示 pcre not found,跳至第9步
$ tar xvf nginx-1.9.15.tar.gz $ cd nginx-1.9.15 $ ./configure --prefix=/usr/local/nginx --add-module=/絕對路徑/ngx_devel_kit-master/ --add-module=/絕對路徑/lua-nginx-module-master/ $ make $ make install
5. ngnix 的一些操作
// 啟動 nginx $ sudo /usr/local/nginx/sbin/nginx // 重新加載 nginx $ sudo /usr/local/nginx/sbin/nginx -s reload // 檢查 nginx 配置文件是否有錯 $ sudo /usr/local/nginx/sbin/nginx -t // 查詢 nginx 的工作進程號 $ ps -ef | grep nginx // 強行停止, 可能會有2個進程號, 同時kill掉 $ sudo kill -9 進程號
6. 測試一下 web 服務是否正常
// 訪問 nginx 服務 $ curl -I "http://localhost:80" ------ 正常返回以下信息 ------ HTTP/1.1 200 OK Server: nginx/1.9.15 Date: Wed, 11 May 2016 03:46:57 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 10 May 2016 09:15:43 GMT Connection: keep-alive ETag: "5731a6bf-264" Accept-Ranges: bytes
7.創建第一個 nginx 關聯 lua 程序, /lua-version
// 配置 /usr/local/nginx/conf/nginx.conf 文件 // 以下是配置的代碼片段 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /lua-version { content_by_lua ' if jit then ngx.say(jit.version) else ngx.say(_VERSION) end '; }
location /user-aciton { // 導入 lua腳本 的方式
default_type 'text/plain';
content_by_lua_file /Users/admin/Developer/workspace/lua/post_user_action.lua;
}
}
// 訪問 /lua-version
$ curl "http://localhost:80/lua-version"
-------- 返回結果 -----
LuaJIT 2.0.4
8. LuaSocket
// 官方網站 http://luaforge.net/projects/luasocket/ $ tar -zxvf ./luasocket-2.0.2.tar.gz $ luasocket-2.0.2 $ make $ make install --------------- 安裝好之后的環境變量設置 ------------------ // 由於 LuaSocket 模塊文件的存放位置不在系統模塊加載路徑范圍內 // 因此需要修改 Lua 的環境變量 LUA_PATH 和 LUA_CPATH // 來把 LuaSocket 的位置目錄添加到系統模塊的加載路徑上 $ cd $ vi .profile $ export LUA_PATH=/usr/local/share/lua/5.1/?.lua\;?.lua $ export LUA_CPATH=/usr/local/lib/lua/5.1/?.so\;?.so --------------- 安裝是需要修改的地方 ----------------- 1.查看2個路基設置是否正確 INSTALL_TOP_SHARE=/usr/local/share/lua/5.1 INSTALL_TOP_LIB=/usr/local/lib/lua/5.1 2.打開 MacOS X 編譯的注解 #------ # Compiler and linker settings # for Mac OS X # CC=gcc DEF= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN CFLAGS= $(LUAINC) -I$(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common LDFLAGS=-bundle -undefined dynamic_lookup LD=export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc 關閉默認的 Linux 編譯注解
9. PCRE
// 在編譯 nginx、LuaSocket 時, 系統可能提示無法找到 pcre 的錯誤 // 只要安裝即可 // 官方網站 http://www.pcre.org $ tar xvzf pcre-8.13.tar.gz $ cd pcre-8.13 $ ./configure $ make $ sudo make install
10. cjson
// 支持UTF-8,不支持UTF-16和UTF-32。 #沒有任何影響。 // 支持Lua-5.1、Lua-5.2、LuaJIT $ tar -zvxf lua-cjson-2.1.0.tar.gz $ make $ sudo make install // 將生成的cjson.so文件拷貝到/usr/local/lib/lua/5.1下 $ cp cjson.so /usr/local/lib/lua/5.1/ -------- make之前, 修改 Makefile 文件 ----- ##### Build defaults ##### LUA_VERSION = 5.1 TARGET = cjson.so PREFIX = /usr/local #CFLAGS = -g -Wall -pedantic -fno-inline CFLAGS = -O3 -Wall -pedantic -DNDEBUG CJSON_CFLAGS = -fpic #CJSON_LDFLAGS = -shared CJSON_LDFLAGS = -bundle -undefined dynamic_lookup #LUA_INCLUDE_DIR = $(PREFIX)/include LUA_INCLUDE_DIR = $(PREFIX)/include/include/luajit-2.0/ #LUA_CMODULE_DIR = $(PREFIX)/lib/lua/$(LUA_VERSION) LUA_CMODULE_DIR = $(PREFIX)/lib #LUA_MODULE_DIR = $(PREFIX)/share/lua/$(LUA_VERSION) LUA_MODULE_DIR = $(PREFIX)/share/luajit-2.0.4/ LUA_BIN_DIR = $(PREFIX)/bin
LuaSocket http 請求示例
local http=require("socket.http"); local ltn12 = require("ltn12"); module = {} function module.postHttp( targerUrl, tableName, tableContent ) local response_body = {}; local params = "appid=553519&table_name="..tableName.."&table_content="..tableContent ngx.say("params: "..params); res, code, response_headers = http.request { url = targerUrl, method = "POST", headers = { ["Content-Type"] = "application/x-www-form-urlencoded", ["Content-Length"] = string.len(params) }, source = ltn12.source.string(params), sink = ltn12.sink.table(response_body) } return response_body; end function module.getHttp( targerUrl ) local response_body = {}; local res, code = http.request({ url = targerUrl, sink = ltn12.sink.table(response_body) }) return response_body; end return module; --------- 打印 response_body 的方法 --------- local re = table.concat(response_body);
Lua + web 腳本示例, 接收 GET 參數
local request_method = ngx.var.request_method -- 定義頭 ngx.header.content_type = "application/json"; -- 接收穿過來的參數 local args = nil if "GET" == request_method then args = ngx.req.get_uri_args(); end local video_id = nil; local num = nil; if args ~= nil and args["user_id"] ~= nil and args["pwd"] ~= nil then video_id = tonumber(args["user_id"]); num = tonumber(args["pwd"]); else ngx.log(ngx.INFO, "提示: ", "params參數有nil值, 參數錯誤"); end
-------- GET 訪問方法 --------
http://localhost:80/user?user_id=123&pwd=999
Lua + web 腳本示例, 接收 POST 參數
local request_method = ngx.var.request_method ngx.header.content_type = "application/json"; if "POST" == request_method then ngx.req.read_body() args = ngx.req.get_post_args() end if args ~= nil and args["user_id"] ~= nil and args["pwd"] ~= nil then user_id = args["user_id"]; video_id = args["pwd"]; else --ngx.say("參數傳入錯誤"); ngx.log(ngx.INFO, "提示: ", "params參數有nil值, 參數錯誤"); end -------- POST 訪問方法 -------- http://localhost:80/user user_id:123 pwd:999