nginx 配置 http/2(h2) 和 http 在同一端口的问题
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 在同一端口的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从0开始学Java——JSPServle
- 下一篇: 2020.9.28 爱客影视3.6.5