mak_ufo
@mak_ufo

Почему не отдаётся статика?

Здравствуйте. Пытался настроить nginx на локалхосте и столкнулся с проблемой. Статика отдаётся, все запросы проксируются, но при посещении localhost:3000 не отображается index.html (вместо этого вижу 404 page not found).

При посещении localhost:3000/index.html всё нормально. Вот nginx.conf
server {
	    # IP, который мы будем слушать
	    listen 127.0.0.1:3000;

	    location / {
		# IP и порт, на которых висит node.js
		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;
		root /home/www/files;
		index index.html;
	    }

	    location ~ \.(html|css|js)$ {
		access_log off;
		expires 30d;
		root /home/www/files/;
	    }
	}
  • Вопрос задан
  • 646 просмотров
Решения вопроса 1
@miksir
IT
Конфиг нормальный, все работает именно так, как вы написали. Запрос к / уходит на 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 запроса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
он проверяет в порядке следования:
index index.html;
на index находит контент и успокаивается

или сотри или сделай чтобы нода возвращала что там в index.html лежит
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы