我正在努力正确配置nginx,以确保它可以处理Express(端口8081)和Socket的代理。io(端口3000)。下面是我的配置,它当前为整个请求(不仅仅是Socket.io)产生了502错误:
server {
root /var/www/example.com/public/;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
location /socket.io/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:3000/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
#try_files $uri $uri/ =404;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8081/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.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 = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com;
return 404; # managed by Certbot
}
据我所知,我需要确保Socket使用的Websocket。io已升级到HTTP,但这正是我努力掌握自己需要做什么的地方。可能是两个插座。io和Express需要在不同的端口上运行,然后需要根据我上面的配置代理到nginx。
如果我禁用了Express代理,只使用nginx来提供文件,那么我的资产就会得到服务,但是很明显,我需要它来支持Express和Socket.io。
编辑:我运行的是nginx 1.14,但看一篇nginx博客文章,我至少需要1.3……但它看起来已经有几年的历史了,所以不确定为什么Ubuntu包管理器如此过时。我在中没有收到配置错误,但由于上游原因,连接在错误日志中被拒绝。
非常感谢您的帮助!
快递和socket.io可以在同一个端口。
const express = require('express')
const app = express()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
app.use(
express.static(__dirname + '/client')
)
io.on('connection', function(socket){
console.log('Socket Connected');
socket.emit('message', 'Hello Socket');
socket.on('message', function (msg) {
console.log(msg);
});
})
http.listen(8080, () => console.log('Server is running @ localhost:8080')) //port
我从未使用过nginx,也没有通过nodejs本身为服务器提供过nodejs应用程序。我假设你有一个网络应用程序,你正在通过nginx服务它?
要在不同的端口上使用套接字,您必须通过http
创建另一个nodejs服务器,然后使用cor
让它们连接。有人告诉我,使用cors(跨源资源共享)可能很危险。最简单、最安全的做法是将应用程序放在一个端口(服务器)下。
插座io负责设置web套接字和升级连接。如果你需要用你自己的方式来处理,我会推荐类似fayewebsocket的东西,但是socket。io抽象了很多。
您可以在此处了解有关使用 nodejs http 服务器 socket.io 的更多信息。
在客户端或您的网页上,如索引.html
...
<!DOCTYPE html>
<html>
<head>
<title>Socket.io Test</title>
<script src="socket.io/socket.io.js"></script>
</head>
<body>
<!-- HTML -->
<script>
var socket = io();
socket.on('message', function (msg) {
console.log(msg);
socket.emit('message', 'Back at you');
});
</script>
</body>
</html>
要运行此代码,请创建一个新文件夹< code>socket.io_test,然后在其中创建一个名为< code>app.js的文件和另一个文件夹< code>client,其中包含一个文件< code>index.html。将第一段代码复制到< code>app.js中,将第二段代码复制到< code>index.html中。将< code>cd放入根文件夹,运行< code>npm init -y,然后运行< code > NPM I-s express socket . io 和最后的< code>node app.js,并将浏览器指向< code>localhost:8080。
希望这有所帮助
我正在开发一个在线的,基于文本的RPG(Github);目前我有一个PHP后端,它将会话数据存储在redis服务器中。对于需要实时通信的所有内容(聊天,消息传递和连接用户列表),我使用Node.js和 socket.io 用于websocket。 我目前在我的网络索克服务器上有3个命名空间: 消息服务器 在线服务器 聊天服务器 我已经让它工作了,但恐怕大部分是由“黑客”制作的。现在,我无法向特定的
在这种情况下,优化sockets java中的perfomance,使用sockets是BufferedWriter还是PrintWriter更好?
问题内容: Java 类有两种方法,分别检查套接字是关闭还是连接。我想知道仅开放的TCP套接字与开放和连接的TCP套接字有什么区别,这与UDP有何不同。 问题答案: 为了把事情简单地说,这是 开放的 是要么等待连接或已与另一个成功连接的插座。当一个套接字被 关闭 ,这意味着这个套接字没有连接不再可用,而且它的资源已被释放。一个已连接的好,这意味着该套接字已连接到另一个。 这样可以 同时打开并连接。
有没有办法设置(即减少)套接字的轮询频率。使用长轮询传输时的IO (v4.4)?在服务器上还是在客户机上? 文档中描述了长轮询传输,通常在无法建立 WebSocket 连接时充当回退(但可以显式设置): 套接字之间的双向通道。IO服务器(Node.js)和套接字。IO客户端(browser、Node.js或其他编程语言)尽可能使用WebSocket连接建立,并将使用HTTP长轮询作为后备。
我有一个节点。js服务器使用socket。io和Android应用程序。我希望我的应用程序连接到服务器。(我在当地工作) 首先我启动服务器:命令提示符 以下是代码: 然后我试着从这里的活动中联系起来: 我的问题是,我从来没有在服务器上看到“一个用户连接”的日志,但我总是在android日志上看到“尝试连接”和“连接成功”。 有人能帮我解开这个谜团吗? 使现代化 我的代码工作正常,但我遇到了一些Wi
我正在实现Spring WebFluxendpoint,它应该从套接字获取数据。IO客户端Java。 我不明白如何将传入数据收集到Flux流中。我可以创建新的Flux并订阅该传入数据吗?感谢您的建议。