现在凌晨了,长话短说。大概以下内容
安装haproxy编译环境
编译aws-lc版本的openssl
使用aws-lc版的ssl编译haproxy
配置兼容ipv6和http3的代理
如何开机自启动
如果你不是systemd的系统,下面的日志部分相关都不要配置
1. 环境准备
为了使用新版本的gcc选择使用fedora
1.1 获取fedora的rootfs
# 可以使用docker代替podman
podman pull docker.io/library/fedora
podman save -o fedora.tar docker.io/library/fedora:latest
mkdir fedora-temp
tar -vxf fedora.tar -C fedora-temp/
ls -hal fedora-temp/
# 找到fedora的所在压缩包
# 343c74627573b3c41aeff593bd7f326a3a907171dfe0aa94e9955780f4c7f01c.tar
mkdir -p /srv/chroot/fedora
tar -vxf ./fedora-temp/343c74627573b3c41aeff593bd7f326a3a907171dfe0aa94e9955780f4c7f01c.tar -C /srv/chroot/fedora1.2 配置fedora环境
安装schroot
apt install schroot配置fedora的schroot环境
cat > /etc/schroot/chroot.d/fedora.conf <<EOF
[fedora]
description=fedora
type=directory
directory=/srv/chroot/fedora
# 用户按需配置
users=xiaoxiao,natuie
root-groups=root
profile=fedora
personality=linux
preserve-environment=true
EOF
cp -r /etc/schroot/default/ /etc/schroot/fedora
vim /etc/schroot/fedora/fstab
# 增加/run/systemd/journal /run/systemd/journal none rw,bind 0 0
# 后续日志需要
安装基本工具
schroot -c fedora -d /root
# 更新一下旧软件
dnf update -y && dnf upgrade
dnf install wget git gcc cmake3 ninja-build clang perl golang pcre2-static zlib-devel -y2. aws-lc
2.1 编译
# --depth 1 浅克隆 只拉取最新版本
git clone --depth 1 https://github.com/aws/aws-lc.git
mkdir aws-lc-build && cd aws-lc-build
cmake3 -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../aws-lc-install ../aws-lc
ninja-build && ninja-build install
cd ../aws-lc-install/
ls *3. haproxy
3.1 编译
cd /root && wget https://www.haproxy.org/download/3.2/src/haproxy-3.2.6.tar.gz
tar -vxf haproxy-3.2.6.tar.gz
cd haproxy-3.2.6
make -j$(nproc) TARGET=linux-glibc USE_STATIC_PCRE2=1 USE_PCRE2_JIT=1 USE_OPENSSL_AWSLC=1 USE_ZLIB=1 USE_MATH=1 SSL_INC=../aws-lc-install/include SSL_LIB=../aws-lc-install/lib64 USE_QUIC=1
make install如果想性能好点,可以加CPU_CFLAGS=-march=native OPT_CFLAGS="-O3"
CPU_CFLAGS可以生成更符合当前cpu的优化代码,O3是gcc的代码优化最高级别。一般用O2,因为O3太激进了,可能有bug。但是2025年编译器如此成熟,我怕个der。
编译后可以使用haproxy -vv查看详情。
Feature list 可以告诉你有哪些好玩的特性,可以问问ai。

4. 如何配置ipv6和http3
4.1 xiaoxiao.space的配置文件
启动使用 haproxy -f xxxx.cfg
global
# 证书路径配置后,下面就可以直接用文件名
crt-base ./certs
# syslog日志
log /dev/log local0 info
# 指定一些安全点的算法
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
defaults
mode http
log global
option httplog
# 按需配置
# 我的服务都在本机,所以超时比较低
timeout connect 2s
timeout client 60s
timeout server 60s
frontend https_proxy
mode http
# 重点 ::: 可以监听tcp的ipv4和ipv6
bind :::443 name secure ssl crt natuie.net.pem crt xiaoxiao.space.pem
option socket-stats
# 重点 quic6 可以监听udp的ipv4和ipv6,所以不需要配置另一条quic4@:443
bind quic6@:443 name quic ssl crt natuie.net.pem crt xiaoxiao.space.pem allow-0rtt
http-response add-header alt-svc 'h3=":443"; ma=90000'
# 让浏览器自动跳https
http-after-response set-header Strict-Transport-Security "max-age=31536000"
# 代理和真实ip相关
http-request del-header x-forwarded-for
option forwardfor
http-request set-header X-Real-IP %[src]
# 路由规则,后缀匹配hdr_dom,全匹配hdr,正则可以用hdr_reg
acl is_natuie hdr_dom(host) -i natuie.net
use_backend natuie_nginx if is_natuie
acl is_xiaoxiao_blog hdr(host) -i xiaoxiao.space
use_backend xiaoxiao_blog if is_xiaoxiao_blog
acl is_xiaoxiao_git hdr(host) -i git.xiaoxiao.space
use_backend xiaoxiao_git if is_xiaoxiao_git
acl is_xiaoxiao_gh_proxy hdr(host) -i gh-proxy.xiaoxiao.space
use_backend xiaoxiao_gh_proxy if is_xiaoxiao_gh_proxy
acl is_xiaoxiao_registry_k8s hdr(host) -i registry-k8s.xiaoxiao.space
use_backend xiaoxiao_registry_k8s if is_xiaoxiao_registry_k8s
acl is_xiaoxiao_registry_dockerhub hdr(host) -i registry-dockerhub.xiaoxiao.space
use_backend xiaoxiao_registry_dockerhub if is_xiaoxiao_registry_dockerhub
acl is_xiaoxiao_registry_quay hdr(host) -i registry-quay.xiaoxiao.space
use_backend xiaoxiao_registry_quay if is_xiaoxiao_registry_quay
# 后端配置,nginx的upstream,但是有很强的健康检测功能,还可以支持后端的http2。但是都是一个服务,所以不做检查了
backend natuie_nginx
server srv1 127.0.0.1:2080
backend xiaoxiao_blog
server srv1 127.0.0.1:9001
backend xiaoxiao_git
server srv1 127.0.0.1:9002
backend xiaoxiao_gh_proxy
server srv1 127.0.0.1:8080
backend xiaoxiao_registry_k8s
server srv1 127.0.0.1:5000
backend xiaoxiao_registry_dockerhub
server srv1 127.0.0.1:5001
backend xiaoxiao_registry_quay
server srv1 127.0.0.1:5002
5. systemd开机启动
5.1 systemd配置文件参考
要到宿主机,还在chroot的系统需要exit出来
vim etc/systemd/system/fedora-haproxy.service配置内容
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target
[Service]
Environment="CONFIG=test.cfg" "PIDFILE=/run/haproxy.pid" "EXTRAOPTS=-S /run/haproxy-master.sock"
ExecStart=/usr/bin/schroot -c fedora -d /root/haproxy-3.2.6 -- ./haproxy -Ws -f $CONFIG -p $PIDFILE $EXTRAOPTS
ExecReload=/usr/bin/schroot -c fedora -d /root/haproxy-3.2.6 -- ./haproxy -Ws -f $CONFIG -c $EXTRAOPTS
ExecReload=/usr/bin/schroot -c fedora -d /root/haproxy-3.2.6 -- /bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target我的配置文件:/srv/chroot/fedora/root/haproxy-3.2.6/test.cfg
证书路径:/srv/chroot/fedora/root/haproxy-3.2.6/certs/
按需配置,为啥我的是test.cfg和./haproxy。是因为我用了c语言的PGO参数编译,所以得回到/srv/chroot/fedora/root/haproxy-3.2.6和源码一起。正常是不需要的
# 设置自启动
systemctl enable --now fedora-haproxy5.2 日志查看
日志被/dev/log接收实际是/run/systemd/journal/dev-log,1.2步骤有关联。
# 查看最新日志
journalctl -u fedora-haproxy -f
# 加条件
journalctl -u fedora-haproxy --grep 'blog' -f
# 指定时间范围
journalctl -u fedora-haproxy --since "1 hour ago"
journalctl -u fedora-haproxy --since "2 days ago" --until "1 hour ago"
journalctl -u fedora-haproxy --since "2025-07-23 14:00:00" --until "2025-07-23 15:30:00"可以通过火狐验证http3,但是要改配置,百度一下即可

6. 杂谈
6.1 没有看到http3生效
没有编译出错又能启动,就是没生效?看看ipv6的AAAA记录配置没有,udp防火墙开了没有
6.2 为什么从nginx到haproxy
haproxy在纯代理方面很优秀,而且很多nginx需要手动配置的东西它都不需要。先睡了,后面再整理。