我在服务器上使用Ratchet websocket。它在没有SSL的情况下工作得很好,但我需要让它与SSL一起工作。
我读过这篇stackoverflow的帖子。不幸的是,我的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仅在服务器中可用config和虚拟主机上下文。"
因此,如果你不能在服务器配置中添加这一行,它会是添加到虚拟主机上下文中?
他们的答案:
由于我再次查看了服务器级别上的所有设置包括Apache模块和防火墙规则,以使Ratchet能够在服务器上运行的websocket还有我们所拥有的规则在防火墙中添加表示所有来自外部的流量允许在港口8000,我相信这应该足以允许websocket的外部连接。
截至目前,您似乎正在尝试使用不同的端口(在https的情况下)。由于我们已经查看了服务器设置和配置,一切似乎都很好。
如果您能让开发人员参与进来,我们将不胜感激这样他就可以更好地指导你,因为他知道代码级别事情好多了。
现在尝试连接ws将抛出:
到"的WebSocket连接wss://127.198.132.141/wss2/'失败:WebSocket打开握手已取消
而将http与ws一起使用效果良好。
在您的虚拟主机中添加:
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