前言
本文介绍在 CentOS 7 64 位系统上,通过编译安装的方式为 Nginx 启用并动态加载 Stream 模块,以实现四层(TCP/UDP)负载均衡功能。文中将涵盖从环境准备、编译配置、服务管理到最终配置的全过程。
环境准备与编译安装
首先,建议使用 screen 或 tmux 来保持编译会话,防止因网络中断导致任务终止。
yum install screen -y
screen -S nginx_compile
安装编译工具与依赖
安装必要的开发工具和依赖库。请注意,原文中的部分包名可能不准确或已过时,以下命令已修正并补充了必要组件。
sudo yum -y groupinstall "Development Tools"
sudo yum -y install epel-release wget gcc autoconf automake pcre-devel zlib-devel openssl-devel perl perl-devel libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel
下载源码包
本文示例使用 Nginx 1.13.2 版本,但请注意此版本已停止维护。建议从 Nginx 官网 获取最新的稳定版(Stable version)源码。以下命令仅为演示流程。
wget https://nginx.org/download/nginx-1.13.2.tar.gz
tar zxvf nginx-1.13.2.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
tar xzvf pcre-8.40.tar.gz
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar xzvf zlib-1.2.11.tar.gz
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar xzvf openssl-1.1.0f.tar.gz
rm -rf *.tar.gz
cd nginx-1.13.2
配置编译参数
关键配置项是 --with-stream=dynamic,这会将 Stream 模块编译为动态共享对象(.so 文件),以便后续动态加载。以下是一个包含常用模块的配置示例:
./configure --prefix=/etc/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
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--user=nginx
--group=nginx
--with-threads
--with-file-aio
--with-http_ssl_module
--with-http_v2_module
--with-http_realip_module
--with-http_sub_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_stub_status_module
--with-stream=dynamic
--with-stream_ssl_module
--with-stream_realip_module
--with-pcre=../pcre-8.40
--with-pcre-jit
--with-zlib=../zlib-1.2.11
--with-openssl=../openssl-1.1.0f
--with-debug
运行 ./configure 后,请检查输出末尾是否有错误信息。确认无误后,执行编译和安装。
make
sudo make install
创建符号链接与 Nginx 用户
为动态模块目录创建符号链接,方便配置引用。
sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules
创建 Nginx 运行用户(如果不存在):
sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx
验证安装与配置系统服务
检查编译参数,确认包含 --with-stream=dynamic:
nginx -V 2>&1 | grep stream
创建必要的缓存目录并测试配置文件:
sudo mkdir -p /var/cache/nginx
sudo nginx -t
配置 systemd 服务单元文件。创建或编辑 /usr/lib/systemd/system/nginx.service:
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
启动 Nginx 并设置开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
检查服务状态:
sudo systemctl status nginx
curl -I 127.0.0.1
防火墙配置
如果系统防火墙(firewalld)处于活动状态,需要放行 Nginx 使用的端口(例如 80、443)。
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
常用防火墙管理命令:
sudo systemctl start firewalld # 启动防火墙
sudo systemctl stop firewalld # 停止防火墙
sudo systemctl enable firewalld # 开机自启防火墙
sudo systemctl disable firewalld # 禁止开机自启防火墙
配置 Nginx Stream 四层负载均衡
Nginx 默认配置文件路径为 /etc/nginx/nginx.conf。动态加载 Stream 模块需要在主配置文件的顶部使用 load_module 指令。
首先,备份原始配置:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
编辑 /etc/nginx/nginx.conf,一个基础的四层 TCP 负载均衡配置示例如下:
# 动态加载 Stream 模块
load_module modules/ngx_stream_module.so;
# 工作进程数,通常设置为 CPU 核心数
worker_processes auto;
events {
worker_connections 1024;
}
# Stream 模块配置块,用于四层代理
stream {
# 定义上游服务器组,名为 backend
upstream backend {
# 使用客户端 IP 进行一致性哈希
hash $remote_addr consistent;
# 后端服务器,请替换为实际 IP 和端口
server 176.58.111.12:80 weight=5 max_fails=3 fail_timeout=30s;
server 178.79.163.35:80 weight=5 max_fails=3 fail_timeout=30s;
}
server {
# 监听 80 端口(TCP)
listen 80;
proxy_connect_timeout 1s;
proxy_timeout 3s;
# 代理到上游服务器组
proxy_pass backend;
}
}
配置完成后,测试配置文件语法并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
管理命令与路径参考
- 服务管理:
systemctl start|stop|restart|reload|status nginx - 检查端口监听:
ss -tlnp | grep :80 - 默认网站根目录:
/usr/share/nginx/html - 主配置文件:
/etc/nginx/nginx.conf - 附加配置目录:
/etc/nginx/conf.d/(通常用于 HTTP 配置)
总结
通过编译安装并动态加载 Stream 模块,可以在无需重新编译整个 Nginx 的前提下,灵活地启用或禁用四层代理功能。这为构建 TCP/UDP 负载均衡器提供了便利。请注意,生产环境应使用更新的软件版本,并根据实际网络拓扑和安全策略调整配置。