Websocket не удалось: приложение flask с nginx и gunicorn, реагирующий интерфейс с socket.io

У меня возникли проблемы с развертыванием моего приложения. Само приложение работает нормально, но веб-сокеты не подключаются:

WebSocket connection to 'wss://localhost:8080/socket.io/?combat_id=elayn-1670267089069&EIO=4&transport=websocket' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

На локальном хосте все работало нормально, даже на Heroku. Сервер развертывания, который я использую, теперь имеет nginx (работает на порту 8000), и у меня, вероятно, что-то не так с конфигурацией nginx или каким-то неправильным IP-адресом.

Мой файл конфигурации nginx (версия nginx 1.18.0):

server {
    listen  0.0.0.0:8000;
    listen  [::]:8000;
    root    /app/app/static/build;
    index   index.html;    
    location / {
            proxy_pass         http://127.0.0.1:8080;
            proxy_redirect     default;
            proxy_set_header   X-Real-IP  $remote_addr;
            proxy_set_header   Host       $host;
    }
    location /socket.io/ {
            proxy_pass http://127.0.0.1:8080/socket.io;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_redirect     default;
            proxy_set_header   Host       $host;
    }
}

Мое приложение.py:

from app import app, socketio

if __name__ == "__main__":
    socketio.run(app, debug=False, port = "8080")

Мой __init**__**.py:

import os
from dotenv import load_dotenv
from flask import Flask, render_template, redirect, url_for, flash, request, abort
from flask_bootstrap import Bootstrap
from werkzeug.security import generate_password_hash, check_password_hash
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship
from flask_login import UserMixin, login_user, LoginManager, login_required, current_user, \
    logout_user
from flask_cors import CORS
from flask_socketio import SocketIO, emit

# -------------------- INIT APP --------------------
load_dotenv()
app = Flask(__name__, template_folder = "./")
app.debug = True
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")
app.config['CORS_HEADERS'] = 'Content-Type'
socketio = SocketIO(app, cors_allowed_origins = "http://127.0.0.1:8080/", logger=True, engineio_logger=True)

# CONNECT TO DB
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# LOGIN MANAGER
db = SQLAlchemy(app)
login_manager = LoginManager(app)
bootstrap = Bootstrap(app)

from app import models, forms, routes, handlers
from app.auth import forms, routes

# db.create_all()
# db.session.commit()

Это стартовая строка кода:

/srv/venv/bin/gunicorn -b 127.0.0.1:8080 --worker-class eventlet -w 1 app:app

Socket.io в реакции:

socket = io("localhost:8080/", {
    transports: ["websocket"],
    cors: {
        origin: "*",
    },
    query: `combat_id=${combatInfo.id}`,
});

Что я пробовал до сих пор: изменить все IP-адреса (в React тоже) на localhost:8080 или 127.0.0.1:8080 или http://127.0.0.1:8080, попытался удалить порт в socket.io url тоже попытался добавить/удалить некоторые конфигурации nginx на основе того, что я нашел во время поиска в Google. Также пробовал gevent вместо eventlet. Ничего не работало для меня до сих пор.

Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема действительно была в конфигурации nginx, а не в моем приложении. Основной причиной было отсутствие proxy_read_timeout 86400. Моя окончательная (и рабочая) конфигурация выглядит так:

server {
        listen       0.0.0.0:8000;
        listen       [::]:8000;
        server_name domain.name;
        root /app/app/static/build;
        index index.html;

        location / {
                proxy_pass         http://localhost:8080;
                proxy_redirect     http://localhoat:8000 https://domain.name;

                proxy_set_header   X-Real-IP  $remote_addr;
                proxy_set_header   Host       $host;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;

                proxy_set_header   Upgrade $http_upgrade;
                proxy_set_header   Connection "upgrade";
                proxy_read_timeout      86400;
        }
}

Другие вопросы по теме