因为记不住不想记服务器IP,给宝塔的控制面板加了一个域名,并配置了反向代理,发现用域名访问的时候,终端功能没法使用,安装插件时候控制台打印信息也没法在网页显示,而使用IP地址加面板端口的方式访问一切正常。浏览器F12发现是websocket连接不上,再三搜索终于找到了解决方法。
1 准备
拥有一个解析好的域名,已经安装好了宝塔面板的主机,可用的nginx
2 在宝塔添加站点并配置反向代理
2.1 添加站点
使用IP加端口号方式登录宝塔面板,添加一个站点,使用要用来访问宝塔的域名,PHP版本选择纯静态,目录等选项默认就好。
2.2 申请免费的Let’s Encrypt证书开启HTTPS(可选)
配置过程中发现一旦先配置了反向代理,宝塔就不再允许申请SSL证书了,有HTTPS需求的话还是先申请一个证书,再设置反向代理比较好。当然自己之后用其他方式申请证书也行,不过我觉得还是用宝塔申请的话,管理比较方便一些。
2.3 配置反向代理
目标URL填127.0.0.1
加你自己配置的宝塔面板端口(没修改就是8888
),**发送域名填默认$host
就可以,点击保存。
3 配置websocket
3.1 原因解释
在某些情况下,当 Nginx 作为反向代理服务器时,后端服务器可能需要使用 WebSocket 或其他需要长连接的协议。为了支持这样的协议,需要将连接协议设置为 “upgrade”。
通过设置 proxy_set_header Connection “upgrade”;,Nginx 将会将传入请求的 Connection 头字段设置为 “upgrade”,从而允许后端服务器将连接协议升级为长连接。
3.2 站点配置(方法1、2任意选其一)
方法1 只配置用到websocket的路径
nginx官网文档
我们需要定义map,backend,并配置location,匹配使用websocket的访问路径。
站点配置文件添加以下内容
1 2 3 4 5 6 7 8 9
| map $http_upgrade $connection_upgrade { default upgrade; '' close; }
upstream wss { server localhost:10000; }
|
站点伪静态选择default,添加以下location路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| location /webssh { proxy_pass http://wss; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }
location /sock_shell { proxy_pass http://wss; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }
location /workorder_client { proxy_pass http://wss; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }
location /ws_panel { proxy_pass http://wss; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }
location /ws_project { proxy_pass http://wss; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }
|
这些代理的路径可以从宝塔开源仓库中的源文件_init_.py中websocket部分找到。
方法2 直接将连接协议全部升级为长连接
宝塔中添加反向代理,按以下例子编辑配置即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| location ^~ / { proxy_pass http://127.0.0.1:17857; 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_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status; }
|
配置完之后保存,并从面板重启nginx服务。保存出错的话,重新编辑,仔细检查语法错误。
4 域名登录面板
发现终端已经可以正常使用,websocket连接正常