2010-06-19 24 views
0

J'ai un serveur web apache, et nous devons développer un module en lui (en utilisant mod_python ou mod_wsgi). Il va bien sûr gérer les requêtes envoyées en http GET/POST. Cependant, nous aimerions que ce module AUSSI gère les messages envoyés par d'autres applications distantes qui ne sont pas basées sur http. C'est-à-dire que le corps des paquets tcp peut être simplement un message au format json ou xml. Cette application distante ne cesse de cracher des notifications de temps en temps et n'attend aucune réponse du module apache. Je me demandais si je pouvais générer deux threads dans mon module (un recevant des messages d'apache quand les messages http sont reçus sur le port 80, l'autre thread écoutant sur un autre port .. disons 2000 .. et ma machine distante est configuré pour envoyer au port 2000). Une autre possibilité est que j'exécute une application séparée sur ma machine Apache en écoutant le port 2000. Quand il reçoit la notification, je l'enveloppe dans le message http et me le renvoie sur le port 80.can apache gérer les messages non-http

Je suppose que la question est: est mon module se limite à recevoir des messages uniquement via l'apache (à partir du port 80) ou est-ce que mon module apache peut également écouter sur d'autres ports? S'il y a une solution plus simple, s'il vous plaît faites le moi savoir. Merci.

Répondre

0

Vous pouvez apache configuré pour écouter sur différents ports, en utilisant la directive VirtualHost:

Listen 80 
Listen 2000 

<VirtualHost *:80> 
    ServerName www.example.com 
    WSGIScriptAlias//path/to/script.wsgi 

    <Location /my/location> 
    ... 
    </Location> 
</VirtualHost> 

<VirtualHost *:2000> 
    ServerName www.example.com 
    WSGIScriptAlias//path/to/script.wsgi 

    <Location /my/location> 
    ... 
    </Location> 
</VirtualHost> 

Plus d'info here.

Cependant, il pourrait être plus facile à écouter sur le port 80 et de se différencier en utilisant des chemins différents, comme ceci:

<VirtualHost *:80> 
    WSGIScriptAlias /normal /path/to/script.wsgi 
    WSGIScriptAlias /notifications /path/to/script.wsgi 
    WSGIApplicationGroup %{GLOBAL} 
    ... 
</VirtualHost> 
+0

Merci pour la réponse. Mais les notifications ne viennent pas en http: // url/notifications. Ce sont juste des messages tcp/ip normaux avec quelques données (peut être un fichier texte ou un fichier xml). Il n'y a pas d'en-tête http dans les messages. La ligne "WSGIScriptAlias ​​/ /path/to/script.wsgi" enverrait-elle toujours de tels messages au script.wsgi? –

0

Comme Apache dans la plupart des configurations est un serveur web multi process, vous ne pouvez pas écouter sur un socket distinct de votre code Python car plusieurs processus tenteraient de faire la même chose et ainsi ils se heurteraient. Techniquement, vous pouvez utiliser le mode démon mod_wsgi pour votre application WSGI et l'exécuter avec un seul processus pour éviter le problème multiprocessus, mais vous vous demandez toujours si c'est une bonne idée et le processus complètement distinct d'Apache est probablement meilleur.