我有一个网络服务器,它通过端口 20000 上的八位字节流为客户端提供服务(它实际上是一个由 node.js 托管的 socket.io 服务器)。这是在共享主机帐户上运行的,常规 Apache 服务器在端口 80 上运行(无法关闭,因此 socket.io 服务器在端口 20000 上)。由于防火墙等原因,我不能指望用户能够连接到端口 20000(或 80 以外的任何其他端口)。 那么,我如何使用来自 Apache 服务器(有点像反向代理)的 socket.io 服务器生成的八位位组流为客户端提供服务?不幸的是,我不能在我的 Apache 服务器上使用 mod_proxy,因为有限制我的托管计划。我想我可以用一个以某种方式打开套接字的 PHP 页面来做到这一点。
更新:我还在我的服务器上安装了适用于 Python 3 的 Django,这可能很有用。请注意,代理不能简单地请求目标页面并将其返回给客户端,因为数据必须实时传输。
最佳答案
关于“它不能简单地返回目标页面”……这是不正确的,因为这就是 HTTP 代理的全部内容。大多数协议(protocol)代理使用套接字(相对于文件或管道)并简单地将数据从套接字复制到套接字。 HTTP 代理做同样的事情,除了每个 HTTP 请求都需要握手,所以代理在到达有效负载之前需要来回发送一些数据包。您可以在 django 中非常轻松地创建一个 HTTP GET 代理。 POST 代理需要额外的步法。
我不熟悉 Socket.IO,但经过研究... how does socket.io work? ...它似乎只使用“旧的”HTTP 功能并将所有内容作为 REST 运行。 REST 被封装为持久套接字内的传输。
如果您在 Django 中寻找 TCP 或 IP 级代理,它不会发生。你的 apache 服务器,然后是 WSGI/CGI/任何关闭你的 TCP 套接字的东西。您能够访问它的唯一方法是对服务器的这些部分具有足够的权限。
这就是我要做的......在 django 中制作一个捕获 socket.io api 的 url 模式,并让它连接到一个 View ,该 View 执行如下操作(未经测试的伪代码):
import urllib2, mimetypes
from django.http import HttpResponse
def ForwardToSocketIO(request):
# Capture the URL pattern
path = request.get_full_path()
# Create a URL opener
response = urllib2.urlopen('http://localhost:20000%s' % path)
# Capture and return response
django_response = HttpResponse(response.read())
django_response['Content-Type'] = 'octet-stream'
return django_response
希望这对您有所帮助。我没有可用的八位字节流,因此很抱歉没有进行测试。
关于php - 使用 PHP 或 Django 在 Apache 中重定向八位字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30465223/