Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Apache + mod_wsgi : Intégration Socket.io

0 votes

J'ai un serveur dont la stack est composée de Apache + mod_wsgi + MySQL + bottle + SQLAlchemy. Mon client souhaite intégrer des fonctionnalités temps réel, et nous avons pensé à socket.io pour cela.

Apparemment, il existe une implémentation décente pour python, mais c'est là que les problèmes commencent, d'ou ma question :

  • Le mode threading est supporté, mais clairement déconseillé en faveur du mode asynchrone, ce qui se comprend. Faut t'il renoncer à mod_wsgi et employer un autre serveur (ça m'ennuie, vu que j'ai d'autres trucs qui tournent sous Apache).
  • En admettant que je passe à une solution asynchrone, laquelle favoriser ? Est-ce sans risque pour SQLAlchemy ?
  • S'il existe une solution valable pour garder Apache, comment fait on pour employer des websockets avec ?

[Note: les fonctionnalités en question doivent être intégrées au reste de l'API, ce qui exclut a priori l'option d'utiliser un second serveur.]

demandé 12-Fev par yoch (2,312 points)

2 Réponses

0 votes
 
Meilleure réponse

Quelques éléments de réponse par rapport à ce que mes recherches ont donné :

  • mod_wsgi n'est pas compatible avec websockets, aux dires de son auteur.
  • si l'on veut rester tout de même rester sur Apache, la solution qui revient généralement est de lancer un serveur socketio sur une autre adresse ip/port, et de configurer Apache comme reverse proxy; sinon, une solution de déploiement mieux adaptée doit être envisagée.
  • l'auteur de SQLAlchemy affirme que sa lib devrait être compatible avec gevent, a condition d'utiliser un driver python (pour que le monkey-patching fonctionne). En revanche, asyncio est visiblement incompatible (bien qu'il semble exister une lib qui permettent de le faire). Mais ça tombe bien puisque python-socketio supporte gevent.
répondu 14-Fev par yoch (2,312 points)
sélectionné 15-Fev par yoch
+1 vote

Quelques considérations :

Pour ma part, je suis passé de mod_wsgi / apache2 à gunicorn en utilisant toujours apache en frontal, utilisé comme (reverse) proxy, avec un socket unix comme canal de communication entre les 2 serveurs applications.

J'ai fait ça pour avoir des version différentes de python sur le même serveur. J'ai testé avant ça la solution avec le package mod_wsgi depuis pypi, mais je n'ai pas été convaincu (quelques bogues bizares, qui apparaissent de façon aléatoire, même si le dev de mod_wsgi est assez réactif...)

Avec gunicorn, ça roule direct...

Cette mise à jour de l'infrastructure "serveur" m'a pris un peu de temps pour le première migration, mais elle est assez rapide après. Il faut faire un service systemd pour lancer / stopper gunicorn, mais ça passe bien. À chaque mise à jour de la base de code, on faite un restart sur le service, et c'est reparti.

Le mode threading est très clairement déconseillé avec python : GIL is out here... Par contre, le package multiprocessing propose la même API que threading, sans GIL.

Je n'ai pas utilisé (encore ?) SQLAlchemy, ni websocket avec django, je n'ai pas d'expérience sur ces sujets.

répondu 13-Fev par frague (564 points)

Intéressant, cela confirme ce que j'avais compris, comme quoi les architectures avec Gunicorn derrière un reverse proxy (souvent nginx) sont très courantes.

...