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

Как использовать разные пулы PHP-FPM на основе каталога с разными корнями в Nginx

Я пытаюсь перенести некоторые веб-сайты со старого сервера под управлением Apache и mod_php на новый сервер с Nginx и PHP 7 с использованием PHP-FPM. Оба сайта содержат корзину покупок PHP в корне домена и блог WordPress, работающий в подпапке / news. В настоящее время на старых серверах блог Word Press находится в папке под названием news в корневом веб-каталоге (таким образом, смешанной с файлами тележек для покупок) на новом сервере. Я бы хотел разделить их, чтобы каждое приложение находилось в своем собственная отдельная папка, такая что:

Файлы в / home / www / sitename / cart / htdocs доступны по адресу https: //www.site.tld/

и

Файлы в / home / www / sitename / wordpress / htdocs доступны по адресу https: //www.site.tld/news/

Я также хотел бы иметь возможность использовать разные пулы PHP-FPM для обеспечения безопасности и, при необходимости, позволить мне запускать любое из приложений с пулом PHP 5, пока оно не будет обновлено для работы на PHP 7.

Я уже близко, но он продолжает пытаться загрузить /news/test.php из /home/www/sitename/wordpress/htdocs//news/test.php вместо / home / www / manicpanic / wordpress / htdocs / test. php.

Конфиг:

server {
    listen iphere:443 ssl http2;

    #ssl conf

    root /home/www/sitename/cart/htdocs;    
    server_name site.tld www.site.tld;

    rewrite ^(.*)\.v[\d]+\.(css|js|png)$ $1.$2;

    location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";
    }

    location / {
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /news {
        alias /home/www/sitename/wordpress/htdocs;
        location ~ \.php$ {
                fastcgi_pass unix:/run/php/php7.0-fpm-wordpress.sock;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param APPLICATION_ENV production;
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param PHP_VALUE default_charset=ISO-8859-1;
            }

    }

    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/run/php/php7.0-fpm-cart.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param APPLICATION_ENV production;
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param PHP_VALUE default_charset=ISO-8859-1;
    }

}

Регулярное выражение location ~ [^/]\.php(/|$) будет иметь приоритет перед префиксом location /news, если только вы используете ^~ модификатор. Видеть этот документ для большего.

location ^~ /news {
    alias /home/www/sitename/wordpress/htdocs;
    location ~ \.php$ {
        ...
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        ...
    }
}

Кроме того, вы не можете использовать $document_root$fastcgi_script_name в сочетании с alias поскольку он создает неправильный путь. Использовать $request_filename вместо.

Всегда include fastcgi_params; перед используя конкретные fastcgi_param директивы, иначе определенные настройки могут быть автоматически перезаписаны.

Есть очень хороший учебник (хотя вы, вероятно, можете пропустить настройку разных портов): https://pehapkari.cz/blog/2017/03/27/multiple-php-versions-the-easy-way/

PHP70

server {
    listen 8870 default_server;
    listen [::]:8870 default_server;
    server_name _;
    root /var/www/site-with-php7.0;
    index index.php;
    location / {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock; # adjust for the listen setting discussed above
    }
}

PHP56

server {
    listen 8856 default_server;
    listen [::]:8856 default_server;
    server_name _;
    root /var/www/site-with-php5.6;
    index index.php;
    location / {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php5.6-fpm.sock; # adjust for the listen setting discussed above
    }
}