不少小伙伴已经在使用Stable Diffusion;通过访问地址127.0.0.1:7860。不过要实现外部网,或者局域网其他设备可以访问,应该怎么做?
通常外网反问分两种情况,一种情况估计是公司级别的部署,通过租赁带有GPU处理器的服务器,实现公网访问。
其次是个人玩家,以自己电脑作为服务主机。但是发现除了本台电脑反问,其他局域网设备无法访问。那应该如何做?
一、局域网设备可以访问:
commandline_args = os.environ.get('COMMANDLINE_ARGS', "--listen")
commandline_args = os.environ.get('COMMANDLINE_ARGS', "--listen --gradio-auth 用户名:密码")
这样局域网其他电脑、手机可以通过访问局域网地址即可访问,比如部署的电脑ip为:192.168.1.100;那么其他设备通过访问:192.168.1.100:7860即可。
二、外部网络访问自己主机
如果自己拥有NAS群晖,且有域名,自己实现了DDNS动态访问主机 。那么可以通过真正外网访问域名+端口(7860)访问。当然一些路由器也可以不一定一定用群晖。以群晖为例,做了反向代理,访问本地部署stable diffusion的主机。只是很多小伙伴做了反向代理,外部网络也访问成功了。发现作图时候,提示错误。经过浏览器控制台查询报错:WebSocket connection to 'wss://tiven.cn/ws/xxx' failed:。其实这个是Nginx 反向代理时候的错误。
WebSocket 协议与 HTTP 协议不同,但 WebSocket 握手与 HTTP 兼容,使用 HTTP 升级工具将连接从 HTTP 升级到 WebSocket。这允许 WebSocket 应用程序更容易地适应现有的基础架构。例如,WebSocket 应用程序可以使用标准 HTTP 端口80和443,从而允许使用现有的防火墙规则。
WebSocket 应用程序可以在客户端和服务器之间保持长时间运行的连接,从而有助于开发实时应用程序。 Nginx 反向代理用于将连接从 HTTP 升级到 WebSocket 的 HTTP 升级机制使用 Upgrade 和 Connection 头 。反向代理服务器在支持 WebSocket 时面临一些挑战。一个是 WebSocket 是一个逐跳协议,因此当代理服务器拦截客户端的升级请求时,需要向后端服务器发送自己的升级请求,包括相应的头文件。此外,由于 WebSocket 连接长期存在,与 HTTP 使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。
允许在客户机和后端服务器之间建立隧道,Nginx 支持 WebSocket。对于 Nginx 将升级请求从客户端发送到后台服务器,必须明确设置 Upgrade 和 Connection 标题。
总的来说,就是使用 Nginx 反向代理 WebSocket 服务时需要设置 Upgrade 和 Connection 的 header。
nginx 配置 出现报错时的配置 location /ws { 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 X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9000/ws; }
反向代理成功的配置 location /ws { 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 X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9000/ws; # 关键配置 start proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 关键配置 end }
当然有群晖不用去找文件改,直接在反向代理中选择指定设定的反向代理,点击进入,然后点击自定义标题——>新增——>WebSocket 然后保存即可。
评论列表 (条)