如何在 Nginx 中根据不同根目录使用不同的 PHP-FPM 池

如何在 Nginx 中根据不同根目录使用不同的 PHP-FPM 池

我正在尝试将一些网站从运行 Apache 和 mod_php 的旧服务器迁移到使用 PHP-FPM 的 Nginx 和 PHP 7 的新服务器。两个站点都在域的根目录中运行 PHP 购物车,并在子文件夹 /news 中运行 wordpress 博客。目前,在旧服务器上,word press 博客位于 Web 根目录中名为 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 上运行。

我已经接近了,但它一直尝试从 /home/www/sitename/wordpress/htdocs//news/test.php 而不是 /home/www/manicpanic/wordpress/htdocs/test.php 加载 /news/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;
    }

}

答案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指令,否则特定设置可能会被悄悄覆盖。

答案2

有一个非常好的教程(尽管你可能可以跳过设置不同的端口): https://pehapkari.cz/blog/2017/03/27/multiple-php-versions-the-easy-way/

70菲律宾比索

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
    }
}

相关内容