Из любви к nginx я не могу осмыслить эту проблему.
Желательно: Мне нужны два простых проекта php (wordpress в долгосрочном плане) в двух дополнительных местах под одним серверным блоком. Примечание: эти проекты находятся в двух разных каталогах на сервере, развернутом с помощью capistrano.
Проблема: Я получаю либо 404, 403, либо прямую загрузку потока октетов index.php. На последнем я, кажется, попал в правильный index.php, но он не передается в блок php-fpm. php-fpm работает, а не проблема (проверено в другом серверном блоке без подразделов)
Я просмотрел всю сеть и перепробовал миллионы "рабочих" конфигураций, но ничего не вышло.
План: Ниже вы видите работающий виртуальный хост nginx, обращающийся к нужным файлам index.html в правильных каталогах псевдонимов. Таким образом, я на полпути.
С вашей помощью я хотел бы адаптировать конфигурацию ниже, чтобы изменить index
в index.php и заставить php работать над location /staging
и /production
.
в location /production
вы видите одну конфигурацию (закомментированную), как я пытался заставить работать php.
server {
listen 82;
listen [::]:82;
server_name nginx-web.ch;
access_log /var/log/nginx/nginx-web_access.log;
error_log /var/log/nginx/nginx-web_error.log;
location /staging {
alias /var/www/nginx-web1/current;
index index.html
add_header X-debug-message "Location web1";
}
location /production {
alias /var/www/nginx-web/current;
index index.html
add_header X-debug-message "Location web";
#try_files $uri $uri/ /production/index.php;
#location ~ \.php$ {
# add_header X-debug-message "Location ~ php";
# try_files $uri =404;
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
# include fastcgi_params;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#}
}
}
Вот рабочий серверный блок, который он безуспешно пытался адаптировать для разделов :(
server {
listen 80;
listen [::]:80;
server_name testdev;
access_log /var/log/nginx/wp_access.log;
error_log /var/log/nginx/wp_error.log;
root /var/www;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
ОБНОВЛЕНИЕ с РАБОЧЕЙ КОНФИГУРАЦИЕЙ (должно быть <3 serverfault / stackoverflow):
Вот окончательная рабочая конфигурация, большое спасибо @RichardSmith
server {
listen 82;
listen [::]:82;
server_name nginx-web.ch;
access_log /var/log/nginx/nginx-web_access.log;
error_log /var/log/nginx/nginx-web_error.log;
index index.php;
location ^~ /staging/ {
alias /var/www/nginx-web1/current/;
if (!-e $request_filename) { rewrite ^ /staging/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
location /production {
alias /var/www/nginx-web/current;
if (!-e $request_filename) { rewrite ^ /production/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
}
Этот паттерн работает:
location ^~ /prefix/ {
alias /path/to/root/;
if (!-e $request_filename) { rewrite ^ /prefix/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass ...;
}
}
Использовать ^~
префикс, чтобы избежать другого регулярного выражения location
блоки имеют приоритет. Видеть этот документ.
Ценность location
и alias
оба заканчиваются /
или ни один из них не заканчивается /
. Видеть этот документ.
Избегать использования alias
и try_files
вместе из-за Эта проблема и увидеть это предупреждение по использованию if
.
Использовать $request_filename
как вычисленное значение SCRIPT_FILENAME
(поскольку он работает с обоими alias
и root
).
Всегда устанавливать fastcgi_param
после в том числе fastcgi_params
файл, чтобы последний не перезаписывал локальное значение.