Nginx - статический файловый беспорядок с корневым и псевдонимом
Мне нужно обслуживать мое приложение через мой сервер приложений в 8080
и мои статические файлы из каталога, не касаясь сервера приложений. Конфигурация nginx у меня есть что-то вроде этого...
# app server on port 8080
# nginx listens on port 8123
server {
listen 8123;
access_log off;
location /static/ {
# root /var/www/app/static/;
alias /var/www/app/static/;
autoindex off;
}
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;
}
}
Теперь, с этой конфигурацией, все работает нормально. Обратите внимание, что директива root
закомментирована.
Если я активирую root
и деактивирую alias
- он перестает работать. Однако, когда я удаляю конечный /static/
из root
, он снова начинает работать.
Может кто-нибудь объяснить, что происходит. Также объясните, пожалуйста, четко и подробно, какие различия между root
и alias
и их целями.
Ответы
Ответ 1
Я нашел ответы на мои заблуждения.
Существует очень важное различие между директивами root
и alias
. Это различие существует в способе обработки пути, указанного в root
или alias
.
В случае root
директивы к root
каталогу добавляется полный путь, включая часть местоположения, тогда как в случае директивы alias
к alias
добавляется только часть пути, НЕ включающая часть местоположения.
Проиллюстрировать:
Допустим, у нас есть конфиг
location /static/ {
root /var/www/app/static/;
autoindex off;
}
В этом случае последний путь, который получит Nginx, будет
/var/www/app/static/static
Это вернет 404
так как нет static/
внутри static/
Это связано с тем, что часть местоположения добавляется к пути, указанному в root
. Следовательно, с root
, правильный путь
location /static/ {
root /var/www/app/;
autoindex off;
}
С другой стороны, с alias
, часть местоположения удаляется. Так что за конфиг
location /static/ {
alias /var/www/app/static/;
autoindex off;
}
окончательный путь будет правильно сформирован как
/var/www/app/static
Смотрите документацию здесь: http://wiki.nginx.org/HttpCoreModule#alias
Ответ 2
как говорят @treecoder
В случае директивы root
полный путь добавляется к корню, включая часть местоположения, тогда как в случае директивы alias
только часть пути, не включающая часть местоположения, добавляется к псевдониму.
Изображение стоит тысячи слов
для root
:
![введите описание изображения здесь]()
для alias
:
![введите описание изображения здесь]()
Ответ 3
В вашем случае вы можете использовать root
директиву, потому что $uri
часть директивы location
совпадает с последней root
директивой.
Документация Nginx также советует:
Когда location соответствует последней части значения директив:
location /images/ {
alias /data/w3/images/;
}
вместо этого лучше использовать корневую директиву:
location /images/ {
root /data/w3;
}
и root
директива добавит $uri
к пути.
Ответ 4
Просто быстрое добавление к @good_computer очень полезного ответа, я хотел заменить на корневой каталог URL-адресом, но только если он соответствует подпапке, содержащей статические файлы (которые я хотел сохранить как часть пути).
Например, если запрашиваемый файл находится в /app/js
или /app/css
, посмотрите /app/location/public/[that folder]
.
Я получил это для работы с использованием регулярного выражения.
location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
alias /home/user/sites/app/public/$1;
access_log off;
expires max;
}
Ответ 5
server {
server_name xyz.com;
root /home/ubuntu/project_folder/;
client_max_body_size 10M;
access_log /var/log/nginx/project.access.log;
error_log /var/log/nginx/project.error.log;
location /static {
index index.html;
}
location /media {
alias /home/ubuntu/project/media/;
}
}
Серверный блок для размещения статической страницы в nginx.
Ответ 6
Другими словами, соблюдая это кратко: в случае root
указанный аргумент location является частью пути файловой системы и URI. С другой стороны - для директивы alias
аргумент оператора location является частью только URI
Таким образом, alias
- это другое имя, которое отображает определенный URI на определенный путь в файловой системе, тогда как root
добавляет аргумент location к корневому пути, указанному в качестве аргумента для директивы root
.
Ответ 7
alias
используется для замены пути части местоположения (LPP) в пути запроса, в то время как root
используется для добавления к пути запроса.
Это два способа сопоставить путь запроса с окончательным путем к файлу.
alias
может использоваться только в блоке местоположения, и он переопределит внешний root
.
alias
и root
не могут использоваться в блоке вместе.