- 作者:
- 分类:知识&开发->Web->部署&运维
- 阅读:1158
- 点赞:2
- 版权:CC BY-SA 4.0
- 创建:2022-05-13
- 更新:2022-05-13
jenkins 使用websocket 连接时,提示 io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error 的解决方法
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接(持续更新):https://neucrack.com/p/425
原文链接(持续更新):https://neucrack.com/p/425
最开始没考虑到 jenkins 会使用 websocket, 于是nginx
这样简单地写了
location / {
proxy_pass http://localhost:8080;
}
结果发现在使用 jenkins 的命令行客户端或者节点上线时使用 websocket 时,会报错
io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error.
很明显,这个报错来自于 jenkins程序, 也就是说中间可能某些数据出错了, 最开始以为是端口不对,于是先把防火墙关了,直接使用了 ubuntu 的 ufw disable
关闭, 发现竟然可以使用了, 那意思是端口错了,于是查看了下 ufw (ufw logging full/high/medium/low/off
)的日志(/var/log/ufw*
),但是貌似没有看到拦截日志,这个现象看起来就很奇怪,于是百度了一下,给 nginx 配置加了转发 websocket 的相关头信息
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
/**
map指令的作用:
该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade,
创建的规则就是{}里面的东西。其中的规则没有做匹配,因此使用默认的,即 $connection_upgrade 的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话,
那值会是 close。
*/
server {
。。。。。。。。。。
location / {
proxy_read_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
这里最重要的是最后三行,然后nginx -s reload
一切都正常工作了,启用了防火墙也是可以工作的。
但是比较奇怪的就是如果不用防火墙,不管设不设置 headers, 都是可以使用了,如果要用防火墙则必须要设置 headers, 估计是防火墙没识别到是长链接给链接close掉了? 总之解决办法就是像上面设置好 nginx 就好了