前言
本文的目的
本文的主要目的是在 Rocky Linux 9 下通过源代码编译安装 OpenResty,同时还随带着一些 Nginx 实用模块来作为动态或静态模块来安装。
什么是 OpenResty
OpenResty 集成了 Nginx 和 Lua 语言,它是名符其实的 高性能 Web 服务器软件。
它能方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关, 高性能地响应后端和前端的网络请求。
OpenResty 集成了大量用Lua语言编写的应用库、第三方模块以及大量的依赖项。
Nginx 与 OpenResty
Nginx 是一款高性能、易配置、占用资源少的模块化的服务器软件,并且 它既是反向代理软件,也是HTTP Web服务器软件。
在平时常态的使用中, OpenResty 的基本功能与 Nginx 无异,比如可以实现 Brotli 压缩。
并且,在一般情况下, OpenResty 和 Nginx 编译安装所须的依赖项基本一致,就连编译前的条件配置都几乎相同。
为什么要安装 OpenResty
- 作为 OpenResty 的基本组成元素, Nginx 是引擎般的地位。
- 作为服务器软件, 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 的 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 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
- 添加外部模块
-
按需添加
-
接下来要获取的资源可能会在境外,需要您自己动脑筋想办法获取,作者就不带你在这个问题上飞了,好自为之。
用于清除和设置 HTTP 标头
# 主页在:https://github.com/openresty/headers-more-nginx-module
git clone https://github.com/openresty/headers-more-nginx-module.git
用于设置一些 HTTP 标头,
-
用于设置一些 HTTP 标头,
-
同时把响应标头和响应正文保存到 Memcached
-
如要使用它,系统则必须先安装 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 的源码
cd /tmp
OPENRESTY_VER=1.27.1.1
# 这个版本的 OpenResty 已经原生地支持 HTTP/3 了,
# 只须在编译条件加上 --with-http_v3_module 。
# 到 https://openresty.org/download/ 下载最新源代码
dnf install -y wget
wget https://openresty.org/download/openresty-${OPENRESTY_VER}.tar.gz
tar zxf openresty-${OPENRESTY_VER}.tar.gz
## # Patch OpenSSL and OpenResty
## cd /tmp/openssl
## patch -p1 < ../openresty-${OPENRESTY_VER}/patches/openssl-${OPENSSL_VER}-sess_set_get_cb_yield.patch
cd /tmp
cd openresty-${OPENRESTY_VER}
编译和安装 OpenResty
进行编译条件设置
## --with-http_geoip_module \
## --with-openssl=../openssl \
./configure --prefix=/opt/openresty \
--with-pcre-jit \
--with-ipv6 \
--without-http_redis2_module \
--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
如果此处以动态模块的形式编译额外的功能,那么在使用时就需要在 OpenResty 配置文件中的 http
块前面加载其动态模块库:
既然在编译OpenResty时添加了--modules-path=/usr/lib64/nginx/modules
,那么,在加载动态模块时加入模块的绝对路径load_module "/usr/lib64/nginx/modules/xxx.so";
编译和执行安装
- 进行编译:
gmake -j2
- 执行安装
gmake install
配置 OpenResty
配置运行条件
- 创建 OpenResty 运行用户
useradd -M nginx -s /sbin/nologin
- 配置 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/
# 以上的目录,如果 SELinux 是启用状态的话,
# 还需要设置 SELinux 上下文
# 不然会报错
对 OpenResty 配置文件进行必要的修改
在编译时已经对 OpenResty 的配置文件位置作了设定: /etc/nginx/nginx.conf
:
- 打开 user 指令的注释并將值修改为
nginx
。 -
打开 pid 的注释并修改为
/run/nginx.pid
。 -
將域名
server_name
指令的值改为绑定的域名,当前是test.com
。 -
由于现时要访问的是 OpenResty 的缺省页面,所以要把不必要的都注释掉。
运行 OpenResty
-
启动 OpenResty
systemctl stop nginx systemctl start nginx systemctl status -l nginx
- 设置 OpenResty 随系统启动
systemctl enable nginx
放开防火墙的端口
“80”和“443”端口:
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
- 假设有个文件名为
test.png
的图片文件:把它转换为 WebP 格式
cwebp test.png -o test.webp # 得到 test.webp 图片文件 # 将它移动到 Web 根目录 cp test.webp /var/www/ chown nginx.nginx /var/www/test.webp
- 在本地电脑通过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 证书,请参考本站的其他文章。
CentOS7 下 HTTPS 的配置与增强_免费HTTPS证书安装教程
支持 Brotli
此外,本文还让 OpenResty 支持了 Brotli 压缩,Brotli 是一种压缩效率高、效果好的压缩方式。
只有启用了 HTTPS 才能使用 Brotli 压缩。
结束语
部署 LNMP 中的 OpenResty 过程就此暂行结束,如有更新,请留意后续。
最后,感谢阅读!
欢迎访问本人的博客和关注微信公众号!
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com