我在服务器上使用Ratchet websocket。没有SSL的情况下,它运行良好,但我需要使其与SSL一起工作。

我已经读过这个stackoverflow post。不幸的是,我的PAAS的支持不使用httpd.conf。他们建议我直接在.htaccess中添加ProxyPass。


  关于在httpd.conf文件中添加以下行,然后在这里我
  谨此通知,我们未在服务器上使用httpd,因为
  服务器基于Debian,我们正在使用Apache Web服务器。我相信
  您可以在htaccess文件中使用同一行,如果
  您可以就此向开发商咨询。


# ProxyPass for Ratchet with SSL
ProxyPass /wss2/ ws://127.198.132.141:8000/

# Preventing the app from being indexed
Header set X-Robots-Tag "noindex, nofollow"

# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex app.php

# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options FollowSymlinks

# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve
# to the front controller "/app.php" but be rewritten to "/app.php/app".
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    [...]


不幸的是,添加ProxyPass / wss2 / ws://127.198.132.141:8000 /会使服务器崩溃,就好像.htaccess不正确一样。

您有任何解决方案或提示吗?

更新:

据我了解,我们不能在.htaccess中使用ProxyPass,它只能在服务器配置或虚拟主机配置中使用。

我试图向支持人员解释这一点,但他们似乎并不了解。


  因此,显然禁止在.htaccess中使用ProxyPass。
  
  “ ProxyPass和ProxyPassReverse仅在服务器中可用
  配置和虚拟主机上下文。”
  
  因此,如果您无法在服务器配置中添加此行,是否可以
  在虚拟主机上下文中添加?


他们的答案:


  由于我再次查看了服务器级别的所有设置,
  包括Apache模块和防火墙规则,以使棘轮
  能够在服务器上运行的websockets还有我们拥有的规则
  在防火墙中添加表示所有来自外部的流量都是
  允许在端口8000上使用,我认为这应该足以
  允许websocket进行外部连接。
  
  截至目前,您似乎正在尝试使用
  不同的端口(对于https)。由于我们已审查服务器
  设置和配置,一切似乎都不错。
  
  如果您可以让开发人员参与,将不胜感激。
  这个过程,这样他就可以更好地指导您,因为他知道代码级别
  情况要好得多。


现在尝试与wss连接将会抛出:


  WebSocket连接到'wss://127.198.132.141/wss2/'失败:
  WebSocket打开握手被取消


与ws一起使用http时效果很好。

最佳答案

在您的虚拟主机中添加:

ProxyPass /wss2/ ws://yourdomain.xxx:8888/
(尝试使用端口8888)

不要忘记重启apache服务

虚拟主机示例:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        <Directory /var/www/html/>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <IfModule mod_dir.c>
            DirectoryIndex index.php index.pl index.cgi index.html index.xhtml index.htm
        </IfModule>

SSLCertificateFile /etc/letsencrypt/live/yourdomain.xxx/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.xxx/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ServerName yourdomain.xxx
ProxyPass /wss2/ ws://yourdomain.xxx:8888/
</VirtualHost>
</IfModule>


在这里您可以找到完整的工作示例
https://github.com/ratchetphp/Ratchet/issues/100

09-07 20:34