引言
虽然网上有很多关于 Nginx 编译安装的文章,但涉及如何打造一个高性能、稳定可靠、实用性强的 Nginx 的文章却相对稀缺。因此,我想借此分享如何打造一个能抗能打的nginx。
背景
Nginx是一款高性能的HTTP和反向代理服务器,它的模块化设计使其功能可以通过插件进行扩展。本文将详细介绍如何编译安装Nginx,并集成Lua模块及其他比较实用的第三方插件,构建一个功能强大的Nginx服务器,满足日常业务需求。接下来,让我们一起来了解Nginx的实用模块有哪些?如何一键快速编译部署吧。
软件版本
Nginx 1.20.2
Centos 7.9
下载Nginx和模块源码
首先,下载Nginx的源码包以及需要集成的第三方模块源码,放置在同一个目录下。
# 下载nginx
wget http://nginx.org/download/nginx-1.20.2.tar.gz
# 下载LuaJIT
wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz -O LuaJIT-2.0.5.tar.gz
# 下载Lua
wget https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.10.tar.gz -O Lua-v0.10.10.tar.gz
# 下载headers-more-nginx-module
wget https://github.com/openresty/headers-more-nginx-module/archive/refs/tags/v0.33.tar.gz -O headers-more-nginx-module-0.33.tar.gz
# 下载nginx_upstream_check_module
wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/tar.gz/refs/tags/v0.4.0 -O nginx_upstream_check_module-0.4.0.tar.gz
# 下载set-misc-nginx-module
wget https://github.com/openresty/set-misc-nginx-module/archive/refs/tags/v0.33.tar.gz -O set-misc-nginx-module-0.33.tar.gz
# 下载ngx_devel_kit
wget https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.0.tar.gz -O devel_kit-0.3.0.tar.gz
编译参数详解
以下是本文中使用的 Nginx 编译参数及其用途说明。Nginx 提供了丰富的编译选项,在编译时,我们需要充分了解每个参数的用途,而不是盲目使用。了解这些参数的功能,有助于我们根据实际需求进行定制化配置,从而提升 Nginx 的性能和功能。
1. --conf-path=/app/nginx/conf/nginx.conf
* 指定 Nginx 主配置文件的位置。在这里,配置文件位于 /app/nginx/conf/nginx.conf。
2. --user=nginx
* 指定 Nginx 进程运行的用户为 nginx。
3. --group=nginx
* 指定 Nginx 进程运行的用户组为 nginx。
4. --prefix=/app/nginx
* 指定 Nginx 安装的根目录为 /app/nginx。
5. --with-stream
* 启用 Nginx 的流模块,用于处理 TCP 和 UDP 流量。
6. --with-http_stub_status_module
* 启用 stub_status 模块,用于获取 Nginx 的运行状态信息。
7. --with-http_realip_module
* 启用 realip 模块,用于更改客户端 IP 地址(例如从代理服务器获取真实 IP)。
8. --with-http_gzip_static_module
* 启用 gzip_static 模块,用于直接提供预压缩的 .gz 文件。
9. --with-http_ssl_module
* 启用 ssl 模块,用于处理 HTTPS 请求。
10. --with-http_sub_module
* 启用 sub 模块,用于替换 HTTP 响应中的文本。
11. --with-http_v2_module
* 启用 HTTP/2 支持。
12. --add-module=/app/nginx/module/nginx_upstream_check_module-0.4.0
* 添加 nginx_upstream_check_module 模块,用于健康检查上游服务器。
13. --with-ld-opt=-Wl,-rpath,/app/nginx/module/luajit/lib
* 指定链接器选项,设置运行时库搜索路径为 /app/nginx/module/luajit/lib。
14. --add-module=/app/nginx/module/headers-more-nginx-module-0.33
* 添加 headers-more-nginx-module 模块,用于修改 HTTP 响应头。
15. --add-module=/app/nginx/module/ngx_devel_kit-0.3.0
* 添加 ngx_devel_kit 模块,提供开发者工具和扩展功能。
16. --add-module=/app/nginx/module/lua-nginx-module-0.10.10
* 添加 lua-nginx-module 模块,使 Nginx 支持 Lua 脚本。
17. --add-module=/app/nginx/module/set-misc-nginx-module-0.31
* 添加 set-misc-nginx-module 模块,提供一些常用的辅助指令。
一键部署脚本
下面是我们的一键部署脚本,将其保存为install_nginx.sh,然后放置在源码模块同一目录下运行即可
#!/bin/bash
# 定义文件变量
LUAJIT_TAR="LuaJIT-2.0.5.tar.gz"
NGX_DEVEL_KIT_TAR="devel_kit-0.3.0.tar.gz"
LUA_NGINX_MODULE_TAR="Lua-v0.10.10.tar.gz"
HEADERS_MORE_MODULE_TAR="headers-more-nginx-module-0.33.tar.gz"
UPSTREAM_CHECK_MODULE_TAR="nginx_upstream_check_module-0.4.0.tar.gz"
SET_MISC_MODULE_TAR="set-misc-nginx-module-0.33.tar.gz"
NGINX_TAR="nginx-1.20.2.tar.gz"
# 定义安装路径和用户
INSTALL_PATH="/app/nginx"
NGINX_USER="nginx"
# 添加系统用户
useradd -M -s /sbin/nologin $NGINX_USER
# 安装依赖包
yum install -y gcc pcre pcre-devel openssl openssl-devel
# 创建目录
mkdir -p $INSTALL_PATH/module/
# 安装 LuaJIT
tar xzvf $LUAJIT_TAR
cd LuaJIT-2.0.5
make PREFIX=$INSTALL_PATH/module/luajit
make install PREFIX=$INSTALL_PATH/module/luajit
cd ..
# 配置环境变量
luajit_installed=$(grep -c 'export LUAJIT_LIB' /etc/profile)
if [ "$luajit_installed" -eq 0 ]; then
echo "export LUAJIT_LIB=$INSTALL_PATH/module/luajit/lib" >> /etc/profile
echo "export LUAJIT_INC=$INSTALL_PATH/module/luajit/include/luajit-2.0" >> /etc/profile
fi
source /etc/profile
# 解压模块
tar xzvf $NGX_DEVEL_KIT_TAR -C $INSTALL_PATH/module
tar xzvf $LUA_NGINX_MODULE_TAR -C $INSTALL_PATH/module
tar zxvf $HEADERS_MORE_MODULE_TAR -C $INSTALL_PATH/module
tar zxvf $UPSTREAM_CHECK_MODULE_TAR -C $INSTALL_PATH/module
tar zxvf $SET_MISC_MODULE_TAR -C $INSTALL_PATH/module
# 检查并删除现有的 nginx.service 文件
if [ -f /usr/lib/systemd/system/nginx.service ]; then
rm /usr/lib/systemd/system/nginx.service
fi
# 创建 nginx.service 文件
cat <<EOL > /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=$INSTALL_PATH/sbin/nginx -t
ExecStart=$INSTALL_PATH/sbin/nginx
ExecReload=$INSTALL_PATH/sbin/nginx -s reload
ExecStop=$INSTALL_PATH/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOL
# 重新加载 systemd 配置
systemctl daemon-reload
# 解压 Nginx
tar -zxf $NGINX_TAR
# 获取解压后的 Nginx 目录名
NGINX_DIR=$(tar -tzf $NGINX_TAR | head -1 | cut -f1 -d"/")
# 编译安装 Nginx
cd $NGINX_DIR
chmod +x configure
./configure --conf-path=$INSTALL_PATH/conf/nginx.conf \
--user=$NGINX_USER \
--group=$NGINX_USER \
--prefix=$INSTALL_PATH \
--with-stream \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_v2_module \
--add-module=$INSTALL_PATH/module/nginx_upstream_check_module-0.4.0 \
--with-ld-opt=-Wl,-rpath,$INSTALL_PATH/module/luajit/lib \
--add-module=$INSTALL_PATH/module/headers-more-nginx-module-0.33 \
--add-module=$INSTALL_PATH/module/ngx_devel_kit-0.3.0 \
--add-module=$INSTALL_PATH/module/lua-nginx-module-0.10.10 \
--add-module=$INSTALL_PATH/module/set-misc-nginx-module-0.31
make && make install
# 创建虚拟主机目录
mkdir -p $INSTALL_PATH/conf/vhost
# 创建软连接
ln -s $INSTALL_PATH/sbin/nginx /usr/bin/nginx
echo "Nginx installation and configuration completed successfully."
结语
可能大都认为nginx的部署很是简单,yum一下即可,亦或简单的编译,但是要打造一个能抗打的nginx,还需要日常的实战和经验的积累,综上所述,我觉得nginx有上述的实用模块已经可以满足大部分的业务场景与运维的故障排查,后面会继续深入分享,这期分享就到这里,谢谢!
欢迎订阅我的公众号「SRE运维手记」,可扫下方二维码,或者微信搜“SRE运维手记”