13.2.4 编译选项与功能模块选择

源码编译用于自定义功能模块与性能特性,重点在目标系统、库依赖与特性开关。编译前必须确认系统依赖,否则功能会被静默禁用或编译失败。

原理草图:编译选项影响功能模块

文章图片

编译前依赖检查(示例:Ubuntu/Debian)
说明:build-essential 提供编译工具链,libssl-dev 用于 TLS,libpcre2-dev 用于正则 ACL,liblua5.4-dev 用于 Lua。

sudo apt update
sudo apt install -y build-essential libssl-dev libpcre2-dev zlib1g-dev \
  liblua5.4-dev pkg-config

常用编译目标(TARGET)与说明
- TARGET=linux-glibc:常见 Linux 发行版通用选择
- TARGET=linux-musl:基于 musl 的发行版(如 Alpine)
- TARGET=generic:通用兼容,功能较少
- TARGET=linux2628:旧内核兼容(仅在必要时使用)

关键功能模块与依赖(含命令解释)
- SSL/TLS:USE_OPENSSL=1(依赖 OpenSSL)
- 线程支持:USE_THREAD=1(提升多核性能)
- PCRE2 正则:USE_PCRE2=1(复杂 ACL/重写)
- Lua 扩展:USE_LUA=1(自定义逻辑)
- systemd 支持:需安装 systemd 开发包(如 libsystemd-dev

完整编译安装示例(含安装路径与验证)
说明:以下示例将二进制安装到 /usr/local/sbin,并创建运行用户。

# 1) 下载与解压
wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.6.tar.gz
tar -xf haproxy-2.8.6.tar.gz
cd haproxy-2.8.6

# 2) 编译(启用SSL/线程/PCRE2/Lua)
make TARGET=linux-glibc USE_OPENSSL=1 USE_THREAD=1 USE_PCRE2=1 USE_LUA=1 \
  PREFIX=/usr/local

# 3) 安装
sudo make install PREFIX=/usr/local

# 4) 创建运行用户(最小权限)
sudo useradd -r -s /usr/sbin/nologin haproxy || true

# 5) 查看编译特性
/usr/local/sbin/haproxy -vv | egrep 'OpenSSL|THREAD|PCRE|LUA'

命令解释与预期效果
- make TARGET=...:选择与内核/Libc匹配的构建目标
- USE_OPENSSL=1:编译进 TLS 支持,-vv 输出中应出现 OpenSSL
- USE_THREAD=1:启用多线程,-vv 输出中应出现 THREAD
- PREFIX=/usr/local:安装路径前缀,二进制位于 /usr/local/sbin/haproxy

最小验证配置与启动(示例)
说明:验证编译后的二进制可启动并监听端口。

sudo mkdir -p /etc/haproxy
sudo tee /etc/haproxy/haproxy.cfg >/dev/null <<'EOF'
global
  daemon
  maxconn 2048

defaults
  mode http
  timeout connect 5s
  timeout client  30s
  timeout server  30s

frontend fe_http
  bind *:8080
  default_backend be_web

backend be_web
  server s1 127.0.0.1:8081 check
EOF

# 语法检查
/usr/local/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg

# 启动(前台调试)
/usr/local/sbin/haproxy -db -f /etc/haproxy/haproxy.cfg

排错清单(含定位命令)
1) OpenSSL not found

# 解决:确认开发包与pkg-config
sudo apt install -y libssl-dev pkg-config

2) PCRE2 not found

sudo apt install -y libpcre2-dev

3) undefined reference to SSL_*

# 说明:链接失败,多为openssl开发包版本不匹配
pkg-config --modversion openssl

4) haproxy -vv 无 THREAD

# 说明:未启用USE_THREAD或目标不支持
/usr/local/sbin/haproxy -vv | grep -i thread

功能选择建议(与场景绑定)
- 仅 TCP/HTTP:USE_THREAD=1 USE_PCRE2=1
- 需要 HTTPS/SNI:必须 USE_OPENSSL=1
- 复杂路由/自定义逻辑:启用 USE_LUA=1
- 最小化构建:仅保留必要模块以降低攻击面

练习
1) 用 USE_OPENSSL=1 和不带 USE_OPENSSL=1 分别编译,比较 haproxy -vv 输出差异。
2) 修改 TARGET=generic 重新编译,观察 -vv 输出变化并记录缺失功能。
3) 删除 libpcre2-dev 再编译,记录报错并总结依赖缺失的提示信息。