编译docker版openresty

发布于:2025-05-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、编译

使用alpine为基础镜像

# 使用Alpine作为基础镜像
FROM alpine:3.18

# 替换为阿里云镜像源,并安装必要的依赖
RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories && \
    apk add --no-cache \
    build-base \
    pcre-dev \
    openssl-dev \
    zlib-dev \
    perl \
    linux-headers \
    && mkdir -p /usr/local/openresty

# 下载OpenResty源码包
WORKDIR /tmp
RUN wget https://openresty.org/download/openresty-1.21.4.1.tar.gz && \
    tar zxpf openresty-1.21.4.1.tar.gz

# 编译并安装OpenResty
WORKDIR /tmp/openresty-1.21.4.1
RUN ./configure --prefix=/usr/local/openresty \
                --with-pcre-jit \
                --with-http_ssl_module \
                --with-http_v2_module \
                --with-http_realip_module \
                --with-http_stub_status_module \
                -j2 && \
    make && \
    make install

# 清理无用文件
RUN rm -rf /tmp/openresty-1.21.4.1*

# 设置工作目录
WORKDIR /usr/local/openresty

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["/usr/local/openresty/nginx/sbin/nginx", "-g", "daemon off;"]

二、优化编译大小

上面编译完457M,多阶段构建可以缩减至25.7M

# stage 1: 构建阶段
FROM alpine:3.21.3 AS builder
 
ARG OPENRESTY_VERSION=1.27.1.2
 
# 替换为阿里云源并安装构建依赖
RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories && \
    apk add --no-cache \
    build-base \
    pcre-dev \
    openssl-dev \
    zlib-dev \
    perl \
    linux-headers
 
# 下载并解压 OpenResty 源码
WORKDIR /tmp
RUN wget https://openresty.org/download/openresty-${OPENRESTY_VERSION}.tar.gz && \
    tar zxpf openresty-${OPENRESTY_VERSION}.tar.gz
 
# 编译安装 OpenResty
WORKDIR /tmp/openresty-${OPENRESTY_VERSION}
RUN ./configure --prefix=/usr/local/openresty \
                --with-pcre-jit \
                --with-http_ssl_module \
                --with-http_v2_module \
                --with-http_realip_module \
                --with-http_stub_status_module \
                -j2 && \
    make && \
    make install
 
# 剥离可执行文件
RUN strip /usr/local/openresty/nginx/sbin/nginx
 
# stage 2: 最终运行环境
FROM alpine:3.21.3
 
# 安装运行时依赖
 
# 安装运行时依赖与时区支持
RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories && \
    apk add --no-cache \
    libgcc \
    pcre \
    openssl \
    zlib \
    tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
 
# 复制编译好的 OpenResty 文件
COPY --from=builder /usr/local/openresty /usr/local/openresty
 
# 设置工作目录
WORKDIR /usr/local/openresty
 
# 暴露端口
EXPOSE 80
 
# 启动命令
CMD ["/usr/local/openresty/nginx/sbin/nginx", "-g", "daemon off;"]

三、编译arm版

编译arm版docker(10代i74c4g编译1小时)

需要安装dockerbuildx

docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=uhub.service.ucloud.cn/iatc/cn-buildkit:latest
docker buildx use mybuilder-cn
docker buildx build --platform linux/arm/v7 -t openresty-arm:latest . --load
docker buildx rm mybuilder-cn

在x86机器上运行armv7版

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run -it --platform=linux/arm/v7 openresty-arm:latest

docker版的helloworld

docker exec -it openresty sh
cd /usr/local/openresty/nginx/conf
#编辑nginx.conf 将location/内容替换为
        location / {
            default_type text/plain;
            content_by_lua_block {
                ngx.say("Hello World")
            }
        }
#然后保存
#最后重载配置
/usr/local/openresty/nginx/sbin/nginx -s reload

四、常见使用场景

1. API 网关


OpenResty 作为轻量级、高性能的 API 网关,广泛用于微服务架构中实现路由、鉴权、限流等功能。
✅ 开源项目举例:
Kong
基于 OpenResty 构建的企业级 API 网关;
支持插件化扩展(如 JWT 鉴权、IP 限流、OAuth2);
提供管理界面和集群支持。
Orange
国内开源的类 Kong 网关系统;
支持动态路由、熔断、监控等功能;
提供 Web UI 进行配置管理。
 

2. Web 防火墙(WAF)


利用 Lua 脚本编写规则,实现对请求内容的深度检测和过滤,防御 SQL 注入、XSS 等攻击。
✅ 开源项目举例:
ngx_lua_waf
简洁高效的 WAF 实现;
支持 URL、User-Agent、Referer 等维度过滤;
可嵌入到任意基于 OpenResty 的应用中。
ModSecurity for Nginx(非纯 Lua 实现但常与 OpenResty 搭配使用)
企业级 Web 应用防火墙;
支持 OWASP CRS 规则集;
可配合 OpenResty 实现更完整的安全防护体系。
 

3. 反向代理与负载均衡


OpenResty 继承了 Nginx 强大的反向代理能力,并通过 Lua 实现更灵活的调度逻辑。
✅ 开源项目举例:
OpenResty Edge
官方商业产品,但也提供部分开源组件;
支持灰度发布、A/B 测试、动态负载均衡等高级功能;
适用于 CDN、边缘计算等场景。
apisix
Apache 顶级项目;
基于 OpenResty 实现,具备动态路由、负载均衡、健康检查等功能;
插件丰富,社区活跃,适合中小型企业部署网关服务。
 

4. 缓存层


在边缘层实现响应缓存,提升整体系统的性能和吞吐能力。
✅ 开源项目举例:
lua-resty-http + 自定义缓存逻辑
利用 lua-resty-http 请求后端服务;
结合 ngx.shared.DICT 实现本地内存缓存;
可构建一个轻量级的 HTTP 缓存中间件。
fastcgi-cache-purge(虽然不是 Lua 实现,但常结合 OpenResty 使用)
实现 FastCGI 缓存清除;
配合 OpenResty 的缓存模块实现高效边缘缓存控制。
 

5. 实时服务(长连接、WebSocket)


利用 OpenResty 的异步非阻塞特性,实现 WebSocket、SSE、长轮询等实时通信。
✅ 开源项目举例:
resty.websocket
官方提供的 WebSocket 模块;
支持客户端和服务端双向通信;
可用于聊天、推送、在线游戏等实时服务。
goim(虽为 Go 实现,但常搭配 OpenResty 使用)
高性能 IM 推送系统;
OpenResty 可作为接入层处理 WebSocket 连接;
后端由 goim 处理消息分发,形成完整实时通信链路。
 

6. 认证授权中心


在边缘层统一处理身份验证逻辑,如 OAuth2、JWT、API Key 等。
✅ 开源项目举例:
apisix + JWT/OAuth 插件
Apisix 提供多种鉴权插件(JWT、Key Auth、OAuth2);
所有鉴权逻辑运行在 OpenResty 上,性能优异;
可快速搭建统一的认证授权网关。
auth-jwt(小型开源项目)
基于 OpenResty 实现的 JWT 认证中间件;
可集成到现有服务前做统一身份校验;
适合小型服务或边缘网关场景。
 

7. 日志与监控采集


在边缘层采集访问日志、指标数据,用于后续分析、告警、追踪。
✅ 开源项目举例:
loggly-openresty
将访问日志发送到 Loggly 平台;
利用 Lua 协程异步发送日志,不影响主流程;
可拓展对接 ELK、Prometheus 等系统。
nginx-lua-prometheus
Prometheus 官方推荐的指标暴露库;
支持记录 QPS、延迟、状态码等指标;
可直接通过 /metrics 接口被 Prometheus 抓取。