Salut !

J'aimerai utiliser un sous-domaine qui pointerai mon serveur nodejs pour faire un système de chat ou de discussion instantanée.
Que le visiteur se trouve bien sur chat.monsite.fr et non pas www.monsite.fr:PORT_DU_CHAT
J'utilise socket.io pour le chat.
C'est possible d'éviter d'afficher le port dans le js de mon site comme :
var socket = io('https://chat.monsite.fr'); à la place de :
var socket = io('https://www.monsite.fr:3005');

Je me suis tourné vers les proxy avec apache2, je n'y arrive pas trop, et vers node-http-proxy, non plus :(
Comment je pourrai faire ?

Je précise que j'utilise le port 443 pour mon site et donc mon sous-domaine. =)

Merci d'avance ;)

5 réponses


Salut nikola, peux tu nous montrer le code que tu utilises côté serveur aavec avec http-proxy ? Parce que moi j'avais eu ce problème et avec http-proxy je l'ai resolu très facilement.

Nikola
Auteur

Salut,
Heuu, j'ai réussi avec une alternative :

<VirtualHost *:443>
    ServerAdmin admin@monsite.fr
    ServerName  io.monsite.fr

    SSLEngine on
    SSLProxyEngine on
    SSLCertificateFile  /home/private/ssl/webastro.crt
    SSLCertificateKeyFile   /home/private/ssl/webastro.key
    SSLCertificateChainFile /home/private/ssl/webastro-int.crt

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/socket.io [NC]
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteRule /(.*) wss://io.monsite.fr:1812/$1 [P,L]

    ProxyRequests Off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass /socket.io/1/websocket wss://io.monsite.fr:1812/socket.io/1/websocket
    ProxyPassReverse /socket.io/1/websocket wss://io.monsite.fr:1812/socket.io/1/websocket

    ProxyPass /socket.io/ https://io.monsite.fr:1812/socket.io/
    ProxyPassReverse /socket.io/ https://io.monsite.fr:1812/socket.io/

    ProxyPass / https://io.monsite.fr:1812/
    ProxyPassReverse / https://io.monsite.fr:1812/
</VirtualHost>

Mon serveur :

var fs = require('fs'),
https   = require('https'),
path = require('path'),
express = require('express'),
app = express(),
options = {
    key: fs.readFileSync(path.join(__dirname,'/../../private/ssl/key.key')),
    cert: fs.readFileSync(path.join(__dirname,'/../../private/ssl/cert.crt')),
    ca: fs.readFileSync(path.join(__dirname,'/../../private/ssl/cert-int.crt'))
},
port = 1812,
server = https.createServer(options,app).listen(port,function(){
    console.log("Express server listening on port " + port);
}),
io = require('socket.io')(server);

app.get('/',function (req,res){
    res.redirect(301,'https://www.monsite.fr');
});

io.sockets.on('connection', function(socket){

    socket.on('disconnect', function(){

    });

});

Mais je ne sais pas si c'est de la bonne pratique

La bonne pratique je n'en suis pas forcément certains. Mais à partir du moment où ça résout ton problème sans aucun risque en matière de sécurité c'est l'essentiel, après on peut parler des autres problèmes et tout... bah moi perso je n'avais pas vu comme ça et je ne trouve aaucun problème majeur dans le code donc cool.

Nikola
Auteur

J'ai regardé beaucoup sur le web, et c'est une technique qui existe, je n'ai pas de bug dans mes logs ;)

Okay pas de problème ;)