我知道有几个这样的问题,但我找不到一个解决我的问题的项目不在服务器根目录。 我有以下情况:我有一个Apache服务器,它运行几个项目,如:
我添加了一个node.js项目,我们称之为nodeproject。使用ProxyPass,我将对0.0.0.0/nodeproject的请求传递给我的节点服务器正在运行的0.0.0.0:8080。除了socket.io的websocket配置之外,这一切都正常。在我的/etc/apache2/apache2.conf文件中,我放置了此代码来进行代理。 (mod_proxy_wstunnel是enabeld)我基本上是从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响应。
我不是配置这种东西的专家我哪里出错了?
提前致谢!
答案 0 :(得分:9)
您不应该将重写条件放在/etc/apache2/apache2.conf中,而是放在虚拟主机指令中(在/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>
答案 1 :(得分:0)
我可以使用以下配置将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
本身的请求和轮询请求。