web-dev-qa-db-ja.com

nginxをプロキシとして使用しているTomcatでセッションが失われる

Tomcarサーバーにいくつかのアプリケーションがあります。プロキシにnginxを使用しているため、サブドメインからアプリケーションにアクセスできます

tomat:8080/app1 > app1.mydomain.com 
tomat:8080/app2 > app2.mydomain.com 

リバースプロキシを設定します。

server {
  listen 80;
  server_name  app1.mydomain.com;
  location / {
   proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $Host;
      proxy_set_header X-Forwarded-Host $Host;
     proxy_set_header X-Forwarded-Server $Host;

    proxy_pass http://Tomcat:8080/app1/;
  }
}

問題なくアプリケーションにアクセスできます。しかし、セッションを維持することはできません。 ngixの背後で問題なく実行される桟橋の別のアプリケーションがあります。また、アプリケーションに直接アクセスすると、問題なく操作できます。

ヒントはありますか?

ありがとう。

3
Cesar

この問題は、プロキシの場所のパスがTomcatアプリケーションのコンテキスト名と一致せず、リクエストごとに新しいJSESSIONIDを引き起こすCookieパスの不一致がある場合に発生することに気付きました。

以下に示すように、proxy_cookie_pathディレクティブを追加してみてください。

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-Host $Host;
    proxy_set_header X-Forwarded-Server $Host;

    proxy_cookie_path ~*^/.* /;

    proxy_pass http://Tomcat:8080/app1/;
}
7

スティッキーセッションまたはセッションアフィニティを有効にできます。これにより、同じクライアントからのリクエストが毎回同じTomcatに渡されるようになります

Nginxの変更:

スティッキcookie srv_id expires = 1h domain = .example.com path = /;

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky

0
skonka

私にとって、Diwakar Timilsinaによって提供された答えは、私の問題を解決した正確なものでした。

NginxがVHostのルートコンテキストに応答し、コンテキスト/アプリケーション内のTomcatのインスタンスに向けてリクエストをプロキシする

例えば:

http://hunt.pepe.com/index.jsp  -->  http://localhost:8080/hunt-app

追加した唯一のディレクティブは[proxy_cookie_path〜^ /。/;]でした:

location / {
    ·
    ·
    proxy_cookie_path ~*^/.* /;
    ·
    proxy_pass  http://localhost:8080/hunt-app;
}

本当にありがとう、あなたは文字通り私のお尻を救った。

0
Alvaro