Mac + nginx + lua + luasocket + cjson

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 = "app..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