Node.js 如何使用WebSocket为多个express API配置nginx?
我最近将Node.js/expressapi:s从Heroku移到了digital ocean ubuntu droplet。我的所有端点和WebSocket在本地和Heroku都可以正常工作,但在ubuntu droplet上,我的WebSocket停止工作(所有端点都可以正常工作) 我有四个不同的API:s,其中两个使用WebSocket设置,如下所示:Node.js 如何使用WebSocket为多个express API配置nginx?,node.js,express,nginx,websocket,socket.io,Node.js,Express,Nginx,Websocket,Socket.io,我最近将Node.js/expressapi:s从Heroku移到了digital ocean ubuntu droplet。我的所有端点和WebSocket在本地和Heroku都可以正常工作,但在ubuntu droplet上,我的WebSocket停止工作(所有端点都可以正常工作) 我有四个不同的API:s,其中两个使用WebSocket设置,如下所示: *Index.js* const app = require("./app"); const http = requi
*Index.js*
const app = require("./app");
const http = require("http");
const config = require("./utils/config");
const socketIo = require("socket.io");
const server = http.createServer(app);
const io = socketIo(server);
io.on("connection", (socket) => {
console.log("New client connected");
socket.on("disconnect", () => {
console.log("Client disconnected");
});
});
app.io = io;
app.get("/", (req, res) => {
res.send("Node Server is running.");
});
server.listen(config.PORT, () => {
console.log(`Server running on port ${config.PORT}`);
});
server {
root /var/www/myapp.com/html;
index index.html index.htm index.nginx-debian.html;
server_name myapp.com www.myapp.com;
location / {
try_files $uri $uri/ =404;
}
location /api-with-websockets-1/ {
proxy_pass http://localhost:3001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api-with-websockets-2/ {
proxy_pass http://localhost:3002/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /no-websockets-api-1/ {
proxy_pass http://localhost:3003/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /no-websockets-api-2/ {
proxy_pass http://localhost:3004/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.myapp.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = myapp.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name myapp.com www.myapp.com;
return 404; # managed by Certbot
}
我还学习了有关设置Node.js ubuntu droplet(使用https)的Digital Oceans教程:
我的nginx配置如下所示:
*Index.js*
const app = require("./app");
const http = require("http");
const config = require("./utils/config");
const socketIo = require("socket.io");
const server = http.createServer(app);
const io = socketIo(server);
io.on("connection", (socket) => {
console.log("New client connected");
socket.on("disconnect", () => {
console.log("Client disconnected");
});
});
app.io = io;
app.get("/", (req, res) => {
res.send("Node Server is running.");
});
server.listen(config.PORT, () => {
console.log(`Server running on port ${config.PORT}`);
});
server {
root /var/www/myapp.com/html;
index index.html index.htm index.nginx-debian.html;
server_name myapp.com www.myapp.com;
location / {
try_files $uri $uri/ =404;
}
location /api-with-websockets-1/ {
proxy_pass http://localhost:3001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api-with-websockets-2/ {
proxy_pass http://localhost:3002/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /no-websockets-api-1/ {
proxy_pass http://localhost:3003/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /no-websockets-api-2/ {
proxy_pass http://localhost:3004/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.myapp.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = myapp.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name myapp.com www.myapp.com;
return 404; # managed by Certbot
}
我注意到当我在浏览器中打开像这样的websocket url时
https://www.myapp.com/api-with-websockets-1/socket.io/?EIO=3&transport=polling&t=$test
我得到的答复是:
96:0{"sid":"i_VfLjian6BFmjRZAAAJ","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40
那么我猜WebSocket在那里?但是我的客户端无法接收后端和套接字发出的任何消息。io-client显示connected:false(客户端没有其他错误消息、警告或任何内容)。我整晚都在尝试以不同的方式更改nginx配置,但似乎没有任何效果:(
你知道这是什么原因吗
编辑:在的帮助下,我能够连接/断开套接字,但发出消息API或客户端仍然无法工作:/
编辑2:通过更改客户端代码,我可以让WebSocket为一个api工作并发出消息
socketIOClient.connect(my-app.com/, , { resource: 'api-with-websockets-1' });
和nginx配置:
location ~ ^/(socket\.io) {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
但是我不知道如何让WebSocket也在其他API中工作