前置
- 你应该具有
Linux
与QUIC
与NGINX
的基本知识 - 本教程使用Ubuntu 22.x发行版来进行安装
- Ubuntu 22.x内置OpenSSL 3.x版本, 发行版中的OpenSSL版本过低会导致问题
- 编译程序需要先搭建编译环境,安装依赖库以及编译所需要的工具
- 本次NGINX的安装选择二进制安装的方式
名词
- QUIC, Quick UDP Internet Connections, 一种基于UDP的协议, 也称为HTTP/3
- NGINX QUIC, NGINX的QUIC的版本, 1.25.0以上版本支持, 常用与代理与负载均衡
- OpenSSL, 一个开源的软件库,用于实现安全套接字层(SSL)和传输层安全(TLS)协议,以及相关的加密、解密、数字签名和密钥交换功能, 第三方QUIC库依赖OpenSSL提供的功能
- quictls/openssl, OpenSSL默认不支持QUIC, 需要第三方库, 本教程选择quictls/openssl库
安装包
- 安装依赖库NGINX二进制编译安装使用QUIC协议
shell
sudo apt update
sudo apt install -y build-essential libtool git mercurial # 编译工具
sudo apt install -y libpcre2-dev zlib1g-dev # 依赖库
- 下载nginx quic最新版
shell
wget https://nginx.org/download/nginx-1.25.2.tar.gz
- 克隆quictls/openssl 最新版本
shell
git clone --depth 1 --recursive https://github.com/quictls/openssl.git
编译quictls/openssl
shell
cd openssl
./Configure --prefix=/home/nginx/quictls --openssldir=/home/nginx/quictls
make install_dev
编译nginx, 根据实际需要
--with-http_ssl_module
为 HTTPS 提供必要的支持。必需!--with-http_realip_module
用于透过代理(反代服务器或 CDN)获取客户端的真实 IP 地址。推荐!--with-http_gzip_static_module
允许发送以 .gz 结尾的预压缩文件替代普通文件。推荐!--with-http_gunzip_module
是一个过滤器,用于对不支持 gzip 编码方法的客户端解压缩。需要存储压缩数据以节省空间并降低 I/O 成本时,且配置了gzip_static always;
时,该模块将非常有用。推荐!--with-http_secure_link_module
用于开启防盗链功能,检查请求链接的真实性,保护资源免受未经授权的访问,并限制链接有效时长。可选--with-http_stub_status_module
提供对基本状态信息的访问的支持。可选--with-http_auth_request_module
基于子请求结果实现客户端授权。如果子请求返回一个 2xx 响应代码,则允许访问。如果返回 401 或 403,则拒绝访问并抛出相应的错误代码。子请求返回的任何其他响应代码被认为是一个错误。可选--with-http_slice_module
模块用在 proxy_cache 大文件的场景,将大文件切片缓存。通常用在 CDN 的 Range 缓存上。可选--with-stream
等模块用来实现四层协议的转发、代理或者负载均衡。可选--with-threads
和--with-file-aio
启用线程池和异步 I/O,可以加快 nginx 运行速度。推荐!--with-compat
可以让 nginx 在不重新编译的情况下动态加载模块。推荐!--with-http_v2_module
和--with-http_v3_module
用于开启 HTTP/2 和 HTTP/3 的支持。必需!--add-module=/usr/src/ngx_brotli
将 brotli 压缩模块编译到 nginx,使 nginx 支持 brotli 压缩。推荐!--add-module=/usr/src/ngx_security_headers
将 ngx_security_headers 模块编译到 nginx。推荐!
示例配置, path/to/nginx/sbin/configure
替换为实际的位置
shell
path/to/nginx/sbin/configure \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_slice_module \
--with-stream \
--with-threads \
--with-file-aio \
--with-compat \
--with-http_v2_module \
--with-http_v3_module \
--with-cc-opt="-I /home/nginx/quictls/include" \ # 修改为你的openssl的include的位置
--with-ld-opt="-L /home/nginx/quictls/lib64" \ # 修改为你的openssl的lib64的位置
--with-debug \
--with-cc-opt="-DNGX_QUIC_DEBUG_PACKETS -DNGX_QUIC_DEBUG_CRYPTO"
配置结束后,注意查看屏幕上显示的结果,被添加的模块其依赖库应该都被找到,如下面图片所示:
如果存在
QUIC ...found
, 继续执行编译nginx, 遇到not found
即未找到, 重新写配置
编译nginx
shell
cd /path/to/nginx-<version>
make && \
make install
链接库
版本号可能不一样, 去quictls
的lib64
目录查找是否有一样的name一致的版本号, 如果版本号不一样, 自行替换
shell
ln -s /home/nginx/quictls/lib64/libcrypto.so.81.3 /usr/lib/libcrypto.so.81.3 && \
ln -s /home/nginx/quictls/lib64/libssl.so.81.3 /usr/lib/libssl.so.81.3 && \
检查NGINX信息
默认情况下, nginx安装在/usr/local/nginx/sbin
目录, 如果想要在任意地方都可以运行, 加入到系统环境变量即可
shell
/usr/local/nginx/sbin/nginx -V
正确安装的情况下应该有如下输出: ![[Pasted image 20231023120832.png]]
添加自启(可选)
添加 nginx.service
使其开机自启 默认情况下, nginx的位置在/usr/local/nginx/sbin/
, 不一致则自行替换/usr/local/nginx/sbin/
为你的nginx目录
shell
cat >>/usr/lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
重新加载 systemd
shell
systemctl daemon-reload
开机启动
shell
systemctl enable nginx.service
常用指令
- systemctl status nginx.service 查看状态
- systemctl start nginx.service 启动
- systemctl restart nginx.service 重新启动
- systemctl reload nginx.service 重新读取配置
配置QUIC协议
看不懂配置文件, 只需要修改有注释的地方, 替换为注释提示的信息即可, 根据你的实际需求来定制
ruby
#user nginx;
worker_processes 1;
error_log /var/log/nginx-error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
#include /etc/nginx/mime.types;
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
quic_retry on;
http3 on;
http3_hq on;
http3_max_concurrent_streams 256;
http3_stream_buffer_size 256k;
quic_active_connection_id_limit 8;
quic_gso on;
#access_log /var/log/nginx/access.log main;
access_log logs/access.log main;
sendfile on;
gzip on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
server {
listen 443 quic reuseport so_keepalive=on backlog=4096;
listen 443 ssl reuseport default_server so_keepalive=on backlog=4096;
http2 on;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "DENY";
add_header Alt-Svc 'h3=":443"; ma=86400, h3-29=":443"; ma=86400';
ssl_protocols TLSv1.3 TLSv1.2;
ssl_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;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_early_data on;
ssl_stapling on;
ssl_stapling_verify on;
proxy_set_header Early-Data $ssl_early_data;
server_name example.com;
ssl_certificate /etc/nginx/certs/cert.pem; # TLS cert配置文件路径
ssl_certificate_key /etc/nginx/certs/key.pem; # TLS key配置文件路径
location / {
root html; # HTML目录路径
index index.html index.htm;
add_header Alt-Svc 'h3=":443"; ma=86400';
add_header QUIC-Status $http3;
}
}
}
测试
- 浏览器测试 使用以下浏览器来进行测试
- Firefox 90+
- Chrome/Egde 92+ (QUIC version 1)
需要浏览器支持QUIC协议并默认开启QUIC选项
-
Firefox地址栏访问:
about:config
输入:network.http.http3.enabled
, 选择为true
-
Chrome 浏览器地址栏访问:
chrome://flags
输入:enable-quic
选择为Enable
启用 -
Egde 浏览器地址栏访问:
egde://flags
输入:enable-quic
选择为Enable
启用
输入你的IP地址, 打开浏览器控制台查看是否为HTTP/3
或者为h3
- 当你部署到公网之后, 访问http3check.net 上输入域名进行测试