当前位置: 首页 > 知识库问答 >
问题:

插座io和带有nginx的Express

孟正志
2023-03-14

我正在努力正确配置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包管理器如此过时。我在中没有收到配置错误,但由于上游原因,连接在错误日志中被拒绝。

非常感谢您的帮助!

共有1个答案

姜泳
2023-03-14

快递和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

  • 我试图了解Socketchannes和NIO的总体情况。我知道如何使用常规套接字,以及如何为每个客户机服务器创建一个简单的线程(使用常规阻塞套接字)。 所以我的问题是: 什么是袜子通道 当我使用SocketChannel而不是Socket时,额外得到了什么 通道和缓冲区之间的关系是什么 什么是选择器 文档中的第一句话是