前言
因为之前在使用某些软件的时候发现有部分软件只监听 localhost ,导致服务无法在公网上正常访问。然而我并不想修改软件的配置文件,而且有的软件修改配置文件可能出现暗坑,所以我选择了 websocket 的方式将他们开放到公网,因为这种方式更具备通行性。
就在前几天发现某款软件也是默认监听的 localhost ,如果我是在本地使用也就算了,可是我是在服务器上使用它,所以轻车熟路的使用上了 websocket 将它反向代理到了公网。
在反向代理的的时候你可以在代理层套上 ssl 以保证链接的安全性,但是不能使用 http 登录认证,登录认证可以在被代理的软件上进行设置。
安装 nginx
websocket 我使用的是 nginx 的实现,所以我们需要先安装它。
本次安装在 debian9 下进行,当然你也可以使用其他发行版进行安装,比如 ubuntu 就可以完全参考本教程。因为 ubuntu 基于 debian 进行修改。本来是打算写 fedora 和 centos 的,写到一半我就全删了。fedora 还好,centos 配置步骤稍微复杂一点,所以不想写了。在这里说句题外话,centos 是真的不适合个人使用。
nginx 的配置文件是通用的 所有 linux 发行版均可通用。
** debian 安装 nginx **
更新软件源:
sudo apt update
安装 nginx:
sudo apt install -y nginx
配置 websocket 反向代理
如果只是自用的话只直接怼到公网接口就行,不用配置 ssl ,前提是你需要调好防火墙只允许你允许的人进行访问。
接下来就正式开始 websocket 了
首先创建配置文件 配置文件的存放位置在 /etc/nginx/conf.d/
之下。这个文件夹的作用就是用来存放用户配置文件的,所有 linux 发行版打包的 nginx 都可以在这里写配置文件。这个文件夹存在的意义就是消除不同发型版之间存在的打包分歧。
用你喜欢的编辑器在 /rtc/nginx/conf.d/下创建配置文件,配置文件以 .conf
结尾。例如 : sudo vim /etc/nginx/conf.d/ws.conf
然后写入以下内容,以下内容只管抄来用,需要修改的地方我会注释说明 # 开头的为注释
server {
listen 3000;
# 监听的公网端口,可选范围为 1 到 65535,注意不要占用已有端口就行
access_log /var/log/nginx/ws.access.log;
# 日志名
error_log /var/log/nginx/ws.error.log;
# 错误日志名
charset utf-8;
# 防止浏览器乱码,乱码的原因可能是被代理软件未写 html 属性
location / { #保险起见直接给 一个 / 当然也可以给子目录
# 以下是 websocket 的配置内容
proxy_hide_header X-Powered-By;
proxy_redirect off;
proxy_pass http://localhost:5000;
#目标地址,这里必须修改为你需要代理的软件开放的端口
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}
配置文件写入后需要测试一下确认无报错后,再重启nginx 加载新的配置文件
sudo nginx -t
不出意外的话应该会打印以下内容,如果有报错的话请再检查一下刚才写入的配置文件是否有错误的地方
[email protected]:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[email protected]:~$
然后重启 nginx 以加载刚才写入的配置文件,不要使用 sudo nginx -S reload
这个只适用于 http 范围,更广阔的范围请直接重启 nginx
sudo systemctl restart nginx.server
到这里 websocket 反代就设置完成了
访问被代理的软件
由于我们无法在外部访问本机回环,所以我们使用了 websocket 反代了 本机回环到外网端口。
比如我们需要访问 http://localhost:5000
的时候,直接在 浏览器里输入 你的公网 ip:3000 就行了,类似于这样 http://26.26.26.26:3000
参考
在我的另外一篇博文 jupyter 安装教程 有 websocket 的实践