我想为所有 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 中的错误、会话和上传处理程序以根据文档根目录记录到相对路径。