Mac + nginx + lua + luasocket + cjson
1. Lua
// 官方网站 http://www.lua.org/ 下载源码包
// 由于配合 nginx 使用, 所以使用 5.1.X 版本
$ tar xvzf lua-5.1..tar.gz
$ cd lua-5.1.
$ 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..tar.gz
$ cd LuaJIT-2.0.
$ 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..tar.gz
$ cd nginx-1.9.
$ ./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 - 进程号
6. 测试一下 web 服务是否正常
// 访问 nginx 服务
$ curl -I "http://localhost:80" ------ 正常返回以下信息 ------
HTTP/1.1 OK
Server: nginx/1.9.
Date: Wed, May :: GMT
Content-Type: text/html
Content-Length:
Last-Modified: Tue, May :: GMT
Connection: keep-alive
ETag: "5731a6bf-264"
Accept-Ranges: bytes
7.创建第一个 nginx 关联 lua 程序, /lua-version
// 配置 /usr/local/nginx/conf/nginx.conf 文件
// 以下是配置的代码片段 server {
listen ;
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..tar.gz
$ luasocket-2.0.
$ 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 --------------- 安装是需要修改的地方 -----------------
.查看2个路基设置是否正确
INSTALL_TOP_SHARE=/usr/local/share/lua/5.1
INSTALL_TOP_LIB=/usr/local/lib/lua/5.1 .打开 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..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./
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:/user
user_id:
pwd:
Mac + nginx + lua + luasocket + cjson的更多相关文章
- Nginx+lua+openresty精简系列
1. CentOS系统安装openresty 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令).运行下面的 ...
- 单机闭环 使用Nginx+Lua开发高性能Web应用
[西域骆驼D1532101213]西域骆驼(VANCAMEL)D1532101213 休闲套脚鞋 卡其43[行情 报价 价格 评测]-京东 http://item.jd.com/1856564.htm ...
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- OpenResty(nginx+lua) 入门
OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...
- Nginx+Lua(OpenResty)开发高性能Web应用
使用Nginx+Lua(OpenResty)开发高性能Web应用 博客分类: 跟我学Nginx+Lua开发 架构 ngx_luaopenresty 在互联网公司,Nginx可以说是标配组件,但是主要场 ...
- nginx+lua+redis初体验
1.下载nginx.lua.redis nginx下载地址 wget http://nginx.org/download/nginx-1.8.0.tar.gz lua下载地址 wget http:/ ...
- 使用Nginx+Lua(OpenResty)开发高性能Web应用
摘自(http://jinnianshilongnian.iteye.com/blog/2280928) 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等 ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
随机推荐
- SongTaste音乐下载器
SongTaste音乐下载器 Songtaste是一个非常好的音乐推荐网站, 奈何和duomi搅合在一起, 导致下载音乐非常的麻烦, 现在写了一个简单的"下载器", 通过它可以下载 ...
- mvc日期控件datepick的几篇文章,日后再总结吧
instinctcoder里有两篇,入门级的 http://instinctcoder.com/asp-net-mvc-4-jquery-datepicker/ http://instinctcode ...
- mvc4项目数据库优先的尝试
对于mvc代码优先原则,感觉真不知道为什么硬要设计这种模式,代码优先使得每次运行程序都要重建数据库,现实中这种模式有什么用呢. 数据库优先可能有好多方式,看了好久才做出来一种比较简单的.通过先添加一个 ...
- ASP.NET WebApi 入门
今天参照微软官方(http://www.asp.net)学习了WebApi,在这里摘录如下: 前言 HTTP 不只是为了生成 web 页面.它也是一个强大的平台,可以建设公开服务和数据的 Api.HT ...
- Effective C++(12) 复制对象时要复制每一个成员
问题聚焦: 负责拷贝的两个操作:拷贝构造函数和重载赋值操作符. 一句话总结,确保被拷贝对象的所有成员变量都做一份拷贝. Demo void logCall(const std::string&am ...
- JAVA学习:异常
一.异常官方定义: 1.就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多 ...
- 《剑指Offer》面试题-重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
- WebApi HttpMsgHanler的执行顺序
原来忘记在哪个大牛的博客上看到的,说添加顺序与执行顺序是相反的,事实在下边:直接上代码: //STEP10,不论如何先记录下来请求信息 if (msgHandlerSettings.LoggingHa ...
- Swift之函数语法详解
函数 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被“调用”. Swift 统一的函数语法足够灵活,可以用来表示任何函数 ...
- 【学习笔记】锋利的jQuery(一)选择器
一.要点阐述 1,jQuery创建于2006年1月的一个开源项目,强调理念是“write less,do more”,压缩后大小30KB左右.. 2,jQuery里的方法都被设计程自动操作对象集合,而 ...