I'm having a similar issue as here, I have a node js express server rendering a build react app ( CRA ) in a folder /public/build. However while using nginx as a reverse proxy, assets get status 404 and only index.html is loaded right.
So I've set up nginx and SSL with Let's Encrypt. I'm deploying a node js express server with ssr (react build) on a VPS in OVH. Let's say my IP is 1.2.3.4 for better reading. If I go to http://1.2.3.4:5000, everything works the same as in localhost, but if I go to https://mysite.fr, then only index.html is here and assets (js, css) get status 404. Please note that I've added an SSL certificate to get HTTPS and I had no issue with it. Here's my nginx config (/etc/nginx/sites-available/default) :
server_name mysite.fr; location / { proxy_pass http://1.2.3.4:5000; proxy_http_version 1.1. proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; try_files $uri $uri/ =404; }
SSL certificate was all config by certbot I wrote nothing about it
My architecture :
root/ -public/ -build/ ( so my react build app ) -index.html -server.js -others folders/
Express config in server.js :
app.use( '/', express.static(path.join(__dirname, 'public/build'))); // Route all other requests to React app index.html app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'public/build', 'index.html')); });
So I think that's where I messed up and that my error may come from the way I'm rendering my static files :/ Most stackOverflow answers suggested adding path.join(__dirname
but I already had it. I've tried changing port with 80 and then with 443 using this way (server.js) :
//* listen on :80 to get an SSL cert const server = app.listen(443, function() { console.log('Ready on port %d', server.address().port); });
But it resolved nothing.
When I hadn't added an SSL certificate, http://mysite.fr/static/js/main.f6cd9b6b.js wasn't working either.
I don't know if it's usable, but in index.html : <script defer="defer" src="/static/js/main.f6cd9b6b.js"></script><link href="/static/css/main.fbddab09.css" rel="stylesheet">
links looks like that. In the console of http://1.2.3.4:5000 (STATUS 200), assets request :
Request URL: http://1.2.3.4:5000/static/js/main.f6cd9b6b.js Request Method: GET Status Code: 200 OK Remote Address: 1.2.3.4:5000 Referrer Policy: strict-origin-when-cross-origin
In the console of https://mysite.fr (STATUS 404), assets request :
Request URL: https://mysite.fr/static/css/main.fbddab09.css Request Method: GET Status Code: 404 Not Found Remote Address: 151.80.149.10:443 Referrer Policy: strict-origin-when-cross-origin
Where I'm troubled is that 1.2.3.4 is not working (ok), HTTPS://mysite.fr:5000 not working (ok) but HTTP://mysite.fr:5000 it works fine too. The assets request :
Request URL:http://mysite.fr:5000/static/js/main.f6cd9b6b.js Request Method:GET Status Code:200 OK Remote Address:151.80.149.10:5000 Referrer Policy:strict-origin-when-cross-origin
Here's the log of /var/log/nginx/error.log
:
[error] 487919#487919: *372 connect() failed (111:Connection refused) while connecting to upstream, client: XX.XX.XX.XXX, server: mysite.fr, request: "GET / HTTP/1.1", upstream: "http://1.2.3.4:5000", host: "mysite.fr"
Pls note that the XX.XX.XX.XXX Is an IP address I don't know, I think it's mine since it says "client", at least it's not my site IP
I'm confused as to why HTTP://mysite.fr:5000 is working, and I can't find out if the issue is me ( the way I'm rendering static files for example, I really don't know ) or the way I configured nginx. In my head it shouldn't work because it would try to find something like http://1.2.3.4:5000:5000 (*;´□')ゞ I've also noticed that in Content type when it's working it says application/javascript; charset=UTF-8
and when it's not it says text/html
.
I'm sorry I'm not able to find out the problem alone, that's my first post I really do need help actually I'm blocked by it for days. (Before nginx I tried using Traefik but only got 404 (even for index ) and the docs was mainly for docker so it was not suited for me. I stopped it with systemctl stop traefik.service
.
NB : That's my first time deploying, using node js AND nginx so all of this is really new to me.