2015-10-19 1 views
0

je la configuration suivante:Sinatra rack Session perdue après 5 à 10 secondes

application Sinatra acheminées via nginx, avec une redirection définie dans le nginx configuration:

http://www.example.com/api-http://api.example.com

I initialiser l'utilisation des sessions avec:

use Rack::Session::Pool 

maintenant, je peux stocker et récupérer des données de session avec:

get '/make_it_so' do 
    session[:data] = 'yes indeed.' 
    end 

    get '/what_gives' do 
    session[:data] 
    end 

Pour 3 à 5 rechargements de http://www.example.com/what_gives je peux voir les données de session, puis tout à coup il disparaît à zéro.

Quelqu'un peut-il aider?

Des questions similaires sont:

Rack Sessions getting lost in Chrome

Sinatra not persisting session with redirect on Chrome

+0

Comment utilisez-vous votre application Sinatra? – matt

+0

voulez-vous dire ceci: "rerun - unicorn -c unicorn.rb -E test"? au fait, quand j'utilise la réponse http://stackoverflow.com/a/19251746/2767626 (basée sur Rack :: Session: Cookie) tout fonctionne bien! –

+0

L'utilisation de 'rerun' pourrait l'expliquer. Si 'rerun' relance votre application pour une raison quelconque, alors les sessions basées sur la mémoire (dans' Rack :: Session :: Pool') seront perdues. Les sessions basées sur les cookies fonctionneraient toujours. Est-ce que quelque chose change dans le répertoire qui provoquerait 'rerun' à redémarrer l'application? – matt

Répondre

0

Je pense que votre problème est peut-être des travailleurs Unicorn. Autant que je sache, Unicorn crée une instance d'application par travailleur. Chacune de ces instances aura malheureusement un pool de sessions séparé, donc cela ne fonctionnera qu'avec 1 worker.

J'ai eu ce même problème, et ce n'est pas que les sessions soient perdues avec le temps, c'est que les demandes sont traitées par différents travailleurs. Supposons que votre première requête touche le travailleur 1 et qu'elle définisse une clé de session 'sessionkey1', vous obtenez un cookie avec la même valeur. Ensuite, vous effectuez une seconde requête et celle-ci touche le worker 2, elle ne trouvera pas votre clé, de sorte qu'une nouvelle session et un cookie vous seront assignés, donnant l'impression que votre session a été perdue. Je ne sais pas s'il existe un moyen de connecter ces pools, mais je pense qu'il serait plus facile de passer à un magasin de session externe, comme Redis. Redis s'intègre facilement avec Rack à travers la gemme redis-rack, vous devriez donc essayer.

Espérons que cela aide.