【问题标题】:Magento separate PHP-FPM group for adminMagento 为管理员分离 PHP-FPM 组
【发布时间】:2020-10-09 04:06:52
【问题描述】:

我运行一个中等流量的 Magento 网上商店,在 NGINX 上运行 PHP-FPM。服务器环境非常强大,开销很大,因此硬件不是一个因素。

在后端运行内存密集型操作(例如导出和一些自定义索引)时,我们会遇到超时和错误。

忽略编写更高效的代码和增加整个站点的池大小,我们希望探索将更多资源分配给后端的方法,而不必减少整个站点可能的并发连接大小。

有人建议我们将站点的管理员拆分为具有不同配置的单独服务器/IP。这将解决我们的问题,但也非常昂贵,而且似乎是解决非关键问题的一大飞跃。

是否可以将不同的 PHP FPM 配置关联到类似 www.example.com/admin 的内容,从而为来自不同 URL 的用户提供不同的功能?

【问题讨论】:

    标签: magento nginx php


    【解决方案1】:

    是的,这是可能的。

    在这个例子中,我们指定一个默认池,池 1。如果 URL 是 /admin,我们将使用池 2。

    http {
        # The usual..
    
        # PHP FPM/FastCGI server
        upstream    php5p1 { server unix:/var/run/php5-fpm-pool-1.sock; }
        upstream    php5p2 { server unix:/var/run/php5-fpm-pool-2.sock; }
    }
    
    server {
    
        # Default is to use pool 1
        set $custom_php_pool    "1";
    
        # If is /admin, we use pool 2
        if ($uri ~* "^/admin/") {
            set $custom_php_pool        "2";
        }
    
        # ...
    
    
        location ~ \.php$ {
    
            # ...
    
            # Pass to PHP FPM/FastCGI server
            if ($custom_php_pool = '1') { fastcgi_pass php5p1; }
            if ($custom_php_pool = '2') { fastcgi_pass php5p2; }
        }
    }
    

    【讨论】:

    • 谢谢。此功能的文档很少,因为没有明确说明是否可以通过 url 而不是 IP 拆分池。
    • 我还应该提到,关于这方面的文章在 Magento 社区中会非常受欢迎。我已经阅读了许多文章,建议增加大型 magento 存储 Magento 的内存限制,但没有建议仅针对后端这样做。上面的解决方案似乎应该是所有大小合适的 NGINX PHPFPM Magento 安装的标准。
    【解决方案2】:

    在演示多池 PHP-FPM 设置时,接受的答案在概念上是正确的。但是,提供的 Nginx 配置依赖于 IF 指令considered slow and unsafe

    依赖于 URL 的多个 PHP-FPM 池的最佳 Nginx 配置:

    http {
        upstream fastcgi_www {
            server unix:/var/run/php-fpm.sock;
        }
    
        upstream fastcgi_admin {
            server unix:/var/run/php-fpm-admin.sock;
        }
    
        map $request_uri $fastcgi_backend {
            default                 fastcgi_www;
            ~^(/index\.php)?/admin  fastcgi_admin;
        }
    
        server {
            # ...
            fastcgi_pass   $fastcgi_backend;
            # ...
        }
    }
    

    在替换所有出现的 FastCGI pass 指令后,可以使用 Magento 2 附带的 Nginx 配置 nginx.conf.sample

    fastcgi_pass   fastcgi_backend;
    

    使用依赖于请求 URL 的变量:

    fastcgi_pass   $fastcgi_backend;
    

    修改nginx.conf.sample另存为/var/www/magento2/nginx.conf可以重复使用:

    http {
        # ...
        server {
            # ...
            include /var/www/magento2/nginx.conf;
        }
    }
    

    【讨论】:

    • 谢谢。您将如何设置 PHP-FPM 配置?我尝试了这个设置,似乎 .sock 文件也需要在 PHP-FPM(www.conf) 中配置?除非我弄错了。 :)
    • @iamlolz 正确,PHP-FPM 设置与 Nginx 是分开的,需要为前端和管理员配置不同的进程池。通常,您可以使用 TCP 连接(默认为 9000 端口)代替套接字,但套接字的性能和安全性更高。这是一个配置参考。 gist.github.com/fyrebase/62262b1ff33a6aaf5a54
    【解决方案3】:

    你确定 php 是你的限制因素吗? 以我的经验,它主要是数据库,它出现了锁定等待超时。 在这种情况下,添加更多 php 进程对您没有帮助。

    【讨论】:

    • 请注意 - 您应该对帖子进行后续澄清(作为评论),答案通常应该是具体的。除此之外,无论如何我都赞成你的回应:)
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2013-12-15
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多