简体   繁体   中英

Socket.io with apache proxy

im trying to set up proxyng with apache to be able to use socket.io in my nodejs application. But i recieve this error message on the client side:

WebSocket connection to 'wss://example.com/tools/socket.io/?EIO=3&transport=websocket&sid=eOGwJSC14TTWhHRMAAAR' failed: Error during WebSocket handshake: Unexpected response code: 400

Heres my apache configuration:

     <VirtualHost *:443>
            ServerName example.com
            ServerAlias example.com
            #SSLRequireSSL
            SSLProtocol all -SSLv2  -SSLv3
            SSLCompression off
            SSLHonorCipherOrder on
            SSLEngine on
            SSLCertificateFile /etc/ssl/main.pem
            SSLCertificateKeyFile /etc/ssl/dec_ssl.key
            SSLCertificateChainFile /etc/ssl/sub.class1.server.ca.pem
            SSLCACertificateFile /etc/ssl/main.pem
            SSLProxyEngine On

            ProxyPreserveHost On
            ProxyRequests off
    </VirtualHost>

    <Location /tools/>
            ProxyPass http://localhost:8181/
            ProxyPassReverse http://localhost:8181/
    </Location>

And here is client side code:

socket = io.connect("https://example.com",{path:'/tools/socket.io'});
socket.on("connect", function () {
    console.log("socketio Connected to server!");
});

What else i need to add to apache configuration to get rid of this error?

EDIT: My apache version: Server version: Apache/2.4.6 (CentOS)

I have used this successfully with Apache 2.4.16, older versions may not work properly.

<VirtualHost *:443>
        ServerName example.com
        ServerAlias example.com
        #SSLRequireSSL
        SSLProtocol all -SSLv2  -SSLv3
        SSLCompression off
        SSLHonorCipherOrder on
        SSLEngine on
        SSLCertificateFile /etc/ssl/main.pem
        SSLCertificateKeyFile /etc/ssl/dec_ssl.key
        SSLCertificateChainFile /etc/ssl/sub.class1.server.ca.pem
        SSLCACertificateFile /etc/ssl/main.pem
        SSLProxyEngine On

        ProxyPreserveHost On
        ProxyRequests off
</VirtualHost>

<Location /tools/>
        RewriteEngine On
        RewriteCond %{REQUEST_URI}  ^/tools/socket.io            [NC]
        RewriteCond %{QUERY_STRING} transport=websocket    [NC]
        RewriteRule "^/tools/socket.io"           "ws://localhost:8181/socket.io/" [P,L]

        ProxyPass http://localhost:8181/
        ProxyPassReverse http://localhost:8181/
</Location>

ProxyPass will not handle websocket upgrades. So, what you want to do is redirect those requests to ws://

I think in general you should not be using Location to handle this, but this config should work for you.

I have added below as per @Gary

    <Location /tools/>

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

    ProxyPass http://localhost:8181/
    ProxyPassReverse http://localhost:8181/
   </Location>

and connect socket from client side using path attribute.

 discussionSocket = io("https://localhost.in", {
  path:'/tools/socket.io',
  secure: true,
  reconnection: true,
  reconnectionDelay: 1000,
  reconnectionDelayMax: 5000,
  reconnectionAttempts: 99999
});

But for that we have to remove ssl configuration from socket server create code :-

var http = require('http').Server(app);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM