在Apache上设置websocket?

28 apache websocket

所以我正在做一些关于websockets的研究,我有一些问题似乎无法找到明确的答案:

  • 如何在Linux服务器上设置Web套接字?有Apache模块吗?我是否必须使用第三方PHP代码或类似代码?

  • 问题1中描述的方法是否存在任何缺点,除了浏览器兼容性之外我应该注意哪些?

  • 我怎样才能将我的websocket安装"升级"到安全的websocket安装(ws:// to wss://)?如果已在我的Apache服务器上设置SSL,这会变得更容易还是更难?

  • 除了JavaScript之外,还有什么语言可以用来连接我的网络套接字吗?

  • Web套接字的默认请求方法是什么?

Udo*_*Udo 29

Apache HTTP Server的新版本2.4有一个名为mod_proxy_wstunnel的模块,它是一个websocket代理.

http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html

  • 您需要启用`mod_proxy`和`mod_proxy_wstunnel`模块,并在_httpd.conf_文件中添加`ProxyPass/wss2/ws:// YOUR_DOMAIN:WS_PORT /`.在JS调用中使用带端口号url的安全方案(例如`var ws = new WebSocket("wss:// YOUR_DOMAIN/wss2/NNN");`[参见参考资料](http://stackoverflow.com/questions/ 16979793/PHP-棘轮的WebSocket-SSL-连接/ 28393526#28393526) (8认同)

eep*_*epp 24

我无法回答所有问题,但我会尽力而为.

如您所知,WS只是一个持久的全双工TCP连接,带有帧消息,其中初始握手类似于HTTP.您需要一些服务器正在侦听传入的WS请求并将处理程序绑定到它们.

现在有可能使用Apache HTTP Server,我已经看到了一些例子,但是没有官方的支持而且它变得复杂了.Apache会做什么?你的经纪人在哪里?有一个模块可以将传入的WS请求转发到外部共享库,但是使用其他很棒的工具来处理WS并不是必需的.

WS服务器趋势现在包括:Autobahn(Python)和Socket.IO(Node.js =服务器上的JavaScript).后者还支持其他hackish"持久"连接,如长轮询和所有COMET的东西.还有其他鲜为人知的WS服务器框架,如Ratchet(PHP,如果你只是熟悉它).

在任何情况下,您都需要侦听端口,当然该端口不能与您机器上已运行的Apache HTTP Server相同(默认值= 80).你可以使用像8080这样的东西,但即使这个特定的一个是一个流行的选择,一些防火墙可能仍会阻止它,因为它不应该是Web流量.这就是为什么许多人选择443,这是HTTP安全端口,由于显而易见的原因,防火墙不会阻止.如果您不使用SSL,则可以使用80表示HTTP,使用443表示WS.WS服务器不需要是安全的; 我们只是在使用这个端口.

编辑:根据Iharob Al Asimi的说法,前一段是错误的.我没有时间对此进行调查,所以请查看他的工作以获取更多详细信息.

关于协议,如 维基百科所示,它看起来像这样:

客户发送:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com
Run Code Online (Sandbox Code Playgroud)

服务器回复:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Run Code Online (Sandbox Code Playgroud)

并保持连接活着.如果您可以实现此握手和基本消息框架(使用描述它的小标头封装每条消息),那么您可以使用您想要的任何客户端语言.JavaScript仅用于Web浏览器,因为它是内置的.

正如您所看到的,默认的"请求方法"是一个初始的HTTP GET,虽然这不是真正的HTTP,并且在握手之后会丢失与HTTP相关的所有内容.我想服务器不支持

Upgrade: websocket
Connection: Upgrade
Run Code Online (Sandbox Code Playgroud)

将回复错误或页面内容.

  • 我拒绝投票,因为**当然,它可以与apache用于常规HTTP的端口相同。 (2认同)
  • 事实上,我成功地编写了一个 apache 模块来处理 WS 协议握手并与另一个程序通信,用您的话来说就是“*处理程序*”。这真的很简单,而且很强大。哦,它使用端口 80。实际上这是 javascript websocket API 中的默认端口。 (2认同)

Sun*_*mar 9

我很难理解https 的 websockets代理设置,因此让我在这里澄清一下我的认识。

首先,您需要启用proxyproxy_wstunnelapache 模块,并且 apache 配置文件将如下所示。

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
      ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/your_project_public_folder

      SSLEngine on
      SSLCertificateFile    /etc/ssl/certs/path_to_your_ssl_certificate
      SSLCertificateKeyFile /etc/ssl/private/path_to_your_ssl_key

      <Directory /var/www/your_project_public_folder>
              Options Indexes FollowSymLinks
              AllowOverride All
              Require all granted
              php_flag display_errors On
      </Directory>
      ProxyRequests Off 
      ProxyPass /wss/  ws://example.com:port_no

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

在您的前端应用程序中使用 url"wss://example.com/wss/"这非常重要,主要是如果您被 websockets 卡住了,您可能会在前端 url 中出错。您可能像下面那样错误地放置了 url。

wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important
Run Code Online (Sandbox Code Playgroud)

同样有趣的部分是最后/wss/一个与proxypassvalue相同,如果你写proxypass /ws/那么在前端你应该写/ws/在 url 的末尾。