CentOS 安装OpenResty(Nginx+Lua)开发环境搭建及Lua从动态渲染网页模板及从Redis获取数据

编写日期:2018-03-05

编写作者:mtsbv110

邮    箱:[email protected]

 

主机规划:192.168.9.131

ngx_openresty版本

ngx_openresty-1.7.7.2.tar.gz

安装目录

/usr/local/servers  

ngx_cache_purge

2.3.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

nginx_upstream_check_module

v0.3.0.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

http_headers.lua

http_headers.lua

安装目录

/usr/local/applications/hello/lualib/resty

http.lua

http.lua

安装目录

/usr/local/applications/hello/lualib/resty

template.lua

template.lua

安装目录

/usr/local/applications/hello/lualib/resty

html.lua

html.lua

安装目录

/usr/local/applications/hello/lualib/resty

 

主机规划:192.168.9.132

ngx_openresty版本

ngx_openresty-1.7.7.2.tar.gz

安装目录

/usr/local/servers  

ngx_cache_purge

2.3.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

nginx_upstream_check_module

v0.3.0.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

http_headers.lua

http_headers.lua

安装目录

/usr/local/applications/hello/lualib/resty

http.lua

http.lua

安装目录

/usr/local/applications/hello/lualib/resty

template.lua

template.lua

安装目录

/usr/local/applications/hello/lualib/resty

html.lua

html.lua

安装目录

/usr/local/applications/hello/lualib/resty

 

主机规划:192.168.9.133

ngx_openresty版本

ngx_openresty-1.7.7.2.tar.gz

安装目录

/usr/local/servers  

ngx_cache_purge

2.3.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

nginx_upstream_check_module

v0.3.0.tar.gz

安装目录

/usr/local/servers/ngx_openresty-1.7.7.2/bundle

http_headers.lua

http_headers.lua

安装目录

/usr/local/applications/hello/lualib/resty

http.lua

http.lua

安装目录

/usr/local/applications/hello/lualib/resty

 

 

一、部署应用层openresty(192.168.9.131)

 

yum install -y gcc gcc-c++ make auotmake autoconf libtool readline-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel

 

目录规划

[root@jetsen-zk-01 ~]# mkdir -p /usr/local/servers

上传ngx_openresty-1.7.7.2.tar.gz解压/usr/local/servers

[root@jetsen-zk-01 ngx_openresty-1.7.7.2]# pwd

/usr/local/servers/ngx_openresty-1.7.7.2

[root@jetsen-zk-01 ngx_openresty-1.7.7.2]# cd bundle/LuaJIT-2.1-20150120/

[root@jetsen-zk-01 LuaJIT-2.1-20150120]# make clean && make && make install 

[root@jetsen-zk-01 LuaJIT-2.1-20150120]#

 ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit

 

cd bundle  

[root@jetsen-zk-01 bundle]#

 wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz

[root@jetsen-zk-01 bundle]# tar -zxvf 2.3.tar.gz

 

cd bundle  

[root@jetsen-zk-01 bundle]#

 wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz

[root@jetsen-zk-01 bundle]# tar -zxvf v0.3.0.tar.gz

 

[root@jetsen-zk-01 bundle]# cd /usr/local/servers/ngx_openresty-1.7.7.2  

[root@jetsen-zk-01 ngx_openresty-1.7.7.2]# ./configure --prefix=/usr/local/servers --with-http_realip_module  --with-pcre  --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2

 

[root@jetsen-zk-01 ngx_openresty-1.7.7.2]# make && make install

 

[root@jetsen-zk-01 servers]# cd /usr/local/servers/

[root@jetsen-zk-01 servers]# /usr/local/servers/nginx/sbin/nginx -V

二、nginx+lua开发的hello world

在http部分添加:

 lua_package_path "/usr/local/servers/lualib/?.lua;;";

 lua_package_cpath "/usr/local/servers/lualib/?.so;;";

在/usr/local/servers/nginx/conf下,创建一个lua.conf

[root@jetsen-zk-01 conf]# vi lua.conf

server {

    listen       80;

    server_name  _;

 

    location /lua {

      default_type 'text/html';

      #content_by_lua 'ngx.say("hello world")';

      content_by_lua_file conf/lua/test.lua;

    }

 

}

在nginx.conf的http部分添加:

include lua.conf;

/usr/servers/nginx/sbin/nginx -t  

 

重新nginx加载配置

/usr/servers/nginx/sbin/nginx -s reload

 

创建lua目录 /usr/local/server/nginx/conf/lua

创建test.lua文件

ngx.say("hello world");

 

重新nginx加载配置

 

/usr/servers/nginx/sbin/nginx -s reload  

http://192.168.9.131/lua

 

  1. 工程化的nginx+lua项目结构

hello

    hello.conf     

    lua              

      hello.lua

    lualib            

      *.lua

      *.so

 

放在/usr/local/application/hello目录下

[root@jetsen-zk-01 local]# mkdir -p /usr/local/applications/hello

[root@jetsen-zk-01 local]# mkdir -p /usr/local/applications/hello/lua

分别在对应的目录中创建对应的hello.conf和hello.lua

[root@jetsen-zk-01 hello]# cat hello.conf

server {  

    listen       80;  

    server_name  _;  

  

    location /hello {  

        default_type 'text/html';  

        #lua_code_cache off;  

        content_by_lua_file /usr/local/applications/hello/lua/hello.lua;  

    }  

}

 

 

[root@jetsen-zk-01 hello]# cat lua/hello.lua

ngx.say("hello world");

 

将lualib 文件夹从/usr/local/servers拷贝到对应的应用程序目录中

[root@jetsen-zk-01 hello]# cp -r /usr/local/servers/lualib/ /usr/local/applications/hello/      

修改nginx.conf配置文件

 

http {

    lua_package_path "/usr/local/applications/hello/lualib/?.lua;;";

    lua_package_cpath "/usr/local/applications/hello/lualib/?.so;;";

    include /usr/local/applications/hello/hello.conf;

 

          

在另外一个机器上,也用OpenResty部署一个nginx

三、配置流量分发Nginx(192.168.9.153)

 

[root@jetsen-zk-03 lualib]# cd /usr/local/applications/hello/lualib

一个流量分发的nginx,会发送http请求到后端的应用nginx上面去,所以要先引入lua http lib包

[root@jetsen-zk-03 lualib]# cd resty/

[root@jetsen-zk-03 resty]#

 wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua

 

[root@jetsen-zk-03 resty]#

 wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua

CentOS 安装OpenResty(Nginx+Lua)开发环境搭建及Lua从动态渲染网页模板及从Redis获取数据_第1张图片

local uri_args = ngx.req.get_uri_args()

local productId = uri_args["productId"]

 

local hosts = {"192.168.9.131", "192.168.9.132"}

local hash = ngx.crc32_long(productId)

local index = (hash % 2) + 1

backend = "http://"..hosts[index]

 

local requestPath = uri_args["requestPath"]

requestPath = "/"..requestPath.."?productId="..productId

 

local http = require("resty.http")

local httpc = http.new()

 

local resp, err = httpc:request_uri(backend,{

  method = "GET",

  path = requestPath

})

 

if not resp then

  ngx.say("request error: ", err)

  return

end

 

ngx.say(resp.body)

 

httpc:close()

 

http://192.168.9.133/hello?requestPath=hello&productId=0(1,2,3,4,5,6……)

 

四、Nginx最终利用LUA动态渲染网页模板

应用Nginx(192.168.9.131,192.168.9.132)添加Http依赖

[root@jetsen-zk-01(02) resty]#

 

 cd /usr/local/applications/hello/lualib/resty

wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua  

wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua

 

安装模板依赖组件

wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template.lua

wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template/html.lua

 

配置模板的位置

在hello.conf的server中配置模板位置

 

set $template_location "/templates";  

set $template_root "/usr/local/applications/hello/templates

 

vi product.html

product id: {* productId *}

product name: {* productName *}

product picture list: {* productPictureList *}

product specification: {* productSpecification *}

product service: {* productService *}

product color: {* productColor *}

product size: {* productSize *}

shop id: {* shopId *}

shop name: {* shopName *}

shop level: {* shopLevel *}

shop good cooment rate: {* shopGoodCommentRate *}

 

 

 

nginx.conf中:

lua_shared_dict my_cache 128m;

CentOS 安装OpenResty(Nginx+Lua)开发环境搭建及Lua从动态渲染网页模板及从Redis获取数据_第2张图片

http://192.168.9.133/product?requestPath=product&productId=1&shopId=1

192.168.9.140

/usr/local/applications/distribution

CentOS 安装OpenResty(Nginx+Lua)开发环境搭建及Lua从动态渲染网页模板及从Redis获取数据_第3张图片

/usr/local/applications/distribution/lua

local cjson = require("cjson")

local redis = require("resty.redis")

local http = require("resty.http")

 

local function close_redis(red)

        if not red then

                return

        end

        local pool_max_idle_time = 10000

        local pool_size = 100

        local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)

        if not ok then

                ngx.say("set keepalive error : ", err)

        end

end

 

local cache_ngx = ngx.shared.my_cache

local uri_args = ngx.req.get_uri_args()

local areaCode = uri_args["areaCode"]

 

 

 

local subjectAreaCodeNginxCacheKey = "subject_nginx_cache_areaCode"..areaCode

local subjectAreaCodeNginxCache = cache_ngx:get(subjectAreaCodeCacheKey)

 

if subjectAreaCodeNginxCache == "" or subjectAreaCodeNginxCache == nil then

--if subjectAreaCodeNginxCache ~= "" or subjectAreaCodeNginxCache ~= nil then

  local red = redis:new()

  red:set_timeout(1000)

  local ip = "192.168.9.140"

  local port = 1112

  local ok, err = red:connect(ip, port)

  if not ok then

    ngx.say("connect to redis error : ", err)

    return close_redis(red)

  end

 

  --local redisResp, redisErr = red:get("k1")

  local redisResp, redisErr = red:get("subject_redis_info_areacode_"..areaCode)

 

  if redisResp == ngx.null then

      local httpc = http.new()

      local resp, err = httpc:request_uri("http://39.105.18.180:9026",{

      method = "GET",

      path = "/jeuc/Api/SubjectInfo/getSubjectNameBySubStages?clientId=84&clientSecret=ab49b91ffec3d3a35a693f76cb122fee&subStages=%E9%AB%98%E4%B8%80&areaCode="..areaCode

    })

    --ngx.say("get redis lua  context : ", resp.body)

    subjectAreaCodeNginxCache = resp.body

    redisResp = resp.body

  end

 

  subjectAreaCodeNginxCache = redisResp

 

  math.randomseed(tostring(os.time()):reverse():sub(1, 7))

  local expireTime = math.random(600, 1200)

 

  cache_ngx:set(subjectAreaCodeNginxCacheKey, subjectAreaCodeNginxCache, expireTime)

end

 

ngx.say("get redis lua  context : ", subjectAreaCodeNginxCache)

 

 

 

--[[ngx.say("connect to redis error : ", areaCode)]]--

 

 

 

你可能感兴趣的:(LUA)