Nginx 和跨子域 Cookies

Nginx 和跨子域 Cookies

TLDR:如何在我无法使用 nginx 作为代理来“配置”后端应用程序服务器的子域之间共享 cookie——proxy_* 的一些神奇组合?

Tornado Web 服务器正在“127.0.0.1:9999/ipython”上运行,我无法配置它(它作为 ipython 笔记本服务器的一部分运行)。我使用 nginx 从“www.mysite.com”代理到 127.0.0.1:9999成功地(至少 http 流量)。

但是,后端应用程序的一部分需要 Websockets。因为我使用的是 CloudFlare,所以我必须为 Websockets 使用单独的域(“Websockets 目前仅适用于企业客户……所有其他客户……应在其 CloudFlare DNS 中为 Websockets 创建子域并禁用 CloudFlare 代理”)。我使用的是“ws.mysite.com”。

当用户登录“https :// www.mysite.com”时,tornado Web 服务器会为“www.mysite.com”设置一个 cookie(我似乎无法配置它,否则我只会将其设置为“.mysite.com”)。当应用程序的 websocket 部分启动时,它会向“wss :// ws.mysite.com”发送请求,但无法进行身份验证,因为 cookie 是为不同的域(“www.mysite.com”)设置的。

nginx 是否有可能“欺骗”域名,以便 Tornado Web 服务器将其注册为“.mysite.com”?proxy_cookie_domain 似乎无法按我预期的方式工作...我应该硬编码“proxy_set_header Host”吗?

我正在考虑一个类似于...的 nginx 配置。

upstream ipython_server {
    server 127.0.0.1:8888;
}

server {
    listen 443;
    server_name www.mysite.com;

    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
    ssl on;

    # **** THIS DOESN'T WORK ??? ****
    proxy_cookie_domain www.mysite.com .mysite.com;

    location /ipython/static {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /ipython/api/sessions {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header Origin "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /ipython {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
            try_files $uri $uri/ =404;
    }
}

server {
    listen 443;
    server_name ws.azampagl.com;

    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
    ssl on;

    # **** THIS DOESN'T WORK ??? ****
    proxy_cookie_domain ws.mysite.com .mysite.com;

    # This is the websocket location
    location /ipython/api/kernels/ {
        proxy_pass https://ipython_server$request_uri;

        proxy_redirect off;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_read_timeout 86400;

        proxy_set_header Host $host;
        proxy_set_header Origin "";
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

我一直在寻找 nginx lua 模块?看起来你可以设置 cookie 域,但它看起来很黑客...

非常感谢您的帮助!

(旁注:从技术上讲,我确实可以访问 tornado 配置,但是没有关于如何为服务器设置“cookie 域”的文档。即

c.NotebookApp.tornado_settings = {'cookie_domain????':'.mysite.com'}

相关内容