我运行一个具有中等流量水平的Magento网上商店,使用PHP-FPM在NGINX上运行。服务器环境非常强大且开销很大,因此硬件不是一个因素。
在后端运行内存密集型操作时,我们遇到超时和错误,例如导出和一些自定义索引。
忽略编写更高效的代码并增加整个站点的池大小,我们希望探索为后端分配更多资源的方法,而不必减少整个站点可能的并发连接大小。
有人建议我们将网站的管理员拆分为一个单独的服务器/ IP,具有不同的配置。这将解决我们的问题,但也非常昂贵,似乎是解决非关键问题的一个重大飞跃。
是否可以将不同的PHP FPM配置与www.example.com/admin相关联,从而为不同URL的用户提供不同的功能?
答案 0 :(得分:4)
是的,这是可能的。
在此示例中,我们指定默认池,池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; }
}
}
答案 1 :(得分:1)
在演示多池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;
# ...
}
}
Magento 2附带的Nginx配置nginx.conf.sample可以在替换所有出现的FastCGI pass指令之后使用:
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;
}
}
答案 2 :(得分:1)
您确定php是您的限制因素吗? 以我的经验,它主要是数据库,它带有锁定等待超时。 在这种情况下,添加更多的php进程对您没有帮助。