所有 php-fpm 池使用一个 unix 套接字

所有 php-fpm 池使用一个 unix 套接字

我想为所有 php-fpm 池只设置一个监听 unix 套接字,但 fpm 要求它们不同。

生产服务器有 2GB 内存,我注意到它内存不足,添加更多网站会产生更多 fpm 进程。我是此服务器上的唯一用户,因此我不需要限制每个池的资源,只想为所有池设置通用配置设置。

一个域池如下:

  [domain.com]
    user = www
    group = www
    listen = /tmp/domain.com-php-fpm.sock
    security.limit_extensions = .php .html

   ;Resources
   pm = dynamic
   pm.max_children = 9
   pm.start_servers = 3
   pm.min_spare_servers = 2
   pm.max_spare_servers = 4
   pm.process_idle_timeout = 60s
   request_terminate_timeout = 30s
   pm.max_requests = 300

   ;Log errors
   catch_workers_output = yes
   php_flag[display_errors]   = on
   php_admin_value[error_log] = /var/log/www/domain.com/php-error.log

   ;Base dirs
   php_admin_value[open_basedir] = /usr/local/www/domain.com
   php_admin_value[upload_tmp_dir] = /usr/local/www/domain.com/tmp 
   php_admin_value[session.save_path] = /usr/local/www/domain.com/tmp

另一个池也是一样,只是域名不同。因此,如果我为两个池设置相同的监听套接字,则不起作用

# php-fpm --test
[12-Sep-2013 22:27:01] ERROR: [pool domain.com] unable to set listen address as it's already used in another pool 'domain2.com'
[12-Sep-2013 22:27:01] ERROR: failed to post process the configuration
[12-Sep-2013 22:27:01] ERROR: FPM initialization failed

如果设置不同的套接字,它可以工作,但每个池至少会产生 3 个进程。(当然,这不是来自真实服务器的输出,只是模拟了相同的行为)。

# ps aux | grep php-fpm
root   1349   0.0  0.9 161376 18320 ??  Ss   10:34PM   0:00.02 php-fpm: master process (/usr/local/etc/php-fpm.conf) (php-fpm)
www    1350   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain2.com (php-fpm)
www    1351   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain2.com (php-fpm)
www    1352   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain2.com (php-fpm)
www    1353   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain.com (php-fpm)
www    1354   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain.com (php-fpm)
www    1355   0.0  0.9 161336 18292 ??  S    10:34PM   0:00.00 php-fpm: pool domain.com (php-fpm)

我的目的是让所有池继续运行 3 个 php-fpm 进程。

答案1

您可以让每个 nginx 服务器块指向同一个套接字,并且在 /etc/nginx/fastcgi_params 中有以下行:

fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT       $document_root;

这些将导致来自 nginx 服务器块的文档根目录传递到 php-fpm。

server {
    root /var/www/<%= @title %>/public;
    ...
}

php_admin_value[open_basedir] = /usr/local/www/domain.com然后您应该从 php-fpm 池配置文件中省略该行 。

我相信 nginx 可以做类似的事情来改变日志、会话和上传目录,或者您可以更改 php 中的错误、会话和上传处理程序以根据文档根目录记录到相对路径。

相关内容