Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

887
Vistas
Configurar nginx, uwsgi con matraz y matraz-socketio

Escribí una aplicación Flask que usa Flask -Socketio . Estoy ejecutando la aplicación del matraz en el puerto 8000 y la aplicación cliente por separado en el puerto 3000 (react-webpack). Funciona a la perfección en el modo de desarrollo (servidor web incluido en el matraz). Sin embargo, cuando trato de ejecutar usando uwsgi tengo problemas. Estos problemas y configuraciones se detallarán a continuación.

wsgi.py (permanece constante)

 from cloud_app import app, sock if __name__ == "__main__": sock.run(app,host='0.0.0.0', debug=True, port=8000)

__init__.py (permanece constante)

 from flask import Flask from flask_socketio import SocketIO import secrets app = Flask(__name__, static_url_path='/static') app.secret_key = secrets.secret_key sock = SocketIO(app) from cloud_app import routes

route.py (permanece constante con la eliminación obvia de la lógica real)

 ... from flask_cors import CORS cors = CORS(app, resources={r"/*": {"origins": "*"}}, headers=['Content-Type'], expose_headers=['Access-Control-Allow-Origin'], supports_credentials=True) @app.route('/example') def example(): return 'example' @sock.on('connect', namespace='/example') def handle_example_connect(): sock.emit('example', 'Connected!\nAwaiting commands...\n', namespace='/example') ...

Primera configuración

tomado de la documentación para matraz-socketio y uwsgi traducido a un archivo ini

 [uwsgi] module = wsgi:app master = true processes = 5 buffer-size=32768 http-websockets = true http = :8000 gevent = 1000

La configuración de nginx no es necesaria aquí, ya que el paquete web sirve para esto y el archivo ini está configurado para responder directamente a las solicitudes http ' http=:port '

CONSOLA: Esto a veces lo imprime estando conectado '¡Conectado! Esperando comandos...' del evento de conexión en rutas.py sin embargo, también dará los siguientes errores

 POST http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MgTjSL-&sid=5bf4758a09034805b1213fec92620e39 400 (BAD REQUEST) GET http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MgTjSMG&sid=5bf4758a09034805b1213fec92620e39 400 (BAD REQUEST) websocket.js:112 WebSocket connection to 'ws://localhost:8000/socket.io/?EIO=3&transport=websocket&sid=5bf4758a09034805b1213fec92620e39' failed: Error during WebSocket handshake: Unexpected response code: 400

Salida del proceso UWSGI:

 ... [pid: 9402|app: 0|req: 16/33] 127.0.0.1 () {44 vars in 1316 bytes} [Thu May 9 13:55:41 2019] POST /socket.io/?EIO=3&transport=polling&t=MgTl93y&sid=b208e874c0e64330bdde35ae1773b4e0 => generated 2 bytes in 0 msecs (HTTP/1.1 200) 3 headers in 137 bytes (3 switches on core 996) [pid: 9402|app: 0|req: 17/34] 127.0.0.1 () {40 vars in 1255 bytes} [Thu May 9 13:55:41 2019] GET /socket.io/?EIO=3&transport=polling&t=MgTl94Q&sid=b208e874c0e64330bdde35ae1773b4e0 => generated 12 bytes in 0 msecs (HTTP/1.1 200) 3 headers in 151 bytes (3 switches on core 996) ... [pid: 9402|app: 0|req: 27/48] 127.0.0.1 () {44 vars in 1316 bytes} [Thu May 9 13:56:57 2019] POST /socket.io/?EIO=3&transport=polling&t=MgTlRbG&sid=5c4c38f18f6b47798978440edd181512 => generated 2 bytes in 0 msecs (HTTP/1.1 200) 3 headers in 137 bytes (3 switches on core 998) Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 43, in __call__ start_response) File "/usr/local/lib/python2.7/dist-packages/engineio/middleware.py", line 47, in __call__ return self.engineio_app.handle_request(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 360, in handle_request return self.eio.handle_request(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/engineio/server.py", line 322, in handle_request start_response(r['status'], r['headers'] + cors_headers) IOError: headers already sent ...

Segunda configuración

Tomado de esta pregunta . archivo ini

 [uwsgi] module = wsgi:app master = true processes = 5 buffer-size=32768 http-websockets = true socket = example_app.sock chmod-socket = 666 vaccum = true die-on-term = true

servidor nginx

 server { listen 8000; location /{ include uwsgi_params; uwsgi_pass unix:/path/to/app/example_app.sock; } location /socket.io { #include proxy_params; proxy_http_version 1.1; #proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_pass http://unix:/path/to/app/example_app.sock; } }

Las opciones comentadas se dejaron previamente sin comentar

errores

Consola:

 polling-xhr.js:263 GET http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MgTotN9 502 (Bad Gateway) Access to XMLHttpRequest at 'http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MgTotN9' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

registro de errores de nginx (/var/log/nginx/error_log)

 2019/05/09 14:16:35 [error] 11338#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: , request: "GET /socket.io/?EIO=3&transport=polling&t=MgTpw36 HTTP/1.1", upstream: "http://unix:/path/to/app/example_app.sock:/socket.io/?EIO=3&transport=polling&t=MgTpw36", host: "localhost:8000", referrer: "http://localhost:3000/home"

Tenga en cuenta que en ambos ejemplos, las solicitudes http (las atendidas por la aplicación) funcionan bien, solo las llamadas de socket dan problemas.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

matraz_socketio envuelve la aplicación y utiliza diferentes protocolos según lo que esté disponible y cómo se llame. Puede usar sondeo HTTP y Websockets nativos, dos métodos diferentes que usan dos protocolos diferentes.

Si se usa exclusivamente eventlet o gevent , entonces se usa sondeo, es decir, solicitudes http.

Si se usa UWSGI , se usan websockets nativos (ws).

Si se usa gevent o eventlet junto con uwsgi , se usa la implementación nativa de websocket de uwsgi .

En mi caso, usé socket.io en el cliente, que usa sondeo http, por lo tanto, cuando intenté usar uwsgi, el servidor esperaba una conexión websocket nativa y no tenía nada que manejara el sondeo http.

Entonces, para resolver mi problema, probé las siguientes soluciones

  • Elimine UWSGI ya que matraz_socketio + eventlet o gevent produce una configuración lista para producción ( docs )
  • Use WS nativo y UWSGI (no importa tener eventlet o gevent ya que la implementación de UWSGI se usa independientemente)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda