Конфиг нормальный, все работает именно так, как вы написали. Запрос к / уходит на 127.0.0.1:8080. Запрос на /index.html попадает в другой локейшн и отдается статикой. Так как вы не описали, как же должна себя вести система, какие запросы должны быть статикой, какие - динамикой, то предложить другой конфиг возможности нет.
PS;
Вариант 1. Описываем / отдельным локейшеном точного совпадения
root /home/www/files;
location = / {
index index.html;
}
location / {
proxy_pass http://127.0.0.1:8080;
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 ~ \.(html|css|js)$ {
access_log off;
expires 30d;
}
Запрос / попадет в "= /", там отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html, который попадет в "location ~ \.(html|css|js)$".
Вариант 2. Просто проверяем наличие файлов на диске, и перебрасываем в ноду только если таковых нет.
root /home/www/files;
location / {
try_files $uri $uri/ @nodejs;
index index.html;
}
location @nodejs {
proxy_pass http://127.0.0.1:8080;
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 ~ \.(html|css|js)$ {
access_log off;
expires 30d;
}
В данном случае запрос попадает в "location /", там try_files проверяет наличие файла на диске или наличие такой директории. Наличие директории срабатывает (у нас есть на диске директория /home/www/files/), запрос остается в контексте location /, отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html. Если же try_files ничего не нашло (например, на запрос /bla/bla/), то try_files делает внутренний редирект на свой последний аргумент - "именованный локейшн", в котором уже происходит работа с нодой.
В принципе второй вариант даже где-то предпочтительнее, но если нужно поведение "перебрасываем на ноду по запросу /dir/file.txt даже если на диске есть /home/www/files/dir/file.txt" - то первый вариант.
Оба варианта будут давать 404, если файл index.html убрать с диска. Если нужно поведение, что есть index.html - даем его, нет - уходим на ноду, то конфиг чуток меняем.
Вариант 3
root /home/www/files;
location / {
try_files $uri /index.html @nodejs;
}
location @nodejs {
proxy_pass http://127.0.0.1:8080;
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 ~ \.(html|css|js)$ {
access_log off;
expires 30d;
}
Поменялся только try_files, теперь он не проверяет наличие директории, но проверяет наличие двух файлов, запрошенного (в случае запроса / - такого файла нет), и /home/www/files/index.html вне зависимости от URL запроса.