2017-10-21 250 views
1

我正在嘗試使用Socket.IO和Express進行瀏覽器多人遊戲,但對於我來說不太清楚爲什麼需要Express。我在我的服務器上的應用程序中,在一個名爲/遊戲的文件夾中,所以要訪問該應用程序,用戶應該鍵入http://www.example.com/game而不是http://www.example.com:3000,這是本教程的用法。我知道這是更多的Apache 2 VirtualHost配置文件的問題,但我不知道在哪裏發佈它。 這裏是我的實際.conf文件在Apache服務器上運行NodeJS

# /etc/apache2/sites-available/example.com.conf 
<VirtualHost *:80> 

ServerAdmin [email protected] 
DocumentRoot /var/www/example.com/public_html 
ServerName example.com 
ServerAlias www.example.com 
ProxyPreserveHost On 
ProxyPass /game http://www.example.com:3000 
ProxyPassReverse /game http://www.example.com:3000 


ErrorLog ${APACHE_LOG_DIR}/error.log 
CustomLog ${APACHE_LOG_DIR}/access.log combined 

</VirtualHost> 

實際上,當用戶通過該端口(http://www.example.com:3000)輸入網址進入,服務器返回像「用戶連接」,但是當我通過寫日誌鍵入URL我想(http://www.example.com/game),那麼它不會返回它讓我發瘋的任何消息...... index.js代碼:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket){ 
    console.log('a user connected'); 
    socket.on('disconnect', function(){ 
    console.log('user disconnected'); 
}); 
socket.on('chat message', function(msg){ 
    onsole.log('message: ' + msg); 
}); 
}); 

http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

的index.html代碼:

<!doctype html> 
<html> 
    <head> 
    <title>Socket.IO App</title> 
    <style> 
    * { 
     margin: 0; 
     padding: 0; 
     box-sizing: border-box; 
    } 
    body { 
     font: 13px Helvetica, Arial; 
    } 
    form { 
     background: #000; 
     padding: 3px; 
     position: fixed; 
     bottom: 0; 
     width: 100%; 
    } 
    form input { 
     border: 0; 
     padding: 10px; 
     width: 90%; 
     margin-right: .5%; 
    } 
    form button { 
     width: 9%; 
     background: rgb(130, 224, 255); 
     border: none; 
     padding: 10px; 
     } 
    #messages { 
     list-style-type: none; 
     margin: 0; padding: 0; 
    } 
    #messages li { 
     padding: 5px 10px; 
    } 
    #messages li:nth-child(odd) { 
     background: #eee; 
    } 
    </style> 
    </head> 
    <body> 
    <ul id="messages"></ul> 
    <form action=""> 
     <input id="m" autocomplete="off" /><button>Send</button> 
    </form> 
    <script src="/socket.io/socket.io.js"></script> 
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script> 
    <script> 
    $(function() { 
     var socket = io(); 
     $('form').submit(function(){ 
     socket.emit('chat message', $('#m').val()); 
     $('#m').val(''); 
     return false; 
     }); 
    }); 
    </script> 
    </body> 
</html> 

在此先感謝。

編輯另外,我檢查瀏覽器控制檯,同時通過example.com/game訪問,它說沒有找到socket.io.js文件,但是當進入另一種方式它確實加載文件...

+0

希望這會有所幫助:http://www.codingtricks.biz/run-nodejs-application-apache/ –

+1

嗨@MirzaSisic謝謝你的回答!它實際上幫了我,但我已經看到了那篇文章,它並沒有解決我的問題。現在我可以運行我的應用程序並通過example.com:3000訪問它,但我希望能夠使用example.com/game進行訪問。實際上,它們都會將我返回到正確的頁面,但是通過example.com/game輸入時,它不會加載socket.io腳本(404),並且服務器不會以「連接的用戶」的形式返回任何消息。再次感謝! – Marcos

+0

當找不到socket.io時,使用它記錄的URL是什麼?並確認這是否正確的URL到您的套接字文件 –

回答

1

在客戶端,指定socket.io客戶的path領域:

var socket = io('http://www.example.com', { 
    'path': '/game/socket.io' 
}); 

或:

var socket = io(window.location.origin, { 
    'path': window.location.pathname + '/socket.io' 
}); 

在你的Apache配置,還可以添加ws重寫規則路由的WebSocket流量,則需要proxyproxy_httpproxy_wstunnelrewrite模塊:

RewriteEngine On 
RewriteCond %{HTTP:Connection} Upgrade [NC] 
RewriteCond %{HTTP:Upgrade} websocket [NC] 
RewriteRule /game/(.*) ws://www.example.com:3000/$1 [P,L] 

ProxyPass  /game http://www.example.com:3000 
ProxyPassReverse /game http://www.example.com:3000 

可以使用泊塢窗再現您的配置找到here一個樣本項目(節點應用程序+ Apache的反向代理)

+0

嗨,謝謝你的回答!我會嘗試這個結果並返回結果 – Marcos

+0

Okey,我嘗試了一堆不同的東西,但都沒有工作。實際上,當我輸入example.com:3000時,它會正確加載頁面並在服務器中記錄一條消息。但是當我輸入例子。com /遊戲它不只是不記錄的消息,但它也不會加載socket.io文件,也有一些腳本我不知道我是否解釋自己太糟糕了,但這是驅動我瘋狂 – Marcos

+0

你應該看看你的瀏覽器開發控制檯和apache日誌來調試你的問題 –

相關問題