alhames
alhames.ru
Настраиваю nginx, возникла куча вопросов, ответы на которые что-то не особо удается нагуглить. Может вы поможете?
1) Директива include - какие пути она понимает? Абсолютный путь понимает - это понятно, а как быть с относительными?
Если nginx.conf расположен в папке /etc/nginx, то эта папка и будет корневой для всех относительных путей и изменить ее никак нельзя?

2) Обязательные параметры для server - насколько я понимаю необходимо указать listen и server_name? Но столкнулся с тем что у меня сервер отказался запускаться без access_log и error_log. Не понимаю в чем их необходимость, если сразу после server_name у меня стоял rewrite.

3) Задание правил для location и вообще логика и последовательность обработки меня немного вводит в ступор. С апачем как-то проще было.
location = /img/ - соответствует только адресу «/img/»
location ~ /img/ - соответствует любому адресу, содержащему «/img/»
location ~* /img/ - соответствует любому адресу, содержащему «/img/», либо «/iMg/», либо «/ImG/» и т.п.
location /img/ - соответствует любому адресу, начинающемуся с «/img/»
location ~ ^/img/ - соответствует любому адресу, начинающемуся с «/img/»
location ^~ /img/ - соответствует любому адресу, начинающемуся с «/img/»
В чем отличия последних трех?
В чем особенности использования break?

4) Как лучше редиректить с субдоменов?
server {
listen 80;
server_name www.example.ru *.example.ru;
rewrite ^ example.ru$request_uri? permanent;
}

Такое кстати у меня не сработало из-за отсутствия заданых путей к логам. Что значит «^» после rewrite? Обычно ставили .*, что означало любой набор символов.
Либо так:
location / {
if ($http_host != "example.com") {
rewrite ^/(.*)$ example.com/$1 permanent;
}
}


5) Как перенаправлять все запросы, не начинающиеся со /static/ и не соответствующие реальному файлу (типа robots.txt) на index.php?
Для апача это выглядит примерно как:
<IfModule mod_rewrite.c>
RewriteEngine on

RewriteRule ^/static/ - [L]

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule .* index.php [L]
</IfModule>

А для nginx:
# сначала
location /static/ {
break;
}

# потом
location / {
error_page 404 =200 /index.php;
}
location = /index.php {
include fastcgi.conf;
}

# либо
location / {
try_files $uri /index.php;
}
location = /index.php {
include fastcgi.conf;
}

# либо
location / {
try_files $uri @php;
}
location @php {
include fastcgi.conf;
}


Что лучше? или быть может как-то иначе?

6) Директива fastcgi_pass - в чем отличие указания стандартного localhost:9000 и unix:/tmp/fastcgi.socket? Насколько оправдано создавать upstream, если в принципе все обрабатывает только один сервер?