2016-08-17 2 views
0

Lors de l'activation Push, chaque fois que je laisse des onglets avec mon application ouverte pendant plus d'une minute, je reçois le niveau INFO suivant message du journal:Vaadin application PushHandler ne peut pas trouver l'interface utilisateur basée sur demande à l'aide nginx, la sécurité ressort

16:57:17 INFO PushHandler - No UI was found based on data in the request, but a slower lookup based on the AtmosphereResource succeeded. See http://dev.vaadin.com/ticket/14251 for more details. 

ticket 14251 ne semble pas contenir toutes les informations pertinentes pour mon scénario est la suivante:

L'application est une application Spring Vaadin

mon interface utilisateur est annotées avec

@Push(transport=Transport.WEBSOCKET_XHR) 

J'utilise un serveur nginx configuré pour pousser comme ceci:

map $http_connection $upgrade_requested { 
    default upgrade; 
    ''  close; 
} 

server { 
    listen   9002; 
    server_name  localhost; 
    root   /; 

    location/{ 
      proxy_set_header X-Forwarded-Host $host; 
      proxy_set_header X-Forwarded-Server $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $host:$server_port; 

      proxy_cookie_path ~*^/.* /; 
      proxy_pass http://127.0.0.1:9003/; 
      proxy_redirect off; 
    } 

    location /vaadinServlet/PUSH { 
      proxy_pass http://127.0.0.1:9003; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection $upgrade_requested; 
    } 

Ce message de journal apparaît quand je laisse simplement quelques onglets ouverts. Aucune poussée ne se produit réellement (au moins aucune n'est déclenchée par ma logique d'application). Cela se produit dans tous les navigateurs dans lesquels je l'ai testé: Firefox, Chrome et Safari. Autre que le message de journal, je n'ai pas remarqué de problèmes.

Comment puis-je me débarrasser de ce message de journal? Est-ce que cela indique peut-être des problèmes que je n'ai peut-être pas encore remarqués?

Répondre

2

Basé sur https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/, les connexions websocket dans nginx utilisent l'option de configuration proxy_read_timeout, qui est définie par défaut sur 60s. Ainsi, nginx va couper la connexion ws après 60s, et le navigateur établira alors une nouvelle connexion ws. Lorsque cela se produit, la demande qui rétablit la connexion doit contenir un paramètre "v-uiId =" et, sur cette base, le serveur doit trouver l'interface utilisateur associée et tout doit continuer à fonctionner.

Votre message d'erreur indique qu'il y a un problème avec le paramètre v-uiId et que, pour une raison quelconque, le serveur ne trouve pas l'instance d'interface utilisateur correcte sur cette base. Le serveur retombe ensuite sur un autre mécanisme de recherche, qui parcourt les instances de l'interface utilisateur et essaie de trouver le bon. Celui-ci réussit, et tout continue de fonctionner.

Il existe également la possibilité que votre serveur dispose également d'une temporisation de socket Web configurée de 60 s. Dans ce cas, nginx ou le serveur coupera la connexion en premier. Des choses étranges peuvent parfois arriver, selon l'ordre des événements.

Si vous ne faites rien, vous aurez un problème potentiel de coupure de la connexion nginx et le serveur effectuant une opération de poussée juste après cela. Si le serveur ne s'est pas rendu compte que la connexion a été coupée (à cause du fonctionnement du protocole TCP), alors il pourrait pousser le message suivant dans le vide.

Essayez de supprimer/modifier le délai d'expiration dans nginx et/ou sur votre serveur. En règle générale, si la fermeture de la connexion se produit sur le serveur, Vaadin saura immédiatement qu'il n'y a pas de connexion active et repoussera les poussées. Si quelqu'un dans le milieu coupe quelque part la connexion sans le dire au serveur, les choses peuvent mal se passer.

+0

Merci pour cette explication. J'ai essayé d'augmenter le proxy_read_timeout dans ma configuration de nginx. Pourtant, le même message de journal apparaît une fois que le délai d'expiration est atteint. J'ai été incapable de trouver comment changer le délai d'attente du côté serveur/Vaadin. En fait, je ne pouvais même pas savoir quel est le délai d'attente. J'imagine que c'est moins que les 10 minutes que j'ai configurées en nginx.Je pourrais bien sûr augmenter encore le délai d'attente de nginx, mais je préférerais avoir une solution où Vaadin fait le gros du travail. –

+0

Quel serveur utilisez-vous? –

+0

Apache Tomcat 8.0.30 –