nginx开启http2之后浏览器访问仍然是http1.1?

nginx 版本
nginx version: nginx/1.23.3

openssl 版本
OpenSSL 1.0.2k-fips 26 Jan 2017

nginx 配置

server {
  listen 80;
  listen 443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/key.cer;
  ssl_certificate_key /usr/local/nginx/conf/ssl/key.key;

  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDH$
  ssl_prefer_server_ciphers on;
  ssl_stapling on;
  ssl_stapling_verify on;

#  server_name _;
  server_name  localhost;

  location /fp01/ {
    proxy_pass http://127.0.0.1:31600/;
    proxy_set_header Host $http_host;
  }
}

浏览器请求
image.png

  1. 请问还需要配置什么地方才能支持http2?
  2. nginx作为网站入口,代理了后端的springboot。被代理的31600端口程序是否也需要开启http2的支持?还是只需要最外面的nginx开启即可?
  3. 如果不勾选浏览器的禁用缓存按钮则部分请求显示协议为h2
阅读 2.8k
2 个回答

要使 Nginx 支持 HTTP/2 协议,需要确保以下三个条件满足:

  1. 你使用的 Nginx 版本需要支持 HTTP/2。在使用 Nginx 1.9.5 或更高版本且使用 OpenSSL 1.0.2 或更高版本的情况下,就可以支持 HTTP/2。请注意,如果使用的是旧版 OpenSSL,那么 Nginx 必须使用 OpenSSL 启用 HTTP/2。
  2. 在 Nginx 配置中需要正确启用 HTTP/2:
listen 443 ssl http2; # 必须启用 http2 参数
ssl_protocols TLSv1.2; # 必须使用 TLSv1.2 或更高版本的协议

除此之外,还需要在 http 或 server 块中添加以下配置:

http2_idle_timeout 5s; # HTTP/2 空闲连接的超时时间
http2_max_concurrent_streams 100; # 每个 HTTP/2 连接允许的最大并发流量数量
  1. 浏览器必须支持 HTTP/2。几乎所有现代浏览器都支持 HTTP/2,但是如果你使用的是比较老的浏览器,那么它们可能不支持 HTTP/2。

关于被代理的 31600 端口的 Spring Boot 程序是否需要开启 HTTP/2,如果想要在客户端和服务端之间使用 HTTP/2 协议进行通信,那么服务端需要支持 HTTP/2,也就是需要在服务器端支持 HTTP/2。

最后,关于你的问题部分请求显示协议为 h2。可能是因为某些请求使用了 HTTP/2 协议,而另一些请求则使用了 HTTP/1.1 协议,因此在浏览器中会显示为 h2。这并不会影响程序的正常运行,只是浏览器显示的协议可能会有所变化。

如果你的配置生效的话,我猜你是没有用"https://"访问,而依旧采用"http://"开头访问地址。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏