2012-05-03 7 views
9

Tôi đang cố gắng sử dụng Node.js với Socket.IO để tạo thông điệp giữa trình duyệt và ứng dụng khách, sau the guide.Sử dụng socket.io với nodej trên máy chủ có apache dưới dạng proxy ngược

Tuy nhiên, tôi phải thiết lập Node ngược proxy phía sau Apache. Vì vậy, thay vì example.com:8080 cho nút, tôi đang sử dụng example.com/nodejs/.

Điều này có vẻ khiến Socket.IO mất cảm giác. Đây là ứng dụng nút của tôi

var io = require('socket.io').listen(8080); 

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io 
io.set('resource', '/nodejs/socket.io'); 

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

    socket.emit('bar', { one: '1'}); 

    socket.on('foo', function(data) 
    { 
    console.log(data); 
    }); 

}); 

Và đây là những gì tập tin khách hàng của tôi trông giống như

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Socket.IO test</title> 

    <script src="http://example.com/nodejs/socket.io/socket.io.js"></script> 

    <script> 

    var socket = io.connect('http://example.com/nodejs/'); 

    console.log(socket); 

    socket.on('bar', function (data) 
    { 
    console.log(data); 
    socket.emit('foo', {bar:'baz'}); 
    }); 

    socket.emit('foo',{bar:'baz'}); 

    </script> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

Vấn đề ở đây là tài liệu tham khảo kịch bản để http://example.com/nodejs/socket.io/socket.io.js. Nó không trả về nội dung javasscript mong đợi - thay vào đó nó trả về "Chào mừng bạn đến socket.io" như thể tôi nhấn http://example.com/nodejs/.

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện công việc này?

+0

Tôi biết điều này là không liên quan đến câu hỏi trong tầm tay (và hãy gọi cho tôi nếu tôi nên mở một câu hỏi SO mới), nhưng tôi tò mò về những gì mà Apache httpd.conf của bạn trông như thế nào. Tôi đã thiết lập proxy để chuyển sang máy chủ node.js thực tế, tuy nhiên, tôi không thể nhận proxy proxy trên web hoạt động. Bạn có thể vui lòng cho một ví dụ về cách bạn đang làm điều này với Apache? – pmalbu

+0

Xin lỗi, nhưng tôi không thể. Dự án này đã được thực hiện tại một cuộc chạy đua trên 2 năm trước và máy chủ được thiết lập cho nó không còn tồn tại nữa. –

Trả lời

7

này rốt cuộc là một giải pháp đa dạng.

Đầu tiên, trên máy chủ kết thúc của sự vật, tôi đã phải thiết lập các thiết bị đầu cuối như thế này

var io = require('socket.io').listen(8080); 

var rootSockets = io.of('/nodejs').on('connection', function(socket) 
{ 
    // stuff 
}); 

var otherSockets = io.of('nodejs/other').on('connection', function(socket) 
{ 
    // stuff 
}); 

Sau đó, trên client-side, để kết nối đúng cách nhìn như thế này

var socket = io.connect(
    'http://example.com/nodejs/' 
    , {resource: 'nodejs/socket.io'} 
); 

// The usage of .of() is important 
socket.of('/nodejs').on('event', function(){}); 
socket.of('/nodejs/other').on('event', function(){}); 

Sau đó, tất cả đều hiệu quả. Hãy nhớ rằng, trên máy chủ này, Apache là proxy example.com/nodejs đến cổng 8080 trong nội bộ.

+2

Phiên bản socket.io nào bạn đã sử dụng? Tôi đã thử giải pháp được đề cập. Nhưng tất cả tiêu đề http bị xóa nếu yêu cầu socket web được định tuyến thông qua apache mod_proxy.Vì vậy, socket.io đóng kết nối là "kết nối websocket không hợp lệ". –

4

Tôi không nghĩ rằng điều này có liên quan gì đến proxy apache của bạn, nhưng một số 'quirks' với cách socket.io xử lý các yêu cầu trên một thư mục con. Xem câu trả lời của tôi ở đây. NGINX configuration to work with Socket.IO

Về cơ bản, bạn cần phải sử dụng câu lệnh kết nối này để thay thế:

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

+3

Vì socket.io 1.0 '{resource: ...' được thay thế bằng '{path: ...' – ceremcem

0

Nếu có ai quan tâm, chỉ điều này làm việc cho tôi. Thay thế cổng 3000 với cổng Nodejs bạn

Apache 2.2.14 bên VirtualHost bạn

<IfModule mod_proxy.c> 
     <Proxy *> 
     Order allow,deny 
     allow from all 
     </Proxy> 
    </IfModule> 

    RewriteEngine on 

    RewriteCond %{QUERY_STRING} transport=polling 
    RewriteRule /(.*)$ http://localhost:3001/$1 [P] 

    ProxyRequests off 
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/ 
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/ 

kết nối phía Chủ đầu tư:

var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'}); 

Không cần phải thay đổi bất cứ điều gì trên Node.js phụ.