如何在 Rocky Linux 9 或 CentOS Stream 9 下编译安装 OpenResty

By | 最新修改:2025-04-08

前言

本文的目的

本文的主要目的是在 Rocky Linux 9 / CentOS Stream 9 下通过源代码编译安装 OpenResty,同时还随带着一些 Nginx 实用模块来作为动态或静态模块来安装。

什么是 OpenResty

OpenResty 集成了 Nginx 和 Lua 语言,它是名符其实的 高性能 Web 服务器软件

它能方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关, 高性能地响应后端和前端的网络请求

OpenResty 集成了大量用Lua语言编写的应用库、第三方模块以及大量的依赖项。

Nginx 与 OpenResty

Nginx 是一款高性能、易配置、占用资源少的模块化的服务器软件,并且 它既是反向代理软件,也是HTTP Web服务器软件

在平时常态的使用中, OpenResty 的基本功能与 Nginx 无异,比如可以反向代理,负载均衡、实现 Brotli 压缩等等。

并且,在一般情况下, OpenResty 和 Nginx 编译安装所须的依赖项基本一致,就连编译前的条件配置都几乎相同。

为什么要安装 OpenResty

  1. 作为 OpenResty 的基本组成元素, Nginx 是引擎般的地位。
  2. 作为服务器软件, Nginx 是部署 LNMP Web 架构的重要的其中一环,必不可少。

然而本文安装的不仅是 Nginx,而是集成了 Nginx 和 Lua 脚本语言的高性能可伸缩的 Web 平台 OpenResty。

用什么方式安装 OpenResty

本文主要介绍如何带附加模块通过源代码编译安装 OpenResty。

安装 OpenResty 需要的依赖

需要安装一些依赖软件,在 Rocky Linux 9 下它们的版本都较新,然后都可直接通过 dnf 命令来安装。这些依赖包括: OpenSSL 和 CMake。

还有些依赖通过编译安装来保证其版本足够新,比如:libwebp 和 libgd。

除此之外,还会下载一些 Nginx 附加模块的源代码(这些模块照样可在 OpenResty 上用),这些源代码会在 OpenResty 编译时作为动态模块加入,从而集成到 OpenResty 里面去。

更多关于OpenResty的消息

更多关于OpenResty的内容请查阅它的官网: https://openresty.org/

Nginx Logo


安装依赖

安装哪些依赖

Nginx 的 HTTPS 功能要求系统要安装有 OpenSSL,在这里部署的 LNMP 架构要求 WebP 的支持,而 WebP 的支持需要安装有 libwebp,
新版本的 libwebp 和 libgd 编译时要求高版本的 CMake。

接下下来是安装依赖的过程。

安装 OpenSSL 3.x 和 CMake 3.x

OpenSSL 给系统和应用软件提供 SSL/TLS 的加密功能。

CMake 是用来构建源代码的工具,一般用于与 make 等工具配合来编译源代码。

dnf install -y openssl cmake

安装 libwebp

这里要通过源代码编译安装 libwebp 库来支持 WebP。

最重要的是,WebP 是一种压缩效率高、效果好的图像格式,而且它由谷歌创建并开发, 广泛用于 Web 应用程序的图像格式

具体的编译过程请移步: Rocky Linux 9 编译安装 libWebP 库

安装 libgd

OpenResty 编译时需要 libgd 相关动态库的支持,这里通过源代码编译安装 libgd,以得到更高版本 GD库的支持。

安装过程请见: Rocky Linux 9 编译安装libgd-GD库

其他依赖

dnf groupinstall -y "Development Tools"
dnf install -y wget pcre pcre-devel \
zlib-devel gcc make unzip libxml2 \
libxml2-devel libxslt libxslt-devel \
perl-ExtUtils-Embed libuuid-devel \
redhat-rpm-config.noarch pkgconfig readline-devel \
postgresql-devel pcre2 pcre2-devel.*

下载编译 OpenResty 时所需的源代码

如果因为网络问题不能下载源码包,那么请参考本站的其他文章: 如何在境内加速 GitHub 资源的下载以及克隆

# 所有下载的文件都在此目录
cd /tmp

其他:

  1. 添加外部模块;
  2. 按需添加;

  3. 接下来要获取的资源可能会在境外,需要您自己动脑筋想办法获取,笔者就不带你在这个问题上飞了,好自为之。

用于清除和设置 HTTP 标头

cd /tmp
# 主页在:https://github.com/openresty/headers-more-nginx-module
git clone https://github.com/openresty/headers-more-nginx-module.git

使用 Memcached 保存标头和正文

  1. 用于设置一些 HTTP 标头,

  2. 同时把响应标头和响应正文保存到 Memcached

  3. 如要使用它,系统则必须先安装 Memcached

git clone https://github.com/bpaquet/ngx_http_enhanced_memcached_module.git

用于通过 HTTP 请求清除 FastCGI 等缓存内容

git clone https://github.com/nginx-modules/ngx_cache_purge.git

添加 Brotli 的支持

git clone --recursive https://github.com/google/ngx_brotli.git
# 在编译条件加上: --add-module=../ngx_brotli。

下载 OpenSSL 源码

## # 这里是3.x版本的最新稳定版
## cd /tmp
## # 当前 OpenResty 仅支持到 OpenSSL 1.1.1w
## OPENSSL_VER=1.1.1w
## # 如果前面已经升级了OpenSSL,
## # 那么就直接进行目录重命名的操作
## # https://ftp.openssl.org/source/
### https://ftp.openssl.org/source/old/1.1.1/openssl-${OPENSSL_VER}.tar.gz
## tar zxf openssl-${OPENSSL_VER}.tar.gz
## mv openssl-${OPENSSL_VER} openssl

下载 OpenResty 的源码

# 这个版本的 OpenResty 已经原生地支持 HTTP/3 了,
# 仅须在编译条件加上 --with-http_v3_module 。
# 最新版本在: https://openresty.org/cn/download.html
# Nginx 最新版: https://nginx.org//en/download.html
export OPENRESTY_VER=1.27.1.1
cat>/tmp/installer.sh<<EOF
cd /tmp

if [ ! -f "openresty-\${OPENRESTY_VER}.tar.gz" ]; then
    echo "+++++++++++++++++++++++++++++++++下载 OpenResty \${OPENRESTY_VER} 源代码:"
    URL=https://openresty.org/download/openresty-\${OPENRESTY_VER}.tar.gz
    wget --continue \$URL
    code=\$?

    count=1
    MAX_CNT=10
    while [ \$code -gt 0 ]; do
        if [ \$count -eq \$MAX_CNT ]; then
            break
        fi
        count=\$((\$count + 1))
        rm -f openresty-\${OPENRESTY_VER}.tar.gz*
        echo "+++++++++++++++++++++++++++++++++OpenResty \${OPENRESTY_VER} 下载失败!现重新下载:"
        sleep 1
        wget --continue \$URL
        code=\$?
    done

    if [ \$code -eq 0 ]; then
        echo "+++++++++++++++++++++++++++++++++OpenResty 下载成功!"
    else
        echo "+++++++++++++++++++++++++++++++++OpenResty 下载失败!"
        exit
    fi
fi

if [ -d "openresty-\${OPENRESTY_VER}" ]; then
    rm -fr openresty-\${OPENRESTY_VER}
fi

echo "+++++++++++++++++++++++++++++++++解压缩 OpenResty 源代码包:"
tar zxf openresty-\${OPENRESTY_VER}.tar.gz

if [ ! -d "openresty-\${OPENRESTY_VER}" ]; then
    echo "+++++++++++++++++++++++++++++++++OpenResty 源代码包解压失败!"
    exit
fi

## # Patch OpenSSL and OpenResty
## cd /tmp/openssl
## patch -p1 < ../openresty-\${OPENRESTY_VER}/patches/openssl-\${OPENSSL_VER}-sess_set_get_cb_yield.patch
EOF
bash /tmp/installer.sh

编译和安装 OpenResty

进行编译条件设置

cat>/tmp/installer.sh<<EOF
cd /tmp

echo "+++++++++++++++++++++++++++++++++进入目录 openresty-\${OPENRESTY_VER}:"
cd openresty-\${OPENRESTY_VER}

# OpenResty Latest version Conditions
echo "+++++++++++++++++++++++++++++++++OpenResty 编译条件配置:"

# --with-stream_quic_module
# --with-http_geoip_module
# --with-openssl=../openssl
# --add-dynamic-module=../incubator-pagespeed-ngx
# --without-http_redis2_module
./configure --prefix=/opt/openresty \
    --with-pcre-jit \
    --with-luajit \
    --with-ipv6 \
    --with-http_iconv_module \
    --with-http_postgres_module \
    --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx \
    --modules-path=/usr/lib64/nginx/modules \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --pid-path=/run/nginx.pid \
    --lock-path=/run/lock/subsys/nginx \
    --user=nginx --group=nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_v3_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_xslt_module=dynamic \
    --with-http_image_filter_module=dynamic \
    --with-http_sub_module --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_degradation_module \
    --with-http_slice_module \
    --with-http_stub_status_module \
    --with-http_perl_module=dynamic \
    --with-http_auth_request_module \
    --with-mail=dynamic \
    --with-mail_ssl_module \
    --with-stream_ssl_preread_module \
    --with-threads \
    --with-mail \
    --with-stream_realip_module \
    --with-pcre \
    --with-stream=dynamic \
    --with-stream_ssl_module \
    --add-dynamic-module=../headers-more-nginx-module \
    --add-dynamic-module=../ngx_http_enhanced_memcached_module \
    --add-dynamic-module=../ngx_cache_purge \
    --add-module=../ngx_brotli

if [ \$? -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++OpenResty 编译条件配置失败!"
    exit
else
    echo "+++++++++++++++++++++++++++++++++OpenResty 编译条件配置成功!"
fi
EOF
bash /tmp/installer.sh

如果此处以动态模块的形式编译额外的功能,那么在使用时就需要在 OpenResty 配置文件中的 http 块前面加载其动态模块库:

既然在编译OpenResty时添加了--modules-path=/usr/lib64/nginx/modules,那么,在加载动态模块时加入模块的绝对路径 load_module "/usr/lib64/nginx/modules/xxx.so";

编译和执行安装

cat>/tmp/installer.sh<<EOF
cd /tmp

echo "+++++++++++++++++++++++++++++++++进入目录 openresty-\${OPENRESTY_VER}:"
cd openresty-\${OPENRESTY_VER}

echo "+++++++++++++++++++++++++++++++++带 HTTP/3 编译 OpenResty:"
# -j2 表示一次允许两个作业同时并行操作
# -j 的取值要看机器的 CPU 有多少个核心
gmake -j2

if [ \$? -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++OpenResty 编译失败!"
    exit
else
    echo "+++++++++++++++++++++++++++++++++OpenResty 编译完成!"
fi

echo "+++++++++++++++++++++++++++++++++安装 OpenResty:"
gmake install

if [ \$? -eq 0 ]; then
    echo "+++++++++++++++++++++++++++++++++成功地安装 OpenResty!"
    echo "+++++++++++++++++++++++++++++++++删除 OpenResty 源码以及其他下载的依赖:"
    rm -rfv /tmp/openresty-\${OPENRESTY_VER}*
    rm -rfv /tmp/headers-more-nginx-module
    rm -rfv /tmp/ngx_brotli
    rm -rfv /tmp/ngx_cache_purge
    rm -rfv /tmp/ngx_http_enhanced_memcached_module
else
    echo "+++++++++++++++++++++++++++++++++OpenResty 安装失败!"
    exit
fi
EOF
bash /tmp/installer.sh

配置 OpenResty

配置运行条件

  1. 创建 OpenResty 运行用户
    useradd -M nginx -s /sbin/nologin
    
  2. 配置 OpenResty 的守护进程服务文件
    cat >/etc/systemd/system/nginx.service<<EOF
    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target
    [Service]
    Type=forking
    PidFile=/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t
    ExecStart=/usr/sbin/nginx
    ExecReload=/bin/kill -s HUP \$MAINPID
    ExecStop=/bin/kill -s QUIT \$MAINPID
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    EOF
    # 末尾的 EOF 要在行的最开始,对于这个,读者自己把它移到行的最左边。
    

创建必需的目录

touch /run/nginx.pid
chown nginx.nginx /run/nginx.pid

mkdir /var/cache/nginx/client_temp -p
chown nginx.nginx /var/cache/nginx/ -R

# 站点根目录
# 假设根目录在这儿
# Nginx默认的就是这个目录
mkdir /var/www
chown nginx.nginx -R /var/www/

mkdir -p /var/lib/php
chown nginx:nginx -R  /var/lib/php
# 以上的目录,如果 SELinux 是启用状态的话,
# 还需要设置 SELinux 上下文
# 不然会报错

对 OpenResty 配置文件进行必要的修改

在编译时已经对 OpenResty 的配置文件位置作了设定: /etc/nginx/nginx.conf

  • 打开 user 指令的注释并將值修改为 nginx
  • 打开 pid 的注释并修改为 /run/nginx.pid

  • 將域名 server_name指令的值改为绑定的域名,当前是 test.com

  • 由于现时要访问的是 OpenResty 的缺省页面,所以要把不必要的都注释掉。

运行 OpenResty

  1. 启动 OpenResty

    systemctl stop nginx
    systemctl start nginx
    systemctl status -l nginx
    
  2. 设置 OpenResty 随系统启动
    systemctl enable nginx
    

放开防火墙的端口

如果未安装或未启动 FirewallD,请执行以下命令:

dnf install -y firewalld
systemctl start firewalld
systemctl status -l firewalld
systemctl enable firewalld

“80”和“443”端口:

修改 FirewallD 的规则之前请务必关注一下 SSHD 的端口配置(/etc/ssh/sshd_config)
确保 SSHD 的端口在 FirewallD 的允许列表中
另,若是 SELinux 在开启状态,需要禁用 SELinux,或者为 SSHD 的端口设置 SELinux 规则。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
# HTTP3 用
firewall-cmd --add-port=443/udp --permanent
# 永久生效
firewall-cmd --reload
# 查看尚已开放的端口
firewall-cmd --list-all

此外,如果你的服务器所在的云平台还有防火墙,那么你也必须配置这个防火墙,让它允许通过TCP 80 和 443,以及 UDP 443 端口进来。

测试此时 OpenResty 是否支持 WebP

  1. 假设有个文件名为 test.png 的图片文件:

    把它转换为 WebP 格式

    cwebp test.png -o test.webp
    # 得到 test.webp 图片文件
    # 将它移动到 Web 根目录
    cp test.webp /var/www/
    chown nginx.nginx /var/www/test.webp
    
  2. 在本地电脑通过curl命令工具访问远程的 test.webp 文件:
    curl -I http://test.com/test.webp
    

    获得响应标头:

    HTTP/1.1 200 OK
    Server: openresty/1.19.9.1
    Date: Mon, 14 Mar 2022 16:40:32 GMT
    Content-Type: image/webp
    Content-Length: 9666
    ...
    

    标头中有“image/webp”表示 OpenResty 已经支持 WebP。


通过 yum 而非编译源代码方式来安装 OpenResty

具体请见: OpenResty – OpenResty® Linux Packages


后记

安装依赖总结

本文以尽量细致的步骤描述了 Rocky Linux 9 服务器操作系统通过源代码编译的方式安装了 OpenResty 的全过程,并安装编译过程所须的 OpenSSL、LibGD 和libwebp 等开发库。

HTTP 3

OpenResty 的最新版本已经原生地支持 HTTP/3,而 HTTP/3 要配置 SSL/TLS 证书,至于如何配置 TLS 证书,请参考其他资源。

这里推荐一个可以提供免费 SSL/TLS 证书的网站:https://freessl.cn/,此网站可以应用 acme.sh 命令自动化部署 HTTPS 证书。

支持 Brotli

此外,本文还让 OpenResty 支持了 Brotli 压缩,Brotli 是一种压缩效率高、效果好的压缩方式。

只有启用了 HTTPS 才能使用 Brotli 压缩。

结束语

本文的脚本在 Rocky Linux 9 和 CentOS Stream 9 下均测试通过,也可以说,本文的 OpenResty 编译安装过程可以在 RHEL 9 系列服务器操作系统上正确地执行。

部署 LNMP 中的 OpenResty 过程就此暂且结束,如有更新,请留意后续。

最后,感谢阅读!

欢迎访问本人的博客和关注微信公众号!


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com