Столкнулся с таким поведением директивы try_files: файл есть и в первой и во второй директории, но отдается только из /tmp/2/$uri. По логике вещей должен отдать 1111.111 но отдает test. В чем может быть дело?# wget -O - localhost/123.txt 2> /dev/null
2222.222
# cat /tmp/1/123.txt /tmp/2/123.txt
1111.111
2222.222
location /tmp {
alias /tmp/;
}
location / {
index index.html index.php;
error_page 404 = @try;
}location @try {
try_files /tmp/1/$uri /tmp/2/$uri ;
}# uname -a
Linux srv02 3.8.0-33-generic #48~precise1-Ubuntu SMP Thu Oct 24 16:28:06 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
# nginx -V
nginx version: nginx/1.1.19
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-auth-pam --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-echo --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-upstream-fair --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-dav-ext-module
А если без внутреннего перенаправления @try. Перенесите
try_files /tmp/1/$uri /tmp/2/$uri;
непосредственно в локейшн /
ЗЫЖ: не знаю насколько кретично, но не ставьте пробелы директивой знаком (;). Как тут try_files /tmp/1/$uri /tmp/2/$uri ;>[оверквотинг удален]
> --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
> --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy
> --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi
> --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-debug --with-http_addition_module
> --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module
> --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module
> --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6
> --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module
> --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-auth-pam --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-echo
> --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-upstream-fair --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-dav-ext-module
> А если без внутреннего перенаправления @try. Перенесите
> try_files /tmp/1/$uri /tmp/2/$uri;
> непосредственно в локейшн /
> ЗЫЖ: не знаю насколько кретично, но не ставьте пробелы директивой знаком (;).
> Как тут try_files /tmp/1/$uri /tmp/2/$uri ;Абсолютно такой же эффект.
wget -O - localhost/123.txt 2>/dev/null
2222.222
location / {
index index.html index.php;
try_files /tmp/1$uri /tmp/2$uri;
}
> Столкнулся с таким поведением директивы try_files: файл есть и в первой и
> во второй директории, но отдается только из /tmp/2/$uri. По логике вещей
> должен отдать 1111.111 но отдает test. В чем может быть дело?
> # wget -O - localhost/123.txt 2> /dev/null
> 2222.222
> # cat /tmp/1/123.txt /tmp/2/123.txt
> 1111.111
> 2222.222Что покажет:
ls -ld /tmp/1/
ls -l /tmp/1/123.txt /tmp/2/123.txt
?
# ls -l /tmp/1/123.txt /tmp/2/123.txt
-rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/1/123.txt
-rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/2/123.txt
> Что покажет:
> ls -ld /tmp/1/
> ls -l /tmp/1/123.txt /tmp/2/123.txt
> ?
> # ls -l /tmp/1/123.txt /tmp/2/123.txt
> -rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/1/123.txt
> -rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/2/123.txt
>> Что покажет:
>> ls -ld /tmp/1/
>> ls -l /tmp/1/123.txt /tmp/2/123.txt
>> ?А директория /tmp/1 доступна на чтение?
> ls -ld /tmp/1
>> # ls -l /tmp/1/123.txt /tmp/2/123.txt
>> -rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/1/123.txt
>> -rw-r--r-- 1 root root 6 Nov 25 21:01 /tmp/2/123.txt
>>> Что покажет:
>>> ls -ld /tmp/1/
>>> ls -l /tmp/1/123.txt /tmp/2/123.txt
>>> ?
> А директория /tmp/1 доступна на чтение?
>> ls -ld /tmp/1Я уже спрашивал, но топикстартер решил сохранить интригу решения своей проблемы.
да> А директория /tmp/1 доступна на чтение?
>> ls -ld /tmp/1
> да
>> А директория /tmp/1 доступна на чтение?
>>> ls -ld /tmp/1Напишите локейшн, чтобы обратиться конкретно к файлу /tmp/1/123.txt. Если идет ошибка, смотрите лог.
root@srv01:~# sudo -u NGINX cat /tmp/1/123.txt /tmp/2/123.txt
1111
2222
root@srv01:~# sudo -u NGINX ls -l /tmp/1/123.txt /tmp/2/123.txt
-rw-r--r-- 1 root root 5 Nov 26 10:33 /tmp/1/123.txt
-rw-r--r-- 1 root root 5 Nov 26 10:33 /tmp/2/123.txt
Интрига, мля. А на кой черт тут алиас?
> Интрига, мля. А на кой черт тут алиас?Интрига кружит голову! Алиас для решения не нужен. Скомпилил последний нжинкс - та же беда, один в один, косяк в конфиге.
>> Интрига, мля. А на кой черт тут алиас?
> Интрига кружит голову! Алиас для решения не нужен. Скомпилил последний нжинкс -
> та же беда, один в один, косяк в конфиге.В общем суть интриги заключалась в следующем: try_files смотрит относительно локального пути, последняя директива уже абсолютый путь. Вот такая конструкция работает как положено:
root /;
try_files /tmp/1/$uri /tmp/2/$uri /tmp/3/$uri;
>>> Интрига, мля. А на кой черт тут алиас?
>> Интрига кружит голову! Алиас для решения не нужен. Скомпилил последний нжинкс -
>> та же беда, один в один, косяк в конфиге.
> В общем суть интриги заключалась в следующем: try_files смотрит относительно локального
> пути, последняя директива уже абсолютый путь. Вот такая конструкция работает как
> положено:
> root /;
> try_files /tmp/1/$uri /tmp/2/$uri /tmp/3/$uri;Как-то я упустил, что root у Вас не определен. Однозначно, сказалось то, что у Вас /tmp/2/$uri открывался. Но тогда уж сделайте правильно:
root /tmp;
try_files /1/$uri /2/$uri /3/$uri;
>[оверквотинг удален]
>>> та же беда, один в один, косяк в конфиге.
>> В общем суть интриги заключалась в следующем: try_files смотрит относительно локального
>> пути, последняя директива уже абсолютый путь. Вот такая конструкция работает как
>> положено:
>> root /;
>> try_files /tmp/1/$uri /tmp/2/$uri /tmp/3/$uri;
> Как-то я упустил, что root у Вас не определен. Но тогда уж
> сделайте правильно:
> root /tmp;
> try_files /1/$uri /2/$uri /3/$uri;Спасибо!