Tôi đã kết hợp câu trả lời ở trên với chứng chỉ SSL certbot và các tiêu đề cho phép kiểm soát truy cập CORS và làm cho nó hoạt động nên tôi nghĩ tôi sẽ chia sẻ kết quả.
Apache httpd.conf được thêm vào dưới cùng của tệp:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Cài đặt Virtualhost của Apache (doc root cho PHP nằm dưới Apache và SSL với Certbot, trong khi trang web node.js / socket.io chạy trên cổng 3000 - và sử dụng chứng chỉ SSL từ Apache) Cũng lưu ý rằng trang web node.js sử dụng proxy cho thư mục / nodejs, socket.io và ws (websockets):
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName www.example.com
ServerAlias www.example.com
DocumentRoot /var/html/www.example.com
ErrorLog /var/html/log/error.log
CustomLog /var/html/log/requests.log combined
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
RewriteEngine On
RewriteCond %{REQUEST_URI} ^socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /{.*} ws://localhost:3000/$1 [P,L]
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteRule /(.*) ws://localhost:3000/$1 [P,L]
ProxyPass /nodejs http://localhost:3000/
ProxyPassReverse /nodejs http://localhost:3000/
ProxyPass /socket.io http://localhost:3000/socket.io
ProxyPassReverse /socket.io http://localhost:3000/socket.io
ProxyPass /socket.io ws://localhost:3000/socket.io
ProxyPassReverse /socket.io ws://localhost:3000/socket.io
</VirtualHost>
</IfModule>
Sau đó, ứng dụng node.js của tôi (app.js):
var express = require('express');
var app = express();
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Headers", "Content-Type");
res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
next();
});
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen({host:'0.0.0.0',port:3000});
Tôi buộc người nghe ip4, nhưng đó là tùy chọn - bạn có thể thay thế:
http.listen(3000);
Mã ứng dụng node.js (app.js) tiếp tục với:
io.of('/nodejs').on('connection', function(socket) {
//optional settings:
io.set('heartbeat timeout', 3000);
io.set('heartbeat interval', 1000);
//listener for when a user is added
socket.on('add user', function(data) {
socket.join('AnyRoomName');
socket.broadcast.emit('user joined', data);
});
//listener for when a user leaves
socket.on('remove user', function(data) {
socket.leave('AnyRoomName');
socket.broadcast.emit('user left', data);
});
//sample listener for any other function
socket.on('named-event', function(data) {
//code....
socket.broadcast.emit('named-event-broadcast', data);
});
// add more listeners as needed... use different named-events...
});
cuối cùng, về phía máy khách (được tạo dưới dạng nodejs.js):
//notice the /nodejs path
var socket = io.connect('https://www.example.com/nodejs');
//listener for user joined
socket.on('user joined', function(data) {
// code... data shows who joined...
});
//listener for user left
socket.on('user left', function(data) {
// code... data shows who left...
});
// sample listener for any function:
socket.on('named-event-broadcast', function(data) {
// this receives the broadcast data (I use json then parse and execute code)
console.log('data1=' + data.data1);
console.log('data2=' + data.data2);
});
// sample send broadcast json data for user joined:
socket.emit('user joined', {
'userid': 'userid-value',
'username':'username-value'
});
// sample send broadcast json data for user left
//(I added the following with an event listener for 'beforeunload'):
// socket.emit('user joined', {
// 'userid': 'userid-value',
// 'username':'username-value'
// });
// sample send broadcast json data for any named-event:
socket.emit('named-event', {
'data1': 'value1',
'data2':'value2'
});
Trong ví dụ này khi tải JS, nó sẽ phát ra cho socket một "sự kiện có tên" gửi dữ liệu trong JSON đến máy chủ node.js / socket.io.
Sử dụng io và socket trên máy chủ theo path / nodejs (được kết nối bởi máy khách), nhận dữ liệu và sau đó gửi lại dưới dạng quảng bá. Bất kỳ người dùng nào khác trong ổ cắm sẽ nhận được dữ liệu với trình phát "có tên sự kiện" của người nghe. Lưu ý rằng người gửi không nhận được phát sóng riêng của họ.