One unix socket for all php-fpm pools
I want to set only one listening unix socket for all php-fpm pools, but fpm requires them to be different.
Production server has 2GB ram and I noticed that it is running out of RAM, adding more websites spawn more fpm processes. I am the only user on this server, so i don't need to limit resources per pool just want to set common config settings for all.
One domain pool as follows:
[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
Another pool is the same, except domain name. So then if I set same listening socket for both pools it doesn't work
# 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
And if set different sockets, it works, but each pool spawn minimum 3 process. (Sure, this is not an output from real server, just simulated same behavior).
# 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)
My intention is to keep running 3 php-fpm processes for all pools.
You can have each nginx server block point at same socket and in the /etc/nginx/fastcgi_params there are the lines:
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
These will cause the document root from your nginx server block to be passed through to php-fpm.
server {
root /var/www/<%= @title %>/public;
...
}
You should then omit the line
php_admin_value[open_basedir] = /usr/local/www/domain.com
from your php-fpm pool config file.
I believe nginx can do a similar thing to change the log, session and uploads directory, or you can change the error, session and upload handler in php to log to a relative path based on your document root.