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
关键字就是启用了针对这些域名的自动重新解析功能,即会按照前面设置的resolver
和resolver_timeout
规则来对backend1.example.com
和backend2.example.com
这两个域名进 行 DNS 解析以及重新解析(IP 变化时)操作。 -
server
和location
指令(用于请求处理部分):server {... }
这部分定义了一个虚拟服务器配置。
location / {... }
表示当客户端请求的 URI 路径是
/
(根路径,通常可以理解为访问域名对应的首页等情况)时,会执行下面的配置。proxy_pass http://backend;
这行指令将匹配到的请求反向代理到名为
backend
的上游服务器组,也就是前面定义的那个包含了backend1.example.com
和backend2.example.com
等服务器(域名形式,会自动解析 IP)的组,nginx
会根据配置的负载均衡策略(默认有轮询等方式,如果没额外指定的话)把请求转发到相应的后端服务器上。
基于 test.com
的示例配置
以下是将上述示例中的域名替换为 test.com
相关域名后的配置示例,假设你有两个后端服务器对应的域名分别是 server1.test.com
和 server2.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.com
和 server2.test.com
的 IP 地址,每 300 秒验证解析结果是否有效,等待 DNS 解析的超时时间是 10 秒,并且在客户端访问 your_domain.com
的根路径(/
)时,会把请求反向代理到 backend
这个上游服务器组里的 server1.test.com
或 server2.test.com
对应的服务器上(基于默认轮询等负载均衡策略),而且如果这两个域名对应的 IP 地址后续有变化,nginx
能自动重新解析获取新 IP 并正确转发请求。