• 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 = "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
  • 相关阅读:
    框架Frameset 的JS 跳转 刷新 [转]
    Javascript的变量与delete操作符
    字符串替换方法的优劣
    Nutch介绍(译)
    权限系统—数据授权模型
    Apache Synapse介绍(译)
    java动态代理
    ASM简介
    maven使用技巧——构件搜索
    springSecurity源码分析——org.springframework.security.web.FilterInvocation类
  • 原文地址:https://www.cnblogs.com/guonan/p/5481296.html
Copyright © 2020-2023  润新知