由于项目需求,在nginx下支持http2协议,希望提升访问性能。
除了介绍配置过程,在文章最后会记上过程中的困惑。
准备工作
- nginx-1.19.2.tar.gz
- openssl-1.0.2r.tar.gz(必须不低于1.0.2,否则不支持http2)
以上文件上传到/usr/local目录下。
开始安装
安装nginx
# 解压openssl
> tar -zxvf openssl-1.0.2r.tar.gz
> tar -zxvf nginx-1.19.2.tar.gz
> cd nginx-1.19.2
# 必须安装ssl和http2模块,以及保证openssl版本在1.0.2及以上
> ./configure --with-http_ssl_module --with-http_v2_module --with-openssl=/usr/local/openssl-1.0.2r
> make
> make install
配置https
生成自签名证书
-- 一个key,一个crt。
配置证书
server {
listen 443 ssl http2 default_server;
server_name test.bi.com;
ssl_certificate /usr/local/nginx/conf/ssl.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';
ssl_prefer_server_ciphers on;
......
}
访问效果
浏览器访问站点,并F2,切到网络面板,右键菜单将协议显示出来,并刷新,可协议变成了“h2”。
后记
openssl
无需升级系统中的openssl,只需在nginx编译时指定openssl的源码目录。
不生效
起初,在浏览器端h2协议一起不生效,始终是http/1.1。
冷静下来后的排查过程:
- 在服务器上通过curl命令测试
curl -v -k https://localhost
输入显示使用了h2协议。
但是,会由于curl版本低的原因,依然会使用http/1.1。
用7.61.1版本ok。
使用wireshark
一度郁闷的时候,下了抓包工具。
在ssl握手过程中,通过ALPN机制协调最张使用http/1.1还是h2。
客户端 发送 Client Hello,告诉服务端自身 是否支持 h2。
服务器 再发送 server Hello,告诉客户端最终要使用的 交互协议。