解决 nginx 代理 1Panel 后远程无法 ssh

解决 nginx 代理 1Panel 后远程无法 ssh

同步发布在个人笔记解决 nginx 代理 1Panel 后远程无法 ssh

问题描述

管理面板 1Panel 有 ssh 连接服务器终端的功能,在服务器本地设置好这一功能,之后我们通过 nginx 的端口转发代理 1Panel 的服务。此时我们发现通过 nginx 代理的 1Panel 日志里显示 ssh 成功了,但是终端界面一直提示 disconnected。

解决方法

官方文档里对这个问题有解决方案:使用自建 Nginx 反向代理 1Panel,导致主机和容器终端均不能正常使用。

在这里记录一下。

只需在代理 1Panel 的 nginx 配置文件里增加下面的配置:

bash 复制代码
location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

即可解决。

方法解析

由于添加的是上面这三句,我怀疑 1Panel 的 ssh 功能是走的 websocket 协议, nginx 反向代理 websocket 协议时,就需要添加这三句。

那么为什么是这三句呢?每一句又分别作用于什么?

第一句proxy_http_version 1.1;是声明协议,使得下面的配置可用。

下面两句都是为了设置两个请求头 ,分别是Upgrade 和Connection。设置好这两个,后端的 1Panel 程序才知道要建立 websocket 连接来传输数据了。

  • Upgrade
    标识传输协议要升级/转换 ,如果是要转换为 websocket协议的话,此处的值就应该是 websocket。这个请求头代表客户端希望建立 websocket 协议进行通信, 后端的程序取到头信息后会返回101状态码(协议转换),然后就会建立 websocket 通信了。
  • Connection
    此处 Connection 头信息取值upgrade,这表明这次客户端请求是要求进行协议升级/转换 的请求。升级成什么协议呢?配合上一个配置句,是升级成websocket协议,这样请求就完全了。

最后一个疑问:为什么一旦用 nginx 代理了,就需要设置这些了呢?不代理的时候不是好好的么?

答:这是因为这些请求头都是逐跳标头 。意思就是这些标头都只能传递一层,不能透传,是逐级传递的。

当客户端直接于 1Panel 通信时,请求头能被后端接收到,所以一切正常;但是使用了 nginx 代理后,请求头就只能到 nginx 这一层,传递不到后端,我们就需要让 nginx 把请求头传递下去,形成逐层跳传,这样后端才能成功收到客户端的请求,实现协议的升级/转换。

参考Nginx反向代理websocket。

相关推荐
Ruiery2 分钟前
Linux 6.6内核 CPU 深度解析(零):x86 内核引导协议 — 从 bootloader 到 main()
linux·运维·服务器
Ruiery2 分钟前
Linux 6.6内核 CPU 深度解析(十六):x86 保护机制 — 从 ring 到页表的权限防线
linux·运维·服务器
不老刘40 分钟前
异构双 Agent 协同:构建无人值守的长任务自动化研发流水线
运维·人工智能·自动化·ai编程·1024程序员节
织码weavecodes1 小时前
医疗、零售、物业培训怎么落地?织码在线教育系统的三类行业案例
运维·服务器·零售
智能运维指南1 小时前
企业运维监控平台哪家好?2026年五大全栈可观测方案对比与选型推荐
大数据·运维·人工智能
乔旭伟1 小时前
部署形态选型笔记:多租户 SaaS 与单机本地部署的运维模型对比
运维·服务器·1024程序员节
姜鱼问生2 小时前
大屏突然 502?一次 Nginx Buffer 溢出引发的血案:upstream sent too big header
运维
深圳市恒星物联科技有限公司2 小时前
排水管网监测后期运维成本高吗?成本构成与控制策略分析
运维·缓存
杜哥无敌3 小时前
连接服务器干活的终端 / SSH 客户端工具大 PK
ssh·1024程序员节·云主机
AIex-YH3 小时前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式