跳到主要内容

centos构建nginx添加quic

1、安装nginx编译环境

dnf -y install \
gcc \
gcc-c++ \
pcre-devel \
openssl-devel \
zlib-devel \
cmake \
make \
go \
libunwind-devel \
git \
wget

如果需要构建全模块rpm包环境使用下面:

dnf -y install \
git \
gcc \
gcc-c++ \
make \
rpm-build \
tar \
golang \
cmake \
libunwind-devel \
pcre2-devel \
krb5-devel \
libedit \
libxml2-devel \
libxslt-devel \
gd-devel \
libmaxminddb \
perl-ExtUtils-Embed \
perl-devel \
c-ares-devel \
openssl-devel \
re2-devel \
boost-devel \
libstdc++-devel \
yaml-cpp-devel \
rake \
brotli-devel \
which \
libatomic \
libedit-devel \
libmaxminddb-devel \
libstdc++-static \
lua-devel \
perl-macros \
xz

2、克隆依赖库

git clone https://gitee.com/fenghuolingyun/boringssl.git

3、下载源码并解压

wget https://nginx.org/download/nginx-1.27.3.tar.gz
tar -xf nginx-1.27.3.tar.gz

4、开始编译ssl依赖

  • 配置发布稳定版本,默认使用cmake ..构建调试版本。如果构建中报错,添加全局go代理export GO111MODULE=on export GOPROXY=https://mirrors.aliyun.com/goproxy/
  • 新增参数-DOPENSSL_SMALL=1优化构建完成后的二进制文件大小,注意最新版本需要配套gcc 10.0+以上版本。
cd boringssl && \
mkdir build && \
cd build && \
cmake -DOPENSSL_SMALL=1 -DCMAKE_BUILD_TYPE=Release .. && \
make -j $(nproc)

5、进入nginx源码目录

cd nginx-1.27.3

6、配置构建参数

./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 \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-http_v3_module \
--with-cc=c++ \
--with-cc-opt='-I../boringssl/include -x c' \
--with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto'

7、开始编译nginx

make -j $(nproc)

8、编译完成我们替换掉yum源安装的主程序

cd objs && \
rm -rf /usr/sbin/nginx && \
cp ./nginx /usr/sbin/nginx

9、全部完成开启服务并且启动

  • 创建开机启动服务
systemctl enable nginx
  • 重启服务
systemctl restart nginx
  • 移除开机启动
systemctl disable nginx
  • 重载配置文件
nginx -s reload

配置文件在/etc/nginx/

  • 1.27.3版本配置文件中新增了plus商业版本中的新功能
  • automatic re-resolution of hostnames in upstream groups using DNS.
  • 官方提供的使用配置如下:
http {
resolver 10.0.0.1 valid=300s ipv6=off;
resolver_timeout 10s;
upstream backend {
server backend1.example.com resolve;
server backend2.example.com resolve;
}
server {
location / {
proxy_pass http://backend;
}
}
}

以下是对这段配置说明的解释以及基于 test.com 域名的示例解读:

整体功能说明

在这个 1.27.3 版本配置文件中新增的功能是允许在上游服务器组(upstream 定义的组)中使用 DNS 自动重新解析主机名(automatic re-resolution of hostnames in upstream groups using DNS)。这意味着如果上游服务器对应的域名其 IP 地址有变化(比如因 DNS 记录更新等情况),nginx 能够自动基于 DNS 再次去获取新的 IP 地址,从而保证请求可以正确路由到对应的服务器,无需手动去更新配置文件里的服务器 IP 信息。

配置各部分解释

  • resolver 指令:

    resolver 10.0.0.1 valid=300s ipv6=off;

    这行配置指定了 DNS 解析服务器的 IP 地址为 10.0.0.1,表示 nginx 将向这个 IP 对应的 DNS 服务器去查询域名对应的 IP 地址。valid=300s 表示解析结果的有效时长是 300 秒,在这 300 秒内 nginx 会使用这次解析得到的 IP 地址,超过这个时间如果再次有请求发往对应的域名,就会重新发起 DNS 解析。ipv6=off 则是明确禁用 ipv6 相关的解析,只使用 ipv4 进行解析。

  • resolver_timeout 指令:

    resolver_timeout 10s;

    设定了 nginx 等待 DNS 解析响应的超时时间为 10 秒。如果向指定的 DNS 服务器发起查询后,10 秒内没有收到回复,就会认为这次解析失败,可能影响后续对相应域名的请求处理。

  • upstream 指令:

    upstream backend {... }

    定义了一个名为 backend 的上游服务器组。在这个组里,可以配置多个后端服务器。

    server backend1.example.com resolve;
    server backend2.example.com resolve;

    表示在这个 backend 上游组里添加了两个服务器域名,resolve 关键字就是启用了针对这些域名的自动重新解析功能,即会按照前面设置的 resolverresolver_timeout 规则来对 backend1.example.combackend2.example.com 这两个域名进行 DNS 解析以及重新解析(IP 变化时)操作。

  • serverlocation 指令(用于请求处理部分):

    server {... }

    这部分定义了一个虚拟服务器配置。

    location / {... }

    表示当客户端请求的 URI 路径是 /(根路径,通常可以理解为访问域名对应的首页等情况)时,会执行下面的配置。

    proxy_pass http://backend;

    这行指令将匹配到的请求反向代理到名为 backend 的上游服务器组,也就是前面定义的那个包含了 backend1.example.combackend2.example.com 等服务器(域名形式,会自动解析 IP)的组,nginx 会根据配置的负载均衡策略(默认有轮询等方式,如果没额外指定的话)把请求转发到相应的后端服务器上。

基于 test.com 的示例配置

以下是将上述示例中的域名替换为 test.com 相关域名后的配置示例,假设你有两个后端服务器对应的域名分别是 server1.test.comserver2.test.com

http {
resolver 10.0.0.1 valid=300s ipv6=off; // 假设你的 DNS 服务器 IP 是 10.0.0.1
resolver_timeout 10s;
upstream backend {
server server1.test.com resolve; // 添加了 server1.test.com 域名到上游组且启用自动解析
server server2.test.com resolve; // 添加了 server2.test.com 域名到上游组且启用自动解析
}
server {
listen 80; // 监听 80 端口,可根据实际情况调整端口号
server_name your_domain.com; // 这里替换为你实际对外提供服务的域名,假设是 your_domain.com

location / {
proxy_pass http://backend;
}
}
}
在这个示例中,nginx 会向 10.0.0.1 这个 DNS 服务器去查询 server1.test.comserver2.test.com 的 IP 地址,每 300 秒验证解析结果是否有效,等待 DNS 解析的超时时间是 10 秒,并且在客户端访问 your_domain.com 的根路径(/)时,会把请求反向代理到 backend 这个上游服务器组里的 server1.test.comserver2.test.com 对应的服务器上(基于默认轮询等负载均衡策略),而且如果这两个域名对应的 IP 地址后续有变化,nginx 能自动重新解析获取新 IP 并正确转发请求。