选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2022-05-13
  • 更新:2022-05-13
jenkins 使用websocket 连接时,提示 io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error 的解决方法


最开始没考虑到 jenkins 会使用 websocket, 于是nginx这样简单地写了

  1. location / {
  2. proxy_pass http://localhost:8080;
  3. }

结果发现在使用 jenkins 的命令行客户端或者节点上线时使用 websocket 时,会报错

  1. 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 的相关头信息

  1. map $http_upgrade $connection_upgrade {
  2. default upgrade;
  3. '' close;
  4. }
  5. /**
  6. map指令的作用:
  7. 该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade,
  8. 创建的规则就是{}里面的东西。其中的规则没有做匹配,因此使用默认的,即 $connection_upgrade 的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话,
  9. 那值会是 close。
  10. */
  11. server {
  12. 。。。。。。。。。。
  13. location / {
  14. proxy_read_timeout 300s;
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. proxy_http_version 1.1;
  19. proxy_set_header Upgrade $http_upgrade;
  20. proxy_set_header Connection $connection_upgrade;
  21. }
  22. }

这里最重要的是最后三行,然后nginx -s reload 一切都正常工作了,启用了防火墙也是可以工作的。

但是比较奇怪的就是如果不用防火墙,不管设不设置 headers, 都是可以使用了,如果要用防火墙则必须要设置 headers, 估计是防火墙没识别到是长链接给链接close掉了? 总之解决办法就是像上面设置好 nginx 就好了

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-x86zov.jpg