nginx 配置 http/2(h2) 和 http 在同一端口的问题

大家好,我是烤鸭:

​     这个完全是个采坑记录了。

场景说明

由于这边有个需求想加个支持 grpc 方式转发的域名。

正常的二级域名都是映射到80端口,所以也没想太多,按照这个方式加上了。

# 已有的配置
server {listen 80;server_name yyy.xx.com;# access_log logs/access.log main;location / {proxy_pass http://127.0.0.1:10086; # 此处配置http服务的ip和端口}
}# grpc 代理配置
server {listen 80 http2; # grpc方式对外暴露端口server_name xxx.xx.com;# access_log logs/access.log main;location / {grpc_pass grpc://127.0.0.1:11800; # 此处配置grpc服务的ip和端口}
}

生效之后,nginx 其他的域名访问不了了,what ???

问题排查

加的这块有什么问题呢?
有人说是因为 http2 必须建立在https之上,只能挂在 443端口,果然改成 443端口之后,其他域名就可以访问了。

事实是这样的么?

我们看下nginx 官网对 http/2 升级的说明。
https://www.nginx.com/blog/nginx-1-9-5/

如果您的应用程序还没有用SSL/TLS加密,那么现在正是采取这一行动的好时机。加密应用程序可保护您免受间谍和中间人攻击。一些搜索引擎甚至奖励加密网站在搜索结果中排名的提高。以下配置块将所有普通HTTP请求重定向到站点的加密版本。

要启用HTTP/2支持,只需将http2参数添加到所有监听端口中。还包括ssl参数,这是必需的,因为浏览器不支持没有加密的HTTP/2。
两句话:开启 ssl/tsl,配置http2 ,这里虽然官方demo给的端口是 443,但是说明没有说必须配置在443。

http/2 和https 到底有什么区别?浏览器如果兼容https协议,访问 http/2 就没问题。这个只是针对 client端的,如果通过程序语言,使用 http/2 的grpc 方式,仅配置 http2 就行。

问题原因

那如果不是 http/2 必须配置在 443端口的原因,实际原因是什么。

几年前就有人给nginx提过这个问题。
https://trac.nginx.org/nginx/ticket/808
https://trac.nginx.org/nginx/ticket/816
http/2 和 http 可以同时存在,只要不是同一个端口就行。如果是支持ssl 也可以是同一个端口。

配置 http/2 也可以两个方式,

listen port_num http2 ssl (支持HTTP/1.1和h2,通过ALPN选择协议)

listen port_num http2(仅支持h2)

由于我是服务端连接,所以选择了下边的方式。

仅支持h2就无法响应其他的协议了,看下源码更清晰。

(https://github.com/nginx/nginx/blob/9e07862d6e9d37041a42bbfa34dd1f56ed547505/src/http/ngx_http_request.c#L324-L331)

解决方案

仅配置 http/2 的时候选择一个和 http不同的端口。

配置 http2 ssl 的时候选择支持 https的端口。(一般就是 443)

nginx 配置 http/2(h2) 和 http 在同一端口的问题相关推荐

  1. nginx配置二级目录,反向代理不同ip+端口

    场景描述: 通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1 ...

  2. Nginx配置二级目录反向代理本机不同端口

    前序 最近在家里的服务器上装了一大堆的服务器软件,大多数都需要Web网站访问的,比如:Gitlab.Apache.Jenkins等等.然而又因为是不同的应用,需要占用不同的端口,每次访问起来都需要在I ...

  3. nginx配置与应用

    Nginx 初识nginx 介绍Nginx Nginx安装 配置文件 启动Nginx Nginx配置文件 日志格式 网站配置 server配置网站 虚拟化主机 nginx日志 切割日志 nginx模块 ...

  4. nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问

    nginx配置http.https访问 要设置https访问需要从对应的云厂商申请证书,并下载Nginx证书到服务器. 我这里从阿里云申请了免费的域名证书,然后将证书放置在服务器的/etc/ssl/. ...

  5. 快速通过nginx配置域名访问

    配置nginx进行域名访问文件 在nginx安装目录下的conf目录下新建一个配置文件,比如你新加的域名为admin.hello.com,你希望通过这个域名访问admin项目,那么新建一个admin. ...

  6. 前后端分离nginx配置,同时解决跨域问题

    背景 现在,web开发的前后端分离技术越来越火爆,由于最近的公司官网使用了前后端分离的方案,这里就来记录一下前后端分离的项目部署.这里我们使用的前端框架是Vue.js,后台使用Laravel7提供数据 ...

  7. Nginx 配置清单(一篇够用)

    欢迎关注方志朋的博客,回复"666"获面试宝典 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务,其因丰富的功能集 ...

  8. docker nginx 配置负载均衡

    在上篇的文章中我们介绍了docker nginx配置简单的代理 在这篇文章我们介绍docker 利用nginx配置负载均衡 所谓的负载均衡是两台服务器,或者是多台服务器上面部署项目,但是访问的方式是通 ...

  9. python修改nginx配置文件_zookeeper 动态管理nginx配置

    假设我们有一个场景,所有服务器共享同一份配置文件,我们肯定不可能单独手动维护每台服务器,这时可以利用zookeeper的配置管理功能. 环境:python + nginx + zookeeper 目的 ...

最新文章

  1. Repeater分页代码
  2. 计算机巨星陨落!图灵奖得主 Edmund Clarke 因感染“新冠”逝世
  3. 打开AD组策略编辑器提示“strings区段项目太长被截断”的解决
  4. NYOJ 613 免费馅饼
  5. C#中多线程同步的Monitor理解
  6. c语言ungetc参数,关于一些C语言标准I/O函数的见解。int ungetc(int ch,FILE *fp)函数...
  7. 三、linux目录浏览管理及维护
  8. 牛客网 【每日一题】6月11日题目精讲 背包
  9. java 中的正则表达式_Java中的正则表达式–软介绍
  10. LeetCode 20. 有效的括号 golang(三)
  11. for循环与each的区别
  12. layui 复选框checked获取值和赋值
  13. 程序员转项目管理之考证PMP
  14. 硬盘属于计算机的主存吗,.硬盘装在主机箱内,因此硬盘属于主存对吗
  15. Android移动应用技术打地鼠小游戏(简单App实现)——学习成果
  16. nyoj239 月老的难题 (匈牙利算法,最大匹配,邻接表)
  17. html-css-边框样式
  18. 输出青蛙跳台所有路径
  19. sfsfdgsdfg
  20. 蜂鸣器制作“ 孤勇者 ”音乐

热门文章

  1. 前端学习(3178):ant-design介绍1
  2. 前端学习(3061):vue+element今日头条管理-接口分页参数说明
  3. 前端学习(2902):javascript浏览器的历史
  4. PS教程第二十三课:套索工具
  5. [css] 请描述css的权重计算规则
  6. 前端学习(2567):指令的本质
  7. 前端学习(2440):axios处理文章数据
  8. “睡服”面试官系列第八篇之iterator(建议收藏学习)
  9. 前端学习(1512):vue-router文档
  10. java学习(41):成员实例的定义和访问续