# 安装 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

看到里面的 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 基本一致:

所以运行方式与 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:

# 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; | 
