簡體   English   中英

socket.io 的 apache 代理配置(項目不在 root 中)

[英]apache proxy configuration for socket.io (project not in root)

我知道有幾個這樣的問題,但我找不到一個解決我的問題的項目不在服務器根目錄中。 我有以下情況:我有一個運行多個項目的 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是啟用的,我基本上是從這里復制的。

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 響應。

我不是配置這類東西的專家,我哪里出錯了?

提前致謝!

您不應將重寫條件放在/etc/apache2/apache2.conf ,而應放在/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>

使用以下配置,我能夠使用 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本身的請求和輪詢請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM