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

Невозможно настроить Nginx для обработки PHP вместе с proxy_pass

У меня есть три требования к моей настройке Nginx:

  1. Перенаправлять все запросы на / на мой Java-сервер, работающий на порту 9001
  2. Перехватывать все статические URL-адреса файлов и обслуживать их через сам Nginx.
  3. Подавать определенный базовый URL из папки, содержащей сценарии PHP.

Из них я могу достичь первых двух, но когда я посещаю http://localhost/ecwid_fu_scripts/ через мой веб-браузер запрос перехватывается сервером Java, работающим на порту 9001, и не перенаправляется на index.php в /home/ankush/ecwid_fu_scripts/. Вот моя конфигурация Nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/ecwid_fu_scripts/;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Ваша проблема связана с root директива, и объем этого root.

location /ecwid_fu_scripts/ {
    root /home/ankush/ecwid_fu_scripts/;

В этом случае, когда кто-то запрашивает example.com/ecwid_fu_scripts/, nginx ищет файлы в заданном root, плюс расположение. Это становится / home / ankush / ecwid_fu_scripts / ecwid_fu_scripts /, а не там, где находится ваш index.php.

Чтобы решить эту проблему, у вас есть два варианта (предпочтительным вариантом является №2, если у вас есть свобода в своем проекте):

  1. Изменить root этого блока местоположения в / home / ankush / вместо этого.
  2. Или реструктурируйте структуру вашего проекта, чтобы все было в одной относительной папке проекта. Теперь установите глобальный root - директива вне любого блока местоположения - к новому имени папки проекта (скажем, root /home/ankush/ecwid_files/;, после server_name директива).

Теперь нам все еще нужно добавить содержимое location ~ \.php$ блок внутри location /ecwid_fu_scripts/ блок, потому что когда root изменяется, вещи, относящиеся к этому новому корню, должны использоваться в том же блоке. Это из-за эта ловушка: блок местоположения для ecwid_fu_scripts говорит, что это файл .php, он делает try_files, а затем он завершается этим блоком и отправляется в следующий связанный блок: глобальный location ~ \.php$. Проблема в том, что он не знает, что root больше не существует, поскольку он не определен глобально. Таким образом, fastcgi_pass в этом блоке не получает полный путь.

Итак, в итоге ваша конфигурация будет выглядеть так с вариантом №1:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/;

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}