solara icon indicating copy to clipboard operation
solara copied to clipboard

solara websocket fails when deployed behind two nginx proxies

Open havok2063 opened this issue 9 months ago • 6 comments

I am trying to deploy Solara via FastAPI using nginx. Due to the nature of things, it is behind two proxies. I'm running into issues where the solara mount loads but the websocket connection to the kernel fails to load any of the content. Solara perptually displays a spinning "Loading app".

The browser console displays

rootPath /valis/solara [solara:495:17](https://api.sdss.org/valis/solara/)
solara init solara-main undefined [solara:633:13](https://api.sdss.org/valis/solara/)
Starting WebSocket: wss://api.sdss.org/valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00 [default.js:66:20](webpack://widgetti/solara-widget-manager8/node_modules/@jupyterlab/services/lib/kernel/default.js)
GET
wss://api.sdss.org/valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00/channels?session_id=33b7d8b8-f73c-4941-a997-c8a1779ee66a

Firefox can’t establish a connection to the server at wss://api.sdss.org/valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00/channels?session_id=33b7d8b8-f73c-4941-a997-c8a1779ee66a. [default.js:73:23](webpack://widgetti/solara-widget-manager8/node_modules/@jupyterlab/services/lib/kernel/default.js)
XHRGET
https://api.sdss.org/valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00?1716232215115
[HTTP/1.1 404 Not Found 87ms]

The network tab gives a 404 error on /valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00 and a 403 Forbidden error on /valis/solara/jupyter/api/kernels/bf44100d-d4aa-47ad-976f-98bec8caaf00/channels?session_id=xxx with a NS_ERROR_WEBSOCKET_CONNECTION_REFUSED note.

If I expose the first proxy, and navigate to the site, everything works correctly. I'm wondering if something is wrong with our second proxy setup? The SOLARA_ROOT_PATH envvar is set to /valis/solara/. We're also setting UVICORN_PROXY_HEADERS=1 and FORWARDED_ALLOW_IPS="*". Do y'all have any ideas on what could be going wrong or what is missing from our nginx setup?

Our first proxy nginx setup

    location /valis {
       proxy_pass http://valis;
       # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       # Other headers
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 86400;
        proxy_read_timeout 86400;
    }

    # Solara WebSocket support
    location /valis/solara/jupyter/ {
        proxy_pass http://valis;
       	# WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       	# Other headers
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 86400;
        proxy_read_timeout 86400;
    }

Our second proxy nginx setup

    location /valis {
       	proxy_pass http://dataviz-vm.sdss.utah.edu/valis;
       	# WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       	# Other headers
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Script-Name /valis;

        proxy_connect_timeout 86400;
        proxy_read_timeout 86400;
    }

    # Solara WebSocket support
    location /valis/solara/jupyter/ {
        proxy_pass http://dataviz-vm.sdss.utah.edu/valis;
       	# WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       	# Other headers
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Script-Name /valis/solara/jupyter/;

        proxy_connect_timeout 86400;
        proxy_read_timeout 86400;
    }

havok2063 avatar May 20 '24 19:05 havok2063