记录一次nginx+Websocket反向代理时报错504-gateway TimeOut和各种开发遇到的坑(wss链接404、ws链接400 bad Requset等等)

这篇具有很好参考价值的文章主要介绍了记录一次nginx+Websocket反向代理时报错504-gateway TimeOut和各种开发遇到的坑(wss链接404、ws链接400 bad Requset等等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、场景

需要反向代理转发websocket链接。

2、问题原因

1、nginx路径未匹配上
2、链接上后,在默认的http链接时长中没有发送心跳包,nginx自动关闭http链接,一般默认为1分钟
3、http链接转发后并没有升级为websockt链接(Bad Request 400错误)
4、websocket长链接1分钟后自动关闭
5、wss链接通过nginx转发时,$http_upgrade未取到值,导致转到服务器缺少Upgrade请求头,未识别为websocket链接,导致链接404报错(具体体现:ws链接正常,wss链接404)

3、解决方法

1、路径未匹配

检查nginx路径配置,如下配置:
正确匹配地址:ws://localhost:8080/websocket/xxx
如果是location /websocket {…}
ws://localhost:8080/websocket/xxx这个地址是匹配不到的,就会报504错误(开启access_log日志可看到)。

worker_processes 1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    #日志输出格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$host:$server_port" "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
    #记录nginx日志
    access_log  logs/access.log  main;
    server {
		listen 8080; 
		server_name localhost;
		
        location /websocket/ {
            proxy_pass http://127.0.0.1:8808/; 
            proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
        }
    }
}

2、未发送心跳包

1、js文件发送心跳,写一个定时器定时发送心跳信息

    var ws;
    ws = new WebSocket("ws://127.0.0.1:8808/websocket/a");

    var heartCheck = {
        timeout: 20000,//20ms,后台设置了60秒过期
        timeoutObj: null,
        serverTimeoutObj: null,
        reset: function(){
            clearTimeout(this.timeoutObj);
            clearTimeout(this.serverTimeoutObj);
            this.start();
        },
        start: function(){
            var self = this;
            this.timeoutObj = setTimeout(function(){
            	ws.send("心跳信息");
                self.serverTimeoutObj = setTimeout(function(){
                    ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
                }, self.timeout);
            }, this.timeout)
        },
    }

	function initWebSorket() {
	    ws.onopen = function () {
	            console.log("连接成功。");
	            heartCheck.start();
	        };
	        ws.onmessage = function (evt) {
	            console.log("发送消息。");
	            heartCheck.reset();
	        };
	        ws.onclose = function (){
	            console.log("连接关闭");
	            reconnct();
	        };
	        ws.onerror = function (){
	            console.log("连接异常");
	            reconnct();
	        };
	}
	
    function reconnct() {
        ws = null;
        ws = new WebSocket("ws://127.0.0.1:8808/websocket/a");
        console.log("重新链接");
        initWebSorket();
    }    

3、转发请求配置为websocket链接

配置三行请求头升级为websocket链接
nginx官网文档配置websocket:http://nginx.org/en/docs/http/websocket.html

		# 动态决定connection的值,当$http_upgrade为默认值时,则connection的值为keep-alive。当$http_upgrade为websocket时,connection的值为upgrade
		map $http_upgrade $connection_upgrade { 
        	default          keep-alive;  #默认为keep-alive 可以支持 一般http请求
        	'websocket'      upgrade;     #如果为websocket 则为 upgrade 可升级的。
    	}

        location /websocket/ {
            proxy_pass http://127.0.0.1:8808/; 
            #配置以下三行即可
            proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection $connection_upgrade;
        }

4、配置nginx中的读取超时参数

nginx转发请求默认读取数据超时时间为1分钟

        location /websocket/ {
            proxy_pass http://127.0.0.1:8808/; 
            #配置以下三行即可
            proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
            proxy_read_timeout 300;
        }

5、wss链接通过nginx转发时,$http_upgrade未取到值,导致转到服务器缺少Upgrade请求头,未识别为websocket链接,导致链接404报错(具体体现:ws链接正常,wss链接404)

        location /websocket/ {
            proxy_pass http://127.0.0.1:8808/; 
            #配置以下三行即可
            proxy_http_version 1.1;
            # 直接固定Upgrade的值
			proxy_set_header Upgrade "websocket"
			proxy_set_header Connection "upgrade";
            proxy_read_timeout 300;
        }

其他错误

1、使用wss协议报错

报错信息

VM338:1 Mixed Content: The page at ‘https://blog.csdn.net/hfismyangel/article/details/82758629’ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ‘ws://ip:端口’. This request has been blocked; this endpoint must be available over WSS.

问题原因

1、本身页面的连接为https连接,所以不能用ws协议
解决方法:打开http页面,就可以使用ws协议了

公网服务器注意事项(使用wss协议)

1、服务器未对目标服务开放端口443
解决方法:打开控制面板-安全-防火墙-出入站规则-入站规则-开放端口即可
2、腾讯云安全组未开放端口(腾讯服务器)
解决方法:打开腾讯云服务器管理后台,开放端口即可文章来源地址https://www.toymoban.com/news/detail-613142.html

到了这里,关于记录一次nginx+Websocket反向代理时报错504-gateway TimeOut和各种开发遇到的坑(wss链接404、ws链接400 bad Requset等等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nginx 和gateway配置实现动静分离和反向代理

    这两个配置文件分别是Nginx和Spring Cloud Gateway的配置文件,它们用于构建网关服务,进行请求的路由和转发。 前端发送请求的时候为了不暴露服务器地址,所以会使用nginx做反向代理的一个主要作用是隐藏后端服务器的真实地址,从而增加网络安全性和隐私。当客户端发送请求

    2024年02月06日
    浏览(27)
  • nginx反向代理502-Bad Gateway问题解决方法

    用nginx反向代理 localhost:80 域名到服务器 localhost:8080 端口服务时,访问出现502 bad gateway 原因分析: 1.查看8080端口服务启动 2.查看错误日志:error.log,以centos7.x为例: 192.168.10.202 - - [08/May/2023:20:53:43 +0800] \\\"GET /jenkinsx/ HTTP/1.1\\\" 502 3693 \\\"-\\\" \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53

    2024年02月06日
    浏览(76)
  • Nginx反向代理出现错误 502 bad gateway 案例解析

    Nginx + uwsgi + flask Flask框架写的程序,使用uwsgi启动,Nginx作为反向代理调用Flask应用。 Flask应用有些操作时间比较长,会超过1分钟,在网页端访问会出现错误: 502 bad gateway。 Nginx的错误日志中会出现错误:upstream prematurely closed connection while reading response header from upstream 经过网上

    2024年02月08日
    浏览(29)
  • 宝塔反向代理后报错:502 Bad Gateway nginx

    我应该跟这个问题差不多,解决方案也来自这里: 在反代的时候没有强制指定SSL协议,导致SSL握手失败,在反代配置中添加上相关的配置就好:

    2024年02月12日
    浏览(33)
  • 一次说清-Nginx反向代理及参数配置

    我们在配置服务时常常会用到Nginx来设置反向代理,虽然常用,但是我们真的了解各个参数的意思吗? 不如我们一起来看下吧。 反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的

    2024年02月12日
    浏览(24)
  • nginx反向代理webSocket程序并配置SSH端口

    需求背景:当前有个网页版的XShell项目(webSocket程序同理),需要使用到nginx做反向代理 XShell项目是Java开发的,端口为: 9017 ,与nginx部署在同一台Linux中 在sbin文件夹中,执行命令: 查看是否出现 configure arguments: --with-stream 存在上述参数,证明支持SSH,如: 不存在上述参数,

    2024年02月12日
    浏览(30)
  • 微服务Gateway网关(自动定位/自定义过滤器/解决跨域)+nginx反向代理gateway集群

    目录 Gateway网关 1.0.为什么需要网关? 1.1.如何使用gateway网关 1.2.网关从注册中心拉取服务 1.3.gateway自动定位 1.4.gateway常见的断言 1.5.gateway内置的过滤器 1.6.自定义过滤器-全局过滤器 1.7.解决跨域问题 2.nginx反向代理gateway集群 2.1.配置文件 继  nacos注册中心+Ribbon负载均衡+完成

    2024年02月06日
    浏览(44)
  • 如何使用宝塔面板配置Nginx反向代理WebSocket(wss)

    本章教程,主要介绍一下在宝塔面板中如何配置websocket wss的具体过程。 目录 一、添加站点 二、申请证书 三、配置代理  1、增加配置内容

    2024年02月21日
    浏览(33)
  • JAVA开发(记一次504 gateway timeout错误排查过程)

    一、问题与背景: 最近在发布一个web项目,在测试环境都是可以的,发布到生产环境通过IP访问也是可以的,但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通,域名却不行,百思不得其解。通过一顿百度搜索,解析说通过nginx配置文

    2024年02月11日
    浏览(31)
  • 解决504 GATEWAY TIMEOUT Nginx网关超时

    最近遇到一个问题504 GATEWAY TIMEOUT的问题,在浏览器的NetWork里面看是这个效果。时间大概是60s。 目前后端技术架构主要是nginx和php-fpm,前端主要是vue框架打包发布。 于是首先想到了是nginx超时时间或者与php的超时时间设置的过段,然后配置nginx.conf设置了这些参数。 然后发现

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包