linux环境下nginx配置http2

发布时间 2023-12-22 15:09:40作者: i初学者

由于项目需求,在nginx下支持http2协议,希望提升访问性能。

除了介绍配置过程,在文章最后会记上过程中的困惑。

准备工作

  1. nginx-1.19.2.tar.gz
  2. 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。

冷静下来后的排查过程:

  1. 在服务器上通过curl命令测试
curl -v -k https://localhost

输入显示使用了h2协议。
image
但是,会由于curl版本低的原因,依然会使用http/1.1。
用7.61.1版本ok。

使用wireshark

一度郁闷的时候,下了抓包工具。
在ssl握手过程中,通过ALPN机制协调最张使用http/1.1还是h2。
客户端 发送 Client Hello,告诉服务端自身 是否支持 h2。
服务器 再发送 server Hello,告诉客户端最终要使用的 交互协议。