xiaoxiao
发布于 2025-10-13 / 12376 阅读 / 2 评论 / 1111 点赞

nginx迁移haproxy,支持ipv6加http3

现在凌晨了,长话短说。大概以下内容

  1. 安装haproxy编译环境

  2. 编译aws-lc版本的openssl

  3. 使用aws-lc版的ssl编译haproxy

  4. 配置兼容ipv6和http3的代理

  5. 如何开机自启动

如果你不是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/fedora

1.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 -y

2. 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-haproxy

5.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需要手动配置的东西它都不需要。先睡了,后面再整理。


评论