2011-10-07 39 views
6

Tôi đang tìm cách tích hợp Node.js + Socket.io + Apache theo cách sau: Tôi muốn apache tiếp tục phục vụ các tệp HTML/JS. Tôi muốn Node.js để lắng nghe kết nối trên cổng 8080. Một cái gì đó như thế này:Node.js + Socket.io + Apache

var util = require("util"), 
    app = require('http').createServer(handler), 
    io = require('/socket.io').listen(app), 
    fs = require('fs'), 
    os = require('os'), 
    url = require('url'); 

app.listen(8080); 

function handler (req, res) { 

    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 

    socket.on('my other event', function (data) { 
    socket.emit('ok 1', { hello: 'world' }); 
    }); 

    socket.on('clientMSG', function (data) { 
    socket.emit('ok 2', { hello: 'world' }); 
    }); 

}); 

nếu tôi truy cập vào một HTML mà kết nối đến máy chủ này, nó hoạt động, nhưng tôi cần phải đi đến mydomian.com:8080 /index.html. Điều tôi muốn là có thể truy cập mydomian.com/index.html. và có thể mở một kết nối socket:

<script> 
     var socket = io.connect('http://mydomain.com', {port: 8080}); 
     socket.on('news', function (data) { 
      console.log(data); 
      socket.emit('my other event', { my: 'data from the client' }); 
     }); 

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

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


      //call this function when a button is clicked 
     function sendMSG() 
     { 
      console.log("sendMSG"); 
      socket.emit('clientMSG', { msg: 'non-scheduled message from client' }); 
     } 

    </script> 

Trong ví dụ này, tôi đã phải sử dụng fs.readFile công việc sẽ không khi tôi đi đến cổng 8080 trong URL.

Mọi đề xuất? Tks.

+0

Hãy thử nginx thay vì apache, đặc biệt nếu bạn chỉ muốn phân phối các tệp tĩnh. Apache bắt đầu một chuỗi mới cho mọi yêu cầu mà một phần phản đối triết lý/lý do sử dụng nút. – badunk

Trả lời

14

Phục vụ nội dung tĩnh của bạn từ Apache cổng 80 và phục vụ nội dung động/dữ liệu của bạn trên một máy chủ Socket.IO trên cổng 8080. Bạn không cần app = require('http').createServer(handler) trong ứng dụng của bạn Socket.IO

Apache cổng 80 | ------------- | khách hàng | ------------ | Socket.IO cổng 8080

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

io.sockets.on('connection', function (socket) { 
    io.sockets.emit('this', { will: 'be received by everyone'}); 

    socket.on('clientMSG', function (from, msg) { 
    console.log('I received a private message by ', from, ' saying ', msg); 
    }); 

    socket.on('disconnect', function() { 
    sockets.emit('user disconnected'); 
    }); 
}); 
+0

Cảm ơn bạn đã trả lời. Tôi đã thay đổi và bây giờ có vẻ như khách hàng không nhận được tệp /socket.io/socket.io.js. Tệp này có được phục vụ bởi máy chủ HTTP trong Nút không? – oscarm

+1

Tôi nhận được nó hoạt động. đã thay đổi đường dẫn đến /socket.io-client/dist/socket.io.js Cảm ơn! – oscarm

+1

Vâng, bạn sẽ muốn phục vụ socket.io.js từ máy chủ tĩnh Apache của bạn trên cổng 80 và thực hiện một cái gì đó như trên mã phía máy khách của bạn – EhevuTov

4

AWS + Apache + NODEJS + SOCKET.IO + ANGULARJS

Server Side
này làm việc cho tôi trên một máy chủ sản xuất chạy apache trên cổng 80 và NodeJS trên cổng 8000. Thay đổi cổng NodeJS theo tùy chọn bạn muốn…

  1. Tạo một thư mục có tên “nodejs” cho các tập tin của máy chủ NodeJS tại/var/www/html
  2. Run Nodejs trên một cổng khác hơn 80, ví dụ cổng 8000
  3. Execute lệnh: proxy_http a2enmod
  4. thực hiện lệnh: a2enmod proxy_wstunnel
  5. Đặt 2 dòng tiếp theo vào cuối của tập tin sau đây: /etc/apache2/apache2.conf

    LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
    LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
    
  6. Đặt 12 dòng tiếp theo vào cuối của tập tin sau đây :/ngồi es-sẵn/000-default.conf
    (Nếu bạn có một trang web khác nhau được tạo ra bởi bạn, đặt dây chuyền có)

    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^socket.io   [NC] 
    RewriteCond %{QUERY_STRING} transport=websocket [NC] 
    RewriteRule /{.*}  ws://localhost:8000/$1 [P,L] 
    
    RewriteCond %{HTTP:Connection} Upgrade [NC] 
    RewriteRule /(.*) ws://localhost:8000/$1 [P,L] 
    
    ProxyPass /nodejs http://localhost:8000/ 
    ProxyPassReverse /nodejs http://localhost:8000/ 
    
    
    ProxyPass /socket.io http://localhost:8000/socket.io 
    ProxyPassReverse /socket.io http://loacalhost:8000/socket.io 
    
    ProxyPass /socket.io ws://localhost:8000/socket.io 
    ProxyPassReverse /socket.io ws://localhost:8000/socket.io 
    
  7. sudo dịch vụ apache2 restart


KHÁCH HÀNG SIDE
Tôi sử dụng sau library để triển khai Socket.io trong AngularJS, nhưng Tôi nghĩ hướng dẫn này
cũng hữu ích để thực hiện Javascript cơ bản của công nghệ socket.io.

Để gọi máy chủ PHP của tôi: ví dụ.com
Để gọi máy chủ NodeJS: example.com/nodejs
Để gọi NodeJS Socket: example.com < --- cuộc gọi này sẽ được thực hiện theo mặc định bởi thư viện

Tôi hy vọng giúp bạn!

+0

Cảm ơn, tôi đã có thể giải quyết vấn đề với chạy socket.io trên một máy chủ apache. – prateekkathal

Các vấn đề liên quan