Socket.IO 和 NodeJs 在 Nginx 后面(HTTPS). xhr 轮询请求被取消

huangapple go评论102阅读模式
英文:

Socket.IO and NodeJs behing Nginx ( HTTPS ). xhr polling requests canceled

问题

如果我的解释不好,请写下评论!
我遇到了一个奇怪的问题,我有一个使用NodeJs Express 5.0的socket.io服务器。
我有socket.io客户端从Windows/MacOS/Linux连接,使用任何Web浏览器都可以建立socket.io连接,没有任何问题。

但是从Android/Ios应用程序不起作用,我在nginx中没有收到任何错误,也没有在nodejs应用程序中收到任何错误。
我唯一看到的错误是在使用USB调试和chrome://inspect/#devices -> 标签(networking)中。
在标签中我看到:这个请求状态为(挂起)半秒钟,然后变为(已取消)

  1. URL: mydomain.com/socket.io/?EIO=4&transport=polling&t=Oc7fPq6
  2. STATUS: canceled
  3. TYPE: xhr
  4. SIZE: 0 B

更新!!!! 这是来自Android应用程序的错误日志

  1. 2023-07-25 14:37:30.426 9286-9482/com.myandroidapp.app E/chromium: [ERROR:ssl_client_socket_impl.cc(978)] handshake failed; returned -1, SSL error code 1, net_error -202

服务器(Socket.IO和Express代码):

  1. let SocketServer = require('./core/socket_server.js');
  2. const bodyparser = require('body-parser');
  3. const cors = require('cors');
  4. const express = require('express');
  5. const app = express();
  6. const server = require('http').createServer(app);
  7. const io = require('socket.io')(server, {
  8. cors: {
  9. origin: "*",
  10. methods: ["GET", "POST"],
  11. transports: ['websocket', 'xhr-polling'],
  12. credentials: false
  13. },
  14. allowEIO3: true
  15. });
  16. let SockServer = new SocketServer(io);
  17. app.set('view engine', 'ejs');
  18. app.use(bodyparser.json());
  19. app.use('/call/:room_id/:user_id/:video_state', express.static('public'));
  20. app.get('/call/:room_id/:user_id/:video_state', async (request, response) => {
  21. await response.render('video_chat', {
  22. room_id: request.params.room_id,
  23. user_id: request.params.user_id,
  24. video_state: Number(request.params.video_state)
  25. });
  26. });
  27. server.listen(5001, "0.0.0.0");
  28. SockServer.ServerInitialize();
  29. app.use(cors({
  30. origin: "*"
  31. }));

Nginx配置:

  1. events {
  2. worker_connections 1024;
  3. }
  4. http {
  5. server {
  6. listen 443 ssl;
  7. server_name mydomain.com www.mydomain.com;
  8. resolver 127.0.0.11;
  9. ssl_certificate /etc/certificates/cert.pem;
  10. ssl_certificate_key /etc/certificates/privkey.pem;
  11. location /socket.io/ {
  12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13. proxy_set_header Host $host;
  14. proxy_pass http://nodejs_container:5001;
  15. proxy_http_version 1.1;
  16. proxy_set_header Upgrade $http_upgrade;
  17. proxy_set_header Connection "upgrade";
  18. }
  19. location /videochat {
  20. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  21. proxy_set_header Host $host;
  22. proxy_pass http://nodejs_container:5001;
  23. proxy_http_version 1.1;
  24. proxy_set_header Upgrade $http_upgrade;
  25. proxy_set_header Connection "upgrade";
  26. }
  27. location /users {
  28. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  29. proxy_set_header Host $host;
  30. proxy_pass http://nodejs_container:5001;
  31. proxy_http_version 1.1;
  32. proxy_set_header Upgrade $http_upgrade;
  33. proxy_set_header Connection "upgrade";
  34. }
  35. location ~ ^/call/([^/]+)/([^/]+)/([^/]+) {
  36. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  37. proxy_set_header Host $host;
  38. proxy_pass http://nodejs_container:5001;
  39. proxy_http_version 1.1;
  40. proxy_set_header Upgrade $http_upgrade;
  41. proxy_set_header Connection "upgrade";
  42. }
  43. }
  44. }

Docker-compose:

  1. version: '3'
  2. services:
  3. nodejs_container:
  4. build:
  5. context: app
  6. dockerfile: ../docker/NodeJs/DockerFile
  7. networks:
  8. - backend
  9. environment:
  10. - NODE_ENV=production
  11. volumes:
  12. - ./app:/home/app
  13. command: sh -c "npm install && npm run start:prod"
  14. coturn_container:
  15. image: coturn/coturn
  16. ports:
  17. - "3478:3478/udp"
  18. - "5349:5349/udp"
  19. - "3478:3478/tcp"
  20. - "5349:5349/tcp"
  21. depends_on:
  22. - nodejs_container
  23. volumes:
  24. - ./coturn/turnserver/dhp.pem:/etc/turnserver/dhp.pem
  25. - ./coturn/turnserver.conf:/etc/turnserver.conf
  26. - ./coturn/certificates:/etc/coturn/certificates
  27. networks:
  28. - backend
  29. nginx_container:
  30. image: nginx
  31. ports:
  32. - 443:443
  33. depends_on:
  34. - nodejs_container
  35. - coturn_container
  36. networks:
  37. - backend
  38. volumes:
  39. - ./coturn/certificates:/etc/coturn/certificates
  40. - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
  41. - ./certificates:/etc/certificates
  42. command: [nginx, '-g', 'daemon off;']
  43. networks:
  44. backend:
  45. driver: bridge

SocketServer类构造函数的一部分。

  1. class SocketServer{
  2. constructor(main_socket){
  3. this.ServerConnections = {
  4. database: undefined,
  5. socket_server: main_socket,
  6. Server_NSP: {
  7. Users: main_socket.of(ServerNamespaces.USERS),
  8. VideoChat: main_socket.of(ServerNamespaces.VIDEOCHAT)
  9. }
  10. };
  11. }
  12. // ServerNamespaces.USERS = "/users"
  13. // ServerNamespaces.VIDEOCHAT = "/videochat"

我尝试添加transports: ['websocket', 'xhr-polling', 'polling']

英文:

If my explanation is bad, please write a comment !
I encounter a strange problem, i have a socket.io Server using NodeJs Express 5.0.
I have socket.io clients that connects from Windows/MacOS/Linux using any WebBrowser, and connection of socket.io is established without any problems.

But from Android/Ios Application is not working, i don't get any error in nginx, or in nodejs app.
The only error i see is using usb-debugging and chrome://inspect/#devices -> tab (networking).
In the Tab i see: This requests as STATUS (pending) for half of a second, and after that it's (canceled)

  1. URL: mydomain.com/socket.io/?EIO=4&transport=polling&t=Oc7fPq6
  2. STATUS: canceled
  3. TYPE: xhr
  4. SIZE: 0 B

UPDATED !!!! This is error log from Android App

  1. 2023-07-25 14:37:30.426 9286-9482/com.myandroidapp.app E/chromium: [ERROR:ssl_client_socket_impl.cc(978)] handshake failed; returned -1, SSL error code 1, net_error -202

Server (Socket.IO and Express Code):

  1. let SocketServer = require('./core/socket_server.js');
  2. const bodyparser = require('body-parser');
  3. const cors = require('cors');
  4. const express = require('express');
  5. const app = express();
  6. const server = require('http').createServer(app);
  7. const io = require('socket.io')(server, {
  8. cors: {
  9. origin: "*",
  10. methods: ["GET", "POST"],
  11. transports: ['websocket', 'xhr-polling'],
  12. credentials: false
  13. },
  14. allowEIO3: true
  15. });
  16. let SockServer = new SocketServer(io);
  17. app.set('view engine', 'ejs');
  18. app.use(bodyparser.json());
  19. app.use('/call/:room_id/:user_id/:video_state', express.static('public'));
  20. app.get('/call/:room_id/:user_id/:video_state', async (request, response) => {
  21. await response.render('video_chat', {
  22. room_id: request.params.room_id,
  23. user_id: request.params.user_id,
  24. video_state: Number(request.params.video_state)
  25. });
  26. });
  27. server.listen(5001, "0.0.0.0");
  28. SockServer.ServerInitialize();
  29. app.use(cors({
  30. origin: "*"
  31. }));

Nginx Configuration:

  1. events {
  2. worker_connections 1024;
  3. }
  4. http {
  5. server {
  6. listen 443 ssl;
  7. server_name mydomain.com www.mydomain.com;
  8. resolver 127.0.0.11;
  9. ssl_certificate /etc/certificates/cert.pem;
  10. ssl_certificate_key /etc/certificates/privkey.pem;
  11. location /socket.io/ {
  12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13. proxy_set_header Host $host;
  14. proxy_pass http://nodejs_container:5001;
  15. proxy_http_version 1.1;
  16. proxy_set_header Upgrade $http_upgrade;
  17. proxy_set_header Connection "upgrade";
  18. }
  19. location /videochat {
  20. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  21. proxy_set_header Host $host;
  22. proxy_pass http://nodejs_container:5001;
  23. proxy_http_version 1.1;
  24. proxy_set_header Upgrade $http_upgrade;
  25. proxy_set_header Connection "upgrade";
  26. }
  27. location /users {
  28. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  29. proxy_set_header Host $host;
  30. proxy_pass http://nodejs_container:5001;
  31. proxy_http_version 1.1;
  32. proxy_set_header Upgrade $http_upgrade;
  33. proxy_set_header Connection "upgrade";
  34. }
  35. location ~ ^/call/([^/]+)/([^/]+)/([^/]+) {
  36. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  37. proxy_set_header Host $host;
  38. proxy_pass http://nodejs_container:5001;
  39. proxy_http_version 1.1;
  40. proxy_set_header Upgrade $http_upgrade;
  41. proxy_set_header Connection "upgrade";
  42. }
  43. }
  44. }

Docker-compose:

  1. version: '3'
  2. services:
  3. nodejs_container:
  4. build:
  5. context: app
  6. dockerfile: ../docker/NodeJs/DockerFile
  7. networks:
  8. - backend
  9. environment:
  10. - NODE_ENV=production
  11. volumes:
  12. - ./app:/home/app
  13. command: sh -c "npm install && npm run start:prod"
  14. coturn_container:
  15. image: coturn/coturn
  16. ports:
  17. - "3478:3478/udp"
  18. - "5349:5349/udp"
  19. - "3478:3478/tcp"
  20. - "5349:5349/tcp"
  21. depends_on:
  22. - nodejs_container
  23. volumes:
  24. - ./coturn/turnserver/dhp.pem:/etc/turnserver/dhp.pem
  25. - ./coturn/turnserver.conf:/etc/turnserver.conf
  26. - ./coturn/certificates:/etc/coturn/certificates
  27. networks:
  28. - backend
  29. nginx_container:
  30. image: nginx
  31. ports:
  32. - 443:443
  33. depends_on:
  34. - nodejs_container
  35. - coturn_container
  36. networks:
  37. - backend
  38. volumes:
  39. - ./coturn/certificates:/etc/coturn/certificates
  40. - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
  41. - ./certificates:/etc/certificates
  42. command: [nginx, '-g', 'daemon off;']
  43. networks:
  44. backend:
  45. driver: bridge

A part of SocketServer Class constructor.

  1. class SocketServer{
  2. constructor(main_socket){
  3. this.ServerConnections = {
  4. database: undefined,
  5. socket_server: main_socket,
  6. Server_NSP: {
  7. Users: main_socket.of(ServerNamespaces.USERS),
  8. VideoChat: main_socket.of(ServerNamespaces.VIDEOCHAT)
  9. }
  10. };
  11. }
  12. // ServerNamespaces.USERS = "/users"
  13. // ServerNamespaces.VIDEOCHAT = "/videochat"

I tried to add transports: ['websocket', 'xhr-polling', 'polling'].

答案1

得分: 0

Oh my god,
使用以下方式成功解决了:

ssl_certificate /etc/certificates/fullchain.pem;

而不是:

ssl_certificate /etc/certificates/cert.pem;

英文:

Oh my god,
Got it worked by using this:

  1. ssl_certificate /etc/certificates/fullchain.pem;

Instead of:

  1. ssl_certificate /etc/certificates/cert.pem;

huangapple
  • 本文由 发表于 2023年7月24日 19:59:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/76754282.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定