安装
version: "3"
services:nginx_lua:image: openresty/openresty:alpine#image: openresty/openresty:latest #没有安装opm
以下命令可以在Dockerfile编写, 前缀以RUN补充,使其创建新的镜像
或者在运行后,进容器后直接运行
安装opm
curl -L -o /usr/local/bin/opm https://raw.githubusercontent.com/openresty/opm/master/opm && chmod +x /usr/local/bin/opm
安装基础工具,以避免以下面的报错
apk add --no-cache bash perl curl
#openresty:alpine版本的包管理工具apk,如使用latest,包管理工具是apt
报错1:
$ opm -h
can’t execute ‘perl’: No such file or directory
报错2:
ERROR: failed to find package: server error: sh: curl: not found
通过opm去查找依赖库
7793bfb21d5b:/# opm search base64
openresty/lua-resty-core New FFI-based Lua API for the ngx_lua module
bungle/lua-resty-nettle Nettle (a low-level cryptographic library) Bindings for LuaJIT FFI
bungle/lua-resty-session Session Library for OpenResty - Flexible and Secure
jprjr/luasodium An FFI binding to libsodium.
GUI/lua-resty-txid Generate sortable, unique transaction or request IDs.
xiaocang/lua-resty-openssl FFI-based OpenSSL binding for LuaJIT
fffonion/lua-resty-openssl FFI-based OpenSSL binding for LuaJIT
fffonion/lua-resty-acme Automatic Let's Encrypt certificate serving and Lua implementation of ACME procotol
hamishforbes/lua-resty-consul Library to interface with the consul HTTP API
lilien1010/lua-resty-s3uploader an http s3 client for openresty
duhoobo/lua-resty-smtp A http to smtp bridge library for the ngx_lua module
安装时,需要加上account name
7793bfb21d5b:/# opm install lua-resty-random
ERROR: package name lua-resty-random is not prefixed by an account name.
nginx里使用lua
- 正常的响应: ngx.say(“Hello, OpenResty!”)
- 重定向: ngx.redirect(long_url, ngx.HTTP_MOVED_PERMANENTLY)
- 生成随机数:
local random_bytes = {}for i = 1, 6 dotable.insert(random_bytes, string.char(math.random(0, 255)))endrandom_bytes = table.concat(random_bytes)
- Base64编码: ngx.encode_base64(random_bytes)
- 截取前5个字符: string.sub(encoded_bytes, 1, 5)
- table将k-v加入res对象: table.insert(result, key … ", " … value)
- table合并为字符串: table.concat(result, “\n”)
redis相关操作
- 引入redis
local redis = require("resty.redis")local red = redis:new()
- 连接redis
red:connect("192.168.0.xx", 6379)
- redis写入,并设置key7天过期
local saved, err = red:setex(key, 604800, long_url)
- redis读取
local long_url, err = red:get("code:" .. code)
- 关闭Redis连接
local ok, err = red:set_keepalive(10000, 100)
server {listen 80;server_name 0.0.0.0;location / {default_type text/html;content_by_lua_block {ngx.say("Hello, OpenResty!")}}location /s/ {# 使用Lua模块content_by_lua_block {-- 执行重定向return ngx.redirect("http://example.com", ngx.HTTP_MOVED_PERMANENTLY)}}location /s/create {# 使用Lua模块content_by_lua_block {local redis = require("resty.redis")local red = redis:new()-- 连接到Redis服务器local ok, err = red:connect("192.168.0.xx", 6379)if not ok thenngx.log(ngx.ERR, "Failed to connect to Redis: ", err)return ngx.exit(500)end# ok = 1ngx.log(ngx.INFO, "connect to Redis: ", ok)ngx.say("Hello, OpenResty!")}}}