【问题标题】:apache proxy configuration for socket.io (project not in root)socket.io 的 apache 代理配置(项目不在 root 中)
【发布时间】:2016-04-07 10:06:15
【问题描述】:

我知道有几个这样的问题,但我找不到一个解决我的问题的项目,它不在服务器根目录中。 我有以下情况:我有一个运行多个项目的 Apache 服务器,例如:

 0.0.0.0/project1
 0.0.0.0/project2

我添加了一个 node.js 项目,我们称之为nodeproject。使用 ProxyPass,我将向0.0.0.0/nodeproject 发出的请求传递给运行我的节点服务器的0.0.0.0:8080。除了 socket.io 的 websocket 配置外,这一切都很好。

在我的/etc/apache2/apache2.conf 文件中,我放置了这段代码来进行代理。 mod_proxy_wstunnel 已启用,我基本上是从 here 复制而来的。

ProxyRequests off
ProxyVia on

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/nodeproject/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:8080/$1 [P,L]

ProxyPass        /nodeproject/socket.io http://localhost:8080/socket.io
ProxyPassReverse /nodeproject/socket.io http://localhost:8080/socket.io

<Location /nodeproject>
    ProxyPass http://localhost:8080
    ProxyPassReverse http://localhost:8080
</Location>

失败的请求如下所示:

ws://0.0.0.0/nodeproject/socket.io/?EIO=3&transport=websocket&sid=MDuVcHmt3T1sa8ruAAAa

我收到一个错误的请求 400 响应。

我不是配置这类东西的专家,我哪里出错了?

提前致谢!

【问题讨论】:

    标签: node.js apache proxy socket.io


    【解决方案1】:

    您不应将重写条件放在/etc/apache2/apache2.conf 中,而应将其放在虚拟主机指令in /etc/apache2/sites-available/000-project-whatever.conf 中。

    这是我自己的一个小项目中的一个示例。

    <VirtualHost *:80>
    
    ServerName sockey.api
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/sockey.api
    <Directory /var/www/sockey.api>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
    </Directory>
    
    ErrorDocument 404 /index.html
    ErrorLog ${APACHE_LOG_DIR}/sockey.api.error.log
    CustomLog ${APACHE_LOG_DIR}/sockey.api.access.log combined
    
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*)           ws://localhost:8081/$1 [P,L]
    
    ProxyPass        /socket.io http://localhost:8081/socket.io
    ProxyPassReverse /socket.io http://localhost:8081/socket.io
    
    </VirtualHost>
    

    【讨论】:

    • 终于找到了解决办法。谢谢@sn0r
    • 那么您如何引用sockey.api 作为您的主机?
    • 兄弟,谢谢。非常感谢。我已经用了一个星期了。
    • 我将如何使用letsencrypt实现HTTPS?
    【解决方案2】:

    我能够使用 Apache 作为 socket.io 的代理使用这个配置:

    RewriteEngine On
    RewriteCond %{QUERY_STRING} transport=polling [OR]
    RewriteCond %{REQUEST_URI} /socket.io/socket.io.js
    RewriteRule /socket.io/(.*)$ http://localhost:8082/socket.io/$1 [P]
    ProxyPass /socket.io/ ws://localhost:8082/socket.io/
    ProxyPassReverse /socket.io/ ws://localhost:8082/socket.io/
    

    考虑到通过https的请求有两种:对js文件socket.io.js本身的请求,以及轮询请求。

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多