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.

Crossbar.io en production.

+3 votes

J'ai fait un site afin de faire des listes de courses partagé (il est pas au top j'ai fait ce projet pour étudier le fonctionnement des technos web).

j'utilise Flask et WAMP j'utilise Croosbar.io pour démarrer les services.
J'ai configuré un reverse proxy afin de rediriger les requêtes du port 80 sur le port 5000.
Puis j'utilise daemonstools afin de lancer un script en user, qui me set un virtualenv et lance Crossbar.io.

Je ne sais pas si j'ai utilisé la bonne méthode pour faire cette mise en place.
Le html du site marche bien mais tout ce qui est websocket ne marche pas. Dans la console javascript de firefox j'obtiens toujours le message "Firefox ne peut établir de connexion avec le serveur à l'adresse ws://courses.hory.me/ws".

Ci-dessous ma config Crossbar:

{
    "controller": {
    },
    "workers": [
    {
        "type": "router",
        "options": {
            "pythonpath": [".."]
        },
        "realms": [
        {
            "name": "realm1",
            "roles": [
            {
                "name": "anonymous",
                "permissions": [
                {
                    "uri": "*",
                    "publish": true,
                    "subscribe": true,
                    "call": true,
                    "register": true
                }
                ]
            }
            ]
        }
        ],
        "components": [
        {
            "type": "class",
            "classname": "server.wamp",
            "realm": "realm1"
        }
        ],
        "transports": [
        {
            "type": "web",
            "endpoint": {
                "type": "tcp",
                "port": 5000
            },
            "paths": {
                "/": {
                    "type": "wsgi",
                    "module": "run",
                    "object": "app"
                },
                "ws": {
                    "type": "websocket",
                    "url": "ws://12.0.0.1:5000/ws"
                }
            }
        }
        ]
    }
    ]
}

Configuration apache2:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName hory.me
        ServerAlias courses.hory.me

        ProxyPreserveHost On
        ProxyRequests off
        ProxyPass / ws://127.0.0.1:5000/
        ProxyPassReverse / ws://127.0.0.1:5000/

        ProxyPass / http://127.0.0.1:5000/
        ProxyPassReverse / http://127.0.0.1:5000/

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Script pour le virtualenv:

cd /home/course/courses
source bin/activate
crossbar start --cbdir /home/course/courses/.crossbar \
 --logdir /home/course/courses/.crossbar/log
demandé 11-Jan-2015 par Laurent (124 points)
edité 11-Jan-2015 par max

2 Réponses

0 votes

Par défaut, Apache ne sait pas gérer Websocket, qui est un protocole bien différent de HTTP. Il essaye donc de proxy du HTTP sur ton port Websocket. Il y a des mods spéciaux pour Websocket : http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html.

Une alternative est d'utiliser libcap2 et virer apache2 https://github.com/crossbario/crossbar/wiki/Running-on-privileged-ports

répondu 11-Jan-2015 par Sam (4,978 points)

J'utilise deja une version de apache 2.4 avec le mod wstunnel

Version d'apache:

apachectl -V
Server version: Apache/2.4.10 (Debian)
Server built:   Nov 18 2014 14:21:53
Server's Module Magic Number: 20120211:37
Server loaded:  APR 1.5.1, APR-UTIL 1.5.4
Compiled using: APR 1.5.1, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)

Module chargé:

apachectl -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 proxy_module (shared)
 proxy_http_module (shared)
 proxy_wstunnel_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 xsendfile_module (shared)

Laurent, rajoute ce genre de choses en commentaire. Là tu viens de donner une réponse à ta propre question.

Ca serait pas "url": "ws://127.0.0.1:5000/ws" et non "url": "ws://12.0.0.1:5000/ws" ?

Désolé pour la réponse.
Merci pour la coquille mais même après modification ça ne marche toujours pas, j'obtiens toujours la même erreur.
Si nécessaire je peux rajouter le script qui gère la partie websocket.
Merci.

0 votes

Autre truc à tenter :

    ProxyPass /ws ws://127.0.0.1:5000/ws
    ProxyPassReverse /ws ws://127.0.0.1:5000/ws
répondu 14-Jan-2015 par Sam (4,978 points)

J'ai déjà tenté cette solution, j'ai essayé les différentes combinaisons possible avec et sans ws.
J'ai également tenté d'inverser l'ordre des ligne entre le proxypass pour http et ws.

As-tu trouvé la solution à ton problème? Je suis dans la même situation et je n'arrive pas à trouver de la doc concernant cette histoire de proxy, et utilisant lighttpd je suis encore plus coincé.

Non je n'ai toujours pas de solution. Pour le moment j'utilise le port ouvert par crossbar.io.

...