使用场景: 客户只要通过后台绑定了自己的域名,解析到我们服务器之后。就能通过绑定的域名类型访问到相应的对应资源。实现原理是:在绑定的时候程序会将绑定域名和类型写入到redis中,并永久保存,NGINX通过lua读取redis里面的数据,指定不同的root路径。
安装
- 安装luajit
yum -y install lua lua-devel ## 编译的时候会依赖这个
cd /opt && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar zxvf LuaJIT-2.0.5.tar.gz && cd LuaJIT-2.0.5
make install PREFIX=/opt/luajit
export LUAJIT_LIB=/opt/luajit/lib ## 编译nginx需要的变量
export LUAJIT_INC=/opt/luajit/include/luajit-2.0 ## 编译nginx需要的变量
- 安装cjson库,用来解析json格式数据的
cd /opt && wget https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
tar zxvf lua-cjson-2.1.0.tar.gz && cd lua-cjson-2.1.0
##编辑Makefile修改以下几个参数
vim Makefile
PREFIX = /opt/luajit
LUA_INCLUDE_DIR = /opt/luajit/include/luajit-2.0
LUA_CMODULE_DIR = /opt/luajit/lib
LUA_MODULE_DIR = /opt/luajit/share/lua/5.1
LUA_BIN_DIR = /opt/luajit/bin
##编译并安装
make && make install
- 安装cmsgpack库,主要用来序列化和反序列化的
cd /opt && git clone https://github.com/antirez/lua-cmsgpack.git && cd /opt/lua-cmsgpack
mkdir build && cd build && cmake .. && make
- nginx编译需要的模块
cd /opt && git clone https://github.com/simplresty/ngx_devel_kit.git
cd /opt && git clone https://github.com/openresty/lua-nginx-module.git
cd /opt && git clone https://github.com/openresty/lua-resty-redis.git
- 解决一些模块和库文件依赖问题
cp /opt/lua-cmsgpack/build/cmsgpack.so /opt/luajit/lib/
cp /opt/lua-cmsgpack/build/cmsgpack.so /opt/luajit/lib/lua/5.1/
cp /opt/luajit/lib/cjson.so /opt/luajit/lib/lua/5.1/
echo "/usr/local/lib/" >> /etc/ld.so.conf.d/libc.conf
echo "/opt/luajit/lib" >> /etc/ld.so.conf.d/libc.conf
ldconfig
- 编译nginx,复制编译好的nginx二进制文件替换原来的nginx(原来的nginx二进制文件做备份)
tar zxvf nginx-1.14.0.tar.gz && cd nginx-1.14.0
./configure --add-module=/opt/lua-nginx-module --add-module=/opt/ngx_devel_kit --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_dav_module --with-http_flv_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_stub_status_module --with-http_sub_module --with-http_random_index_module --with-http_degradation_module --with-http_secure_link_module --with-http_gzip_static_module --with-http_perl_module --with-pcre --with-debug --with-file-aio --with-mail --with-mail_ssl_module --with-stream --with-ld-opt=-Wl,-E
make -j2
下面是一个示例代码
- 在nginx.conf中http下加入redis的支持: “lua_package_path “/opt/lua-resty-redis/lib/?.lua;;”;”
- lua.conf的配置文件如下:
server {
listen 80 default;
server_name _; ## 这儿做默认解析
access_log logs/lua.log;
error_log logs/lua.error.log;
index index.html;
location / {
add_header 'Access-Control-Allow-Origin' '*';
set $defaultroot /opt/web/default;
access_by_lua_file '/opt/nginx/conf/vhost/lua.lua';
root $defaultroot;
try_files $uri $uri/ /index.html;
}
- lua.lua的配置文件如下:
local redis = require "resty.redis"
local cjson = require "cjson"
local cmsgpack = require "cmsgpack"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
red:select(1)
local redisData = red:get("domain.key")
local getdata = cjson.decode(redisData);
for i,w in ipairs(getdata) do
if ngx.var.host == w.domain
then
if w.type == "app1"
then
ngx.var.defaultroot = "/opt/web/app1"
elseif w.type == "app2"
then
ngx.var.defaultroot = "/opt/web/app2"
else
ngx.var.defaultroot = "/opt/web/default"
end
end
end
red:close()
- redis中取出来的json格式如下:
[
{
"domain":"domain1_name",
"id":"123456",
"type":"app1"
},
{
"domain":"domain2_name",
"id":"123457",
"type":"app2"
},
{
"domain":"domain3_name",
"id":"123458",
"type":"app3"
}
]