# 安装 OpenResty

# 1. 安装

首先你的 Linux 虚拟机必须联网

# 1)安装开发库

首先要安装 OpenResty 的依赖开发库,执行命令:

yum install -y pcre-devel openssl-devel gcc --skip-broken

# 2)安装 OpenResty 仓库

你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update 命令)。运行下面的命令就可以添加我们的仓库:

yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

如果提示说命令不存在,则运行:

yum install -y yum-utils 

然后再重复上面的命令

# 3)安装 OpenResty

然后就可以像下面这样安装软件包,比如 openresty

yum install -y openresty

# 4)安装 opm 工具

opm 是 OpenResty 的一个管理工具,可以帮助我们安装一个第三方的 Lua 模块。

如果你想安装命令行工具 opm ,那么可以像下面这样安装 openresty-opm 包:

yum install -y openresty-opm

# 5)目录结构

默认情况下,OpenResty 安装的目录是:/usr/local/openresty

image-20200310225539214

看到里面的 nginx 目录了吗,OpenResty 就是在 Nginx 基础上集成了一些 Lua 模块。

# 6)配置 nginx 的环境变量

打开配置文件:

vi /etc/profile

在最下面加入两行:

export NGINX_HOME=/usr/local/openresty/nginx
export PATH=${NGINX_HOME}/sbin:$PATH

NGINX_HOME:后面是 OpenResty 安装目录下的 nginx 的目录

然后让配置生效:

source /etc/profile

# 2. 启动和运行

OpenResty 底层是基于 Nginx 的,查看 OpenResty 目录的 nginx 目录,结构与 windows 中安装的 nginx 基本一致:

image-20210811100653291

所以运行方式与 nginx 基本一致:

# 启动 nginx
nginx
# 重新加载配置
nginx -s reload
# 停止
nginx -s stop

nginx 的默认配置文件注释太多,影响后续我们的编辑,这里将 nginx.conf 中的注释部分删除,保留有效部分。

修改 /usr/local/openresty/nginx/conf/nginx.conf 文件,内容如下:

#user  nobody;
worker_processes  1;
error_log  logs/error.log;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       8081;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在 Linux 的控制台输入命令以启动 nginx:

nginx

然后访问页面:http://192.168.150.101:8081,注意 ip 地址替换为你自己的虚拟机 IP:

image-20231020091008283

# 3. 备注

加载 OpenResty 的 lua 模块:

#lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
#c 模块     
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

监听浏览器请求

server {
        listen       8081;
        server_name  localhost;
        location /api/item {
          # 默认的响应类型
          default_type application/json;
          # 响应结果由 lua/item.lua 下的文件决定
          content_by_lua_file lua/item.lua;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

common.lua

-- 封装函数,发送 http 请求,并解析响应
local function read_http(path, params)
    local resp = ngx.location.capture(path,{
        method = ngx.HTTP_GET,
        args = params,
    })
    if not resp then
        -- 记录错误信息,返回 404
        ngx.log(ngx.ERR, "http not found, path: ", path , ", args: ", args)
        ngx.exit(404)
    end
    return resp.body
end
-- 将方法导出
local _M = {  
    read_http = read_http
}  
return _M

释放 Redis 连接 API:

-- 关闭 redis 连接的工具方法,其实是放入连接池
local function close_redis(red)
    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.log(ngx.ERR, "放入redis连接池失败: ", err)
    end
end

读取 Redis 数据的 API:

-- 查询 redis 的方法 ip 和 port 是 redis 地址,key 是查询的 key
local function read_redis(ip, port, key)
    -- 获取一个连接
    local ok, err = red:connect(ip, port)
    if not ok then
        ngx.log(ngx.ERR, "连接redis失败 : ", err)
        return nil
    end
    -- 查询 redis
    local resp, err = red:get(key)
    -- 查询失败处理
    if not resp then
        ngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)
    end
    -- 得到的数据为空处理
    if resp == ngx.null then
        resp = nil
        ngx.log(ngx.ERR, "查询Redis数据为空, key = ", key)
    end
    close_redis(red)
    return resp
end

开启共享词典:

# 共享字典,也就是本地缓存,名称叫做:item_cache,大小 150m
lua_shared_dict item_cache 150m;