一个 nginx 站点中的多个 fpm 套接字按位置

Multiple fpm socket in one nginx site by locations

想象一下 nginx 中的默认站点

server {
    listen 80;
    server_name example.com;
}

server {
    listen 80 default_server;
    client_max_body_size 0;
    server_name _;

    index index.php index.html index.htm;
    set $root_path '/www/public';
    root $root_path;

    try_files $uri @rewrite;

    rewrite ^/(?!api/)(.*)/$ / permanent;

    location @rewrite {
        rewrite ^/(.*)$ /index.php?_url=/;
    }

    location ~ \.php$ {
        fastcgi_index /index.php;

        ##### I THINK LOCATION CONFIG MUST COMES HERE #####
        fastcgi_pass unix:/var/run/php/xxxx.sock;
        ###################################################

        include fastcgi_params;
        fastcgi_split_path_info           ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO           $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED     $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        access_log syslog:server=loghost,facility=local7,tag=nginx,severity=info syslogformat if=$dolog;
    }
}

我们需要在重写(到index.php)后分离url并将它们传递给不同的fpm套接字
例如我想使用
fastcgi_pass unix:/var/run/php/1111.sock; 对于像 ^/action-1/
这样的网址 和
fastcgi_pass unix:/var/run/php/2222.sock; 其他

我该怎么做?感谢任何帮助

设置一个默认套接字,并为其他套接字匹配单独的路径。

server {

    ...
    set $php_socket "1";

    if ($uri ~* "^/action-1/") {
        set $php_socket "2";
    }
    ...

    location ~ \.php$ {        
        ...
        if ($php_socket = '1') { fastcgi_pass unix:/var/run/php/1.sock; }
        if ($php_socket = '2') { fastcgi_pass unix:/var/run/php/2.sock; }
        ...
    }
}