Назад | Перейти на главную страницу

nginx несколько (сейчас два) проектов php через php-fpm в подкаталогах с использованием псевдонима

Из любви к 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 файл, чтобы последний не перезаписывал локальное значение.