前言:
安装nginx支持http3时对版本是软件的有一些要求的,安装过程中如果版本不差异会导致编译存在问题。
还有就是安装过程中会有一些依赖支持库;
gcc版本:大于 gcc-4.7
pcre版本: pcre-8.00
nginx版本: nginx-1.17.9 或 nginx-1.16.x
cmake版本: 大于 cmake-3.0
golang版本: go1.13.x
(一) 安装支持扩展
1.1 安装pcre
安装
$yum -y install pcre-devel
或
$wget ftp://ftp.pcre.org/pub/pcre/pcre-8.00.tar.gz
$tar zxf pcre-8.00.tar.gz && cd pcre-8.00 && make && make install
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度明显变慢。测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒。因此改用pcre来解决C语言中使用正则表达式的问题。
1.2 安装gcc
安装gcc 8.x,由于cmake需要安装cmake 3.x 以上版本,但是编译cmake需要c++11;gcc4.7之后才支持c++11,安装一个高版本是为了完整兼容。
# 更新源码仓库
$ sudo yum install centos-release-scl
# 下载gcc8
$ sudo yum install devtoolset-8
可以参考:
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/
替换老的gcc
$mv /usr/bin/gcc /usr/bin/gcc.old
$mv /usr/bin/cc /usr/bin/cc.old
$mv /usr/bin/c++ /usr/bin/c++.old
$ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/bin/gcc
$ln -s /opt/rh/devtoolset-8/root/usr/bin/cc /usr/bin/cc
$ln -s /opt/rh/devtoolset-8/root/usr/bin/c++ /usr/bin/c++
1.3 安装cmake
# 卸载旧版
$yum remove cmake
# 下载cmake
$wget https://github.com/Kitware/CMake/releases/download/v3.15.4/cmake-3.15.4.tar.gz
# 解压编译安装
$tar zxf cmake-3.15.4.tar.gz && cd cmake-3.15.4 && ./bootstrap && make && make install
# 设置软连接
$ln -s /usr/local/bin/cmake /usr/bin/cmake
1.4 安装libunwind扩展库和go
$yum -y install go libunwind-devel
1.5 安装rust
$curl https://sh.rustup.rs -sSf | sh
安装过程可能会比较慢,可以更新下载源后执行:
$ vim ~/.bashrc
# 在文件中加入以下两句
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
# 接下来运行命令使文件生效
$ source ~/.bashrc
可以参照:
https://blog.csdn.net/tjzzy/article/details/88635514
(二) 安装nginx
2.1 下载nginx:
$cd /data/
$wget http://nginx.org/download/nginx-1.17.9.tar.gz
2.2下载quiche及支持库:
$cd /data/
$git clone --recursive https://github.com/cloudflare/quiche
2.3添加nginx模块:
$cd /data/
$tar zxvf nginx-1.17.9.tar.gz
$cd /data/nginx-1.17.9/
#nginx quic补丁
$curl https://raw.githubusercontent.com/kn007/patch/master/nginx_with_quic.patch | patch -p1
$patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
2.4编译:
$ ./configure --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche --without-http_gzip_module --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)"
编译中如果遇到如下错误
nginx/quiche/deps/boringssl/ssl/test/bssl_shim.cc:664:44: error: expected ‘)’ before ‘PRId32’
fprintf(stderr, "Ticket age skew was %" PRId32 ", wanted %d\n",
~ ^~~~~~~
)
可以设置c++ 添加__STDC_FORMAT_MACROS
$c++ -D__STDC_FORMAT_MACROS
或通过configure生产objs/Makefile 后修改cmake的-DCMAKE_CXX_FLAGS参数
mkdir -p ../quiche/deps/boringssl/build ../quiche/deps/boringssl/.openssl/lib ../quiche/deps/boringssl/.openssl/include/openssl \
&& cd ../quiche/deps/boringssl/build \
&& cmake -DCMAKE_C_FLAGS="" -DCMAKE_CXX_FLAGS="-D__STDC_FORMAT_MACROS" .. \
&& $(MAKE) VERBOSE=1 \
&& cd .. \
&& cp -r include/openssl/*.h .openssl/include/openssl \
&& cp build/ssl/libssl.a build/crypto/libcrypto.a .openssl/lib
保证编译中c++存在__STDC_FORMAT_MACROS参数
(三)配置http3
nginx http3配置
server {
#Enable QUIC and HTTP/3.
listen 443 ssl http2 quic reuseport;
server_name localhost;
root /home/ceshi/;
# 只支持tls1.3
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400';
}
mac下安装curl测试http3
#mac安装curl
$brew install --HEAD -s https://raw.githubusercontent.com/cloudflare/homebrew-cloudflare/master/curl.rb
#访问
$curl curl -I –http3 https://192.168.1.108/
参考献文
https://blog.cloudflare.com/experiment-with-http-3-using-nginx-and-quiche/
https://blog.cloudflare.com/zh/http-3-from-root-to-tip-zh/
https://i-meto.com/nginx-http3/
https://www.nange.cn/quiche-and-http3-for-nginx.html