2012-02-21 32 views
7

Vì vậy, tôi đã cố gắng để có được điều này để làm việc 2 ngày và tôi bị mắc kẹt. Đây là lần đầu tiên tôi cấu hình một máy chủ cho các đường ray sử dụng NodeJS + Socket IO. Tôi là một noob với NGINX và Unicorn. Về cơ bản, phần NodeJS + SocketIO của ứng dụng của tôi sẽ đẩy tin nhắn cho người dùng được kết nối với ứng dụng của tôi. Đây là nginx.conf tôiCấu hình NGINX để làm việc với Socket.IO

server{ 
    listen 80 default; 
    root /home/deployer/saigon/public; 
    try_files $uri/index.html $uri @unicorn; 

    location /sockets { 
     proxy_pass http://localhost:3210; 
    } 

    location @unicorn { 
     proxy_pass http://localhost:3000; 
    } 
} 

Và trong production.rb của tôi, tôi đã cấu hình các url mà người dùng sẽ phải gửi thông điệp tới/nhận tin nhắn từ

SOCKET_IO_URL ='http://localhost:8080/sockets 

Tại sao 8080? Tôi sử dụng Vagrant để chuyển tiếp 8080 -> 80

Tôi đã thử truy cập http://localhost:8080/sockets và tôi có thể nhận được thông báo chào mừng ổ cắm. Tôi nhìn vào nhật ký máy chủ NodeJS của tôi và nó đã nhận được tin nhắn ổn. Tuy nhiên, khi nói đến phát sóng ..... nó chỉ không làm điều đó. Có ai từng nhận được loại ứng dụng này để làm việc với thiết lập mà tôi đang cố gắng thực hiện không? Tôi có nên đi với Apache + Unicorn không?

'

Trả lời

12

Cập nhật trả lời

tôi cuối cùng đã tìm ra một cách để làm việc này. Nó không phải là tất cả rõ ràng, nhưng khi lưu trữ socket.io trên một thư mục con, bạn KHÔNG sử dụng thư mục con trong câu lệnh connect. Đây là những gì tôi đã làm trước đây và khách hàng chưa bao giờ nhận được phản hồi.

Không Hoạt Động

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

http://localhost:8080/test/ Đây là một phần trong đó được ném đồ vật đi. Điều đó tạo ra một không gian tên cho socket cục bộ mà phía máy chủ không tôn trọng. Vì vậy, máy khách gửi thông điệp trên không gian tên '/ test /' nhưng các phản hồi của máy chủ sẽ đi đến một vùng tên trống '' để máy khách không bao giờ nhận được thông báo. Cách giải quyết nó chỉ đơn giản là loại bỏ '/ test /' và đảm bảo rằng bạn đang sử dụng biến tài nguyên trên máy khách và máy chủ.

Làm việc!

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

Tôi hy vọng điều này giúp bạn hoàn thành công việc.

gốc trả lời

Nó không phải là một vấn đề với thiết lập của bạn, đó là một vấn đề của socket.io không muốn làm việc trên thư mục phụ. Tôi sẽ đặt cược sẵn sàng để được rằng nếu bạn bỏ/ổ cắm ví dụ của bạn sẽ làm việc tốt. Tôi chạy vào cùng một vấn đề chính xác khi sử dụng http-node-proxy cố gắng lưu trữ các kết nối socket.io trên các thư mục con. Đã có một lỗi được tạo ra từ trước, nhưng nó đã bị đóng cửa và không bao giờ giải quyết được.

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

tôi vẫn đang tìm kiếm một giải pháp là tốt, nhưng tôi có cảm giác tôi sẽ phải xắn tay áo của tôi và thâm nhập vào các mã bản thân mình.

+0

về cơ bản là ổ cắm/ổ cắm.io cần phải ở lại trong thư mục gốc sau đó .... có nghĩa là tôi phải biết yêu cầu nào sẽ rails và đó là sẽ socket io khi nó truy cập root? = ___ = argh – denniss

+0

Hiện tại có. Nếu có thể, bạn có thể sử dụng tuyến đường phụ thay thế. http://socket.domain.com/. Điều này đã không làm việc cho tôi bởi vì tôi không muốn chi thêm tiền vào một chứng chỉ SSL cho một tên miền phụ. –

+0

@denniss Tôi đã cập nhật câu trả lời của mình với một giải pháp thay thế. Vẫn đang đào sâu vào nó để tìm hiểu xem đây có phải là thiết kế dự định hay một lỗi cần sửa. –

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