From 0271ccfc283167b7a85e7a0db538522a9caf7b01 Mon Sep 17 00:00:00 2001 From: "Michael Kaufmann (d00p)" Date: Fri, 3 Dec 2010 09:23:40 +0000 Subject: [PATCH] - outsource fcgid/php-fpm configurations/file-creations/etc --- .../phpinterface/class.phpinterface.php | 121 +++++++ .../phpinterface/class.phpinterface_fcgid.php | 291 ++++++++++++++++ .../phpinterface/class.phpinterface_fpm.php | 149 ++++++++ .../cron_tasks.inc.http.15.apache_fcgid.php | 325 ++---------------- .../cron_tasks.inc.http.25.lighttpd_fcgid.php | 313 ++--------------- .../cron_tasks.inc.http.35.nginx_phpfpm.php | 127 +------ 6 files changed, 624 insertions(+), 702 deletions(-) create mode 100644 lib/classes/phpinterface/class.phpinterface.php create mode 100644 lib/classes/phpinterface/class.phpinterface_fcgid.php create mode 100644 lib/classes/phpinterface/class.phpinterface_fpm.php diff --git a/lib/classes/phpinterface/class.phpinterface.php b/lib/classes/phpinterface/class.phpinterface.php new file mode 100644 index 00000000..d41573b6 --- /dev/null +++ b/lib/classes/phpinterface/class.phpinterface.php @@ -0,0 +1,121 @@ + + * @author Froxlor team (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Cron + * @version $Id$ + * @link http://www.nutime.de/ + * @since 0.9.16 + * + */ + +class phpinterface +{ + /** + * Database handler + * @var object + */ + private $_db = false; + + /** + * Settings array + * @var array + */ + private $_settings = array(); + + /** + * Domain-Data array + * @var array + */ + private $_domain = array(); + + /** + * Interface object + * @var object + */ + private $_interface = null; + + /** + * Admin-User data array + * @var array + */ + private $_admin_cache = array(); + + /** + * main constructor + */ + public function __construct($db, $settings, $domain) + { + $this->_db = $db; + $this->_settings = $settings; + $this->_domain = $domain; + $this->_setInterface(); + } + + /** + * returns the interface-object + * from where we can control it + */ + public function getInterface() + { + return $this->_interface; + } + + /** + * set interface-object by type of + * php-interface: fcgid or php-fpm + * sets private $_interface variable + */ + private function _setInterface() + { + // php-fpm + if((int)$this->_settings['phpfpm']['enabled'] == 1) + { + $this->_interface = new phpinterface_fpm($this->_db, $this->_settings, $this->_domain); + } + elseif((int)$this->_settings['system']['mod_fcgid'] == 1) + { + $this->_interface = new phpinterface_fcgid($this->_db, $this->_settings, $this->_domain); + } + } + + /** + * return the php-configuration from the database + * + * @param int $php_config_id id of the php-configuration + * + * @return array + */ + public function getPhpConfig($php_config_id) + { + $php_config_id = intval($php_config_id); + + // If domain has no config, we will use the default one. + + if($php_config_id == 0) + { + $php_config_id = 1; + } + + if(!isset($this->php_configs_cache[$php_config_id])) + { + $this->_php_configs_cache[$php_config_id] = $this->_db->query_first( + "SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` + WHERE `id` = " . (int)$php_config_id + ); + } + + return $this->_php_configs_cache[$php_config_id]; + } + +} diff --git a/lib/classes/phpinterface/class.phpinterface_fcgid.php b/lib/classes/phpinterface/class.phpinterface_fcgid.php new file mode 100644 index 00000000..98094623 --- /dev/null +++ b/lib/classes/phpinterface/class.phpinterface_fcgid.php @@ -0,0 +1,291 @@ + + * @author Froxlor team (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Cron + * @version $Id$ + * @link http://www.nutime.de/ + * @since 0.9.16 + * + */ + +class phpinterface_fcgid +{ + /** + * Database handler + * @var object + */ + private $_db = false; + + /** + * Settings array + * @var array + */ + private $_settings = array(); + + /** + * Domain-Data array + * @var array + */ + private $_domain = array(); + + /** + * Admin-Date cache array + * @var array + */ + private $_admin_cache = array(); + + /** + * main constructor + */ + public function __construct($db, $settings, $domain) + { + $this->_db = $db; + $this->_settings = $settings; + $this->_domain = $domain; + } + + public function createConfig($phpconfig) + { + // create starter + $starter_file = "#!/bin/sh\n\n"; + $starter_file.= "#\n"; + $starter_file.= "# starter created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $this->_domain['domain'] . "' with id #" . $this->_domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; + $starter_file.= "# Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; + $starter_file.= "#\n\n"; + $starter_file.= "umask 022\n"; + $starter_file.= "PHPRC=" . escapeshellarg($this->getConfigDir()) . "\n"; + $starter_file.= "export PHPRC\n"; + + // set number of processes for one domain + if((int)$this->_domain['mod_fcgid_starter'] != - 1) + { + $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$$this->_domain['mod_fcgid_starter'] . "\n"; + } + else + { + if((int)$phpconfig['mod_fcgid_starter'] != - 1) + { + $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$phpconfig['mod_fcgid_starter'] . "\n"; + } + else + { + $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$this->_settings['system']['mod_fcgid_starter'] . "\n"; + } + } + + $starter_file.= "export PHP_FCGI_CHILDREN\n"; + + // set number of maximum requests for one domain + if((int)$this->_domain['mod_fcgid_maxrequests'] != - 1) + { + $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$this->_domain['mod_fcgid_maxrequests'] . "\n"; + } + else + { + if((int)$phpconfig['mod_fcgid_maxrequests'] != - 1) + { + $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$phpconfig['mod_fcgid_maxrequests'] . "\n"; + } + else + { + $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$this->_settings['system']['mod_fcgid_maxrequests'] . "\n"; + } + } + + $starter_file.= "export PHP_FCGI_MAX_REQUESTS\n"; + + // Set Binary + $starter_file.= "exec " . $phpconfig['binary'] . " -c " . escapeshellarg($this->getConfigDir()) . "\n"; + + //remove +i attibute, so starter can be overwritten + if(file_exists($this->getStarterFile())) + { + removeImmutable($this->getStarterFile()); + } + + $starter_file_handler = fopen($this->getStarterFile(), 'w'); + fwrite($starter_file_handler, $starter_file); + fclose($starter_file_handler); + safe_exec('chmod 750 ' . escapeshellarg($this->getStarterFile())); + safe_exec('chown ' . $this->_domain['guid'] . ':' . $this->_domain['guid'] . ' ' . escapeshellarg($this->getStarterFile())); + setImmutable($this->getStarterFile()); + } + + public function createIniFile($phpconfig) + { + $openbasedir = ''; + $openbasedirc = ';'; + + if($this->_domain['openbasedir'] == '1') + { + $openbasedirc = ''; + $_phpappendopenbasedir = ''; + + $_custom_openbasedir = explode(':', $this->_settings['system']['mod_fcgid_peardir']); + foreach($_custom_openbasedir as $cobd) + { + $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); + } + + $_custom_openbasedir = explode(':', $this->_settings['system']['phpappendopenbasedir']); + foreach($_custom_openbasedir as $cobd) + { + $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); + } + + if($this->_domain['openbasedir_path'] == '0' && strstr($this->_domain['documentroot'], ":") === false) + { + $openbasedir = appendOpenBasedirPath($this->_domain['documentroot'], true); + } + else + { + $openbasedir = appendOpenBasedirPath($this->_domain['customerroot'], true); + } + + $openbasedir .= appendOpenBasedirPath($this->getTempDir()); + $openbasedir .= $_phpappendopenbasedir; + + $openbasedir = explode(':', $openbasedir); + $clean_openbasedir = array(); + foreach($openbasedir as $number => $path) + { + if(trim($path) != '/') + { + $clean_openbasedir[] = makeCorrectDir($path); + } + } + $openbasedir = implode(':', $clean_openbasedir); + } + else + { + $openbasedir = 'none'; + $openbasedirc = ';'; + } + + $admin = $this->_getAdminData($this->_domain['adminid']); + $php_ini_variables = array( + 'SAFE_MODE' => ($this->_domain['safemode'] == '0' ? 'Off' : 'On'), + 'PEAR_DIR' => $this->_settings['system']['mod_fcgid_peardir'], + 'OPEN_BASEDIR' => $openbasedir, + 'OPEN_BASEDIR_C' => $openbasedirc, + 'OPEN_BASEDIR_GLOBAL' => $this->_settings['system']['phpappendopenbasedir'], + 'TMP_DIR' => $this->getTempDir(), + 'CUSTOMER_EMAIL' => $this->_domain['email'], + 'ADMIN_EMAIL' => $admin['email'], + 'DOMAIN' => $this->_domain['domain'], + 'CUSTOMER' => $this->_domain['loginname'], + 'ADMIN' => $admin['loginname'] + ); + + //insert a small header for the file + + $phpini_file = ";\n"; + $phpini_file.= "; php.ini created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $this->_domain['domain'] . "' with id #" . $this->_domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; + $phpini_file.= "; Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; + $phpini_file.= ";\n\n"; + $phpini_file.= replace_variables($phpconfig['phpsettings'], $php_ini_variables); + $phpini_file = str_replace('"none"', 'none', $phpini_file); + $phpini_file = preg_replace('/\"+/', '"', $phpini_file); + $phpini_file_handler = fopen($this->getIniFile(), 'w'); + fwrite($phpini_file_handler, $phpini_file); + fclose($phpini_file_handler); + safe_exec('chown root:0 ' . escapeshellarg($this->getIniFile())); + safe_exec('chmod 0644 ' . escapeshellarg($this->getIniFile())); + } + + /** + * fcgid-config directory + * + * @param boolean $createifnotexists create the directory if it does not exist + * + * @return string the directory + */ + public function getConfigDir($createifnotexists = true) + { + $configdir = makeCorrectDir($this->_settings['system']['mod_fcgid_configdir'] . '/' . $this->_domain['loginname'] . '/' . $this->_domain['domain'] . '/'); + + if(!is_dir($configdir)) + { + safe_exec('mkdir -p ' . escapeshellarg($configdir)); + safe_exec('chown ' . $this->_domain['guid'] . ':' . $this->_domain['guid'] . ' ' . escapeshellarg($configdir)); + } + + return $configdir; + } + + /** + * fcgid-temp directory + * + * @param boolean $createifnotexists create the directory if it does not exist + * + * @return string the directory + */ + public function getTempDir($createifnotexists = true) + { + $tmpdir = makeCorrectDir($this->_settings['system']['mod_fcgid_tmpdir'] . '/' . $this->_domain['loginname'] . '/'); + + if(!is_dir($tmpdir)) + { + safe_exec('mkdir -p ' . escapeshellarg($tmpdir)); + safe_exec('chown -R ' . $this->_domain['guid'] . ':' . $this->_domain['guid'] . ' ' . escapeshellarg($tmpdir)); + safe_exec('chmod 0750 ' . escapeshellarg($tmpdir)); + } + + return $tmpdir; + } + + /** + * return path of php-starter file + * + * @return string the directory + */ + public function getStarterFile() + { + $starter_filename = makeCorrectFile($this->getConfigDir() . '/php-fcgi-starter'); + return $starter_filename; + } + + /** + * return path of php.ini file + * + * @return string full with path file-name + */ + public function getIniFile() + { + $phpini_filename = makeCorrectFile($this->getConfigDir() . '/php.ini'); + return $phpini_filename; + } + + /** + * return the admin-data of a specific admin + * + * @param int $adminid id of the admin-user + * + * @return array + */ + private function _getAdminData($adminid) + { + $adminid = intval($adminid); + + if(!isset($this->_admin_cache[$adminid])) + { + $this->_admin_cache[$adminid] = $this->_db->query_first( + "SELECT `email`, `loginname` FROM `" . TABLE_PANEL_ADMINS . "` + WHERE `adminid` = " . (int)$adminid + ); + } + + return $this->_admin_cache[$adminid]; + } +} diff --git a/lib/classes/phpinterface/class.phpinterface_fpm.php b/lib/classes/phpinterface/class.phpinterface_fpm.php new file mode 100644 index 00000000..659c9f14 --- /dev/null +++ b/lib/classes/phpinterface/class.phpinterface_fpm.php @@ -0,0 +1,149 @@ + + * @author Froxlor team (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Cron + * @version $Id$ + * @link http://www.nutime.de/ + * @since 0.9.16 + * + */ + +class phpinterface_fpm +{ + /** + * Database handler + * @var object + */ + private $_db = false; + + /** + * Settings array + * @var array + */ + private $_settings = array(); + + /** + * Domain-Data array + * @var array + */ + private $_domain = array(); + + /** + * main constructor + */ + public function __construct($db, $settings, $domain) + { + $this->_db = $db; + $this->_settings = $settings; + $this->_domain = $domain; + } + + public function createConfig($phpconfig) + { + $fh = @fopen($this->getConfigFile(), 'w'); + if($fh) + { + $fpm_pm = $this->_settings['phpfpm']['pm']; + $fpm_children = (int)$this->_settings['phpfpm']['max_children']; + $fpm_start_servers = (int)$this->_settings['phpfpm']['start_servers']; + $fpm_min_spare_servers = (int)$this->_settings['phpfpm']['min_spare_servers']; + $fpm_max_spare_servers = (int)$this->_settings['phpfpm']['max_spare_servers']; + $fpm_requests = (int)$this->_settings['phpfpm']['max_requests']; + + if($fpm_children == 0) { + $fpm_children = 1; + } + + $fpm_config = ';PHP-FPM configuration for "'.$this->_domain['domain'].'" created on ' . date("Y.m.d H:i:s") . "\n\n"; + $fpm_config.= '['.$this->_domain['domain'].']'."\n"; + $fpm_config.= 'listen = '.$this->getSocketFile()."\n"; + $fpm_config.= 'listen.owner = '.$this->_domain['loginname']."\n"; + $fpm_config.= 'listen.group = '.$this->_domain['loginname']."\n"; + $fpm_config.= 'listen.mode = 0666'."\n\n"; + + $fpm_config.= 'user = '.$this->_domain['loginname']."\n"; + $fpm_config.= 'group = '.$this->_domain['loginname']."\n\n"; + + $fpm_config.= 'pm = '.$fpm_pm."\n"; + $fpm_config.= 'pm.max_children = '.$fpm_children."\n"; + if($fpm_pm == 'dynamic') { + $fpm_config.= 'pm.start_servers = '.$fpm_start_servers."\n"; + $fpm_config.= 'pm.min_spare_servers = '.$fpm_min_spare_servers."\n"; + $fpm_config.= 'pm.max_spare_servers = '.$fpm_max_spare_servers."\n"; + } + $fpm_config.= 'pm.max_requests = '.$fpm_requests."\n\n"; + + $fpm_config.= ';chroot = '.makeCorrectDir($this->_domain['documentroot'])."\n\n"; + + $tmpdir = makeCorrectDir($this->_settings['phpfpm']['tmpdir'] . '/' . $this->_domain['loginname'] . '/'); + //$slowlog = makeCorrectFile($this->_settings['system']['logfiles_directory'] . $this->_domain['loginname'] . '/php-fpm_slow.log'); + + $fpm_config.= 'env[TMP] = '.$tmpdir."\n"; + $fpm_config.= 'env[TMPDIR] = '.$tmpdir."\n"; + $fpm_config.= 'env[TEMP] = '.$tmpdir."\n\n"; + + $fpm_config.= 'php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f '.$this->_domain['email']."\n\n"; + $fpm_config.= 'php_admin_value[open_basedir] = ' . $this->_settings['system']['documentroot_prefix'] . $this->_domain['loginname'] . '/:' . $this->_settings['phpfpm']['tmpdir'] . '/' . $this->_domain['loginname'] . '/:' . $this->_settings['phpfpm']['peardir'] . "\n"; + $fpm_config.= 'php_admin_value[session.save_path] = ' . $this->_settings['phpfpm']['tmpdir'] . '/' . $this->_domain['loginname'] . '/' . "\n"; + $fpm_config.= 'php_admin_value[upload_tmp_dir] = ' . $this->_settings['phpfpm']['tmpdir'] . '/' . $this->_domain['loginname'] . '/' . "\n\n"; + + fwrite($fh, $fpm_config, strlen($fpm_config)); + fclose($fh); + } + } + + public function createIniFile($phpconfig) + { + return; + } + + /** + * fpm-config file + * + * @param boolean $createifnotexists create the directory if it does not exist + * + * @return string the full path to the file + */ + public function getConfigFile($createifnotexists = true) + { + $configdir = makeCorrectDir($this->_settings['phpfpm']['configdir']); + $config = makeCorrectFile($configdir.'/'.$this->_domain['domain'].'.conf'); + + if(!is_dir($configdir)) + { + safe_exec('mkdir -p ' . escapeshellarg($configdir)); + } + + return $config; + } + + /** + * return path of fpm-socket file + * + * @return string the full path to the socket + */ + public function getSocketFile() + { + $socketdir = makeCorrectDir('/var/run/'.$this->_settings['system']['webserver'].'/'); + $socket = makeCorrectFile($socketdir.'/'.$this->_domain['loginname'].'-'.$this->_domain['domain'].'-php-fpm.socket'); + + if(!is_dir($socketdir)) + { + safe_exec('mkdir -p '.$socketdir); + safe_exec('chown -R '.$this->_settings['system']['httpuser'].':'.$this->_settings['system']['httpgroup'].' '.$socketdir); + } + + return $socket; + } +} diff --git a/scripts/jobs/cron_tasks.inc.http.15.apache_fcgid.php b/scripts/jobs/cron_tasks.inc.http.15.apache_fcgid.php index cd692e7b..239cdd02 100644 --- a/scripts/jobs/cron_tasks.inc.http.15.apache_fcgid.php +++ b/scripts/jobs/cron_tasks.inc.http.15.apache_fcgid.php @@ -26,58 +26,34 @@ if(@php_sapi_name() != 'cli' class apache_fcgid extends apache { - private $php_configs_cache = array(); - private $admin_cache = array(); - - /* - * We put together the needed php options in the virtualhost entries - */ - protected function composePhpOptions($domain) { $php_options_text = ''; if($domain['phpenabled'] == '1') { + $php = new phpinterface($this->getDB(), $this->settings, $domain); + $phpconfig = $php->getPhpConfig((int)$domain['phpsettingid']); + if((int)$this->settings['phpfpm']['enabled'] == 1) { - $php_options_text = $this->_createFpmPart($domain); + $php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n"; + $php_options_text.= ' FastCgiExternalServer ' . makeCorrectDir($domain['documentroot']) . 'fpm.external -socket ' . $php->getInterface()->getSocketFile() . ' -user ' . $domain['loginname'] . ' -group ' . $domain['loginname'] . "\n"; + $php_options_text.= ' ' . "\n"; + $php_options_text.= ' AddHandler php5-fastcgi .php'. "\n"; + $php_options_text.= ' Action php5-fastcgi /fastcgiphp' . "\n"; + $php_options_text.= ' Options +ExecCGI' . "\n"; + $php_options_text.= ' Order allow,deny' . "\n"; + $php_options_text.= ' allow from all' . "\n"; + $php_options_text.= ' ' . "\n"; + $php_options_text.= ' Alias /fastcgiphp ' . makeCorrectDir($domain['documentroot']) . 'fpm.external' . "\n"; } else { - // This vHost has PHP enabled and we are using mod_fcgid - //create basic variables for config - - $configdir = makeCorrectDir($this->settings['system']['mod_fcgid_configdir'] . '/' . $domain['loginname'] . '/' . $domain['domain'] . '/'); - $starter_filename = makeCorrectFile($configdir . '/php-fcgi-starter'); - $phpini_filename = makeCorrectFile($configdir . '/php.ini'); - $tmpdir = makeCorrectDir($this->settings['system']['mod_fcgid_tmpdir'] . '/' . $domain['loginname'] . '/'); - - // create config dir if necessary - - if(!is_dir($configdir)) - { - safe_exec('mkdir -p ' . escapeshellarg($configdir)); - safe_exec('chown ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($configdir)); - } - - // create tmp dir if necessary - - if(!is_dir($tmpdir)) - { - safe_exec('mkdir -p ' . escapeshellarg($tmpdir)); - safe_exec('chown -R ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($tmpdir)); - safe_exec('chmod 0750 ' . escapeshellarg($tmpdir)); - } - - // Load php config - - $phpconfig = $this->getPhpConfig((int)$domain['phpsettingid']); - if((int)$this->settings['system']['mod_fcgid_wrapper'] == 0) { $php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n"; - $php_options_text.= ' ScriptAlias /php/ ' . $configdir . "\n"; + $php_options_text.= ' ScriptAlias /php/ ' . $php->getInterface()->getConfigDir() . "\n"; } else { @@ -87,165 +63,21 @@ class apache_fcgid extends apache $php_options_text.= ' AddHandler fcgid-script .' . implode(' .', $file_extensions) . "\n"; foreach($file_extensions as $file_extension) { - $php_options_text.= ' FCGIWrapper ' . $starter_filename . ' .' . $file_extension . "\n"; + $php_options_text.= ' FCGIWrapper ' . $php->getInterface()->getStarterFile() . ' .' . $file_extension . "\n"; } - $php_options_text.= ' Options +ExecCGI' . "\n"; $php_options_text.= ' Order allow,deny' . "\n"; $php_options_text.= ' allow from all' . "\n"; $php_options_text.= ' ' . "\n"; } - - // create starter - - $starter_file = "#!/bin/sh\n\n"; - $starter_file.= "#\n"; - $starter_file.= "# starter created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $domain['domain'] . "' with id #" . $domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; - $starter_file.= "# Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; - $starter_file.= "#\n\n"; - $starter_file.= "umask 022\n"; - $starter_file.= "PHPRC=" . escapeshellarg($configdir) . "\n"; - $starter_file.= "export PHPRC\n"; - - // set number of processes for one domain - - if((int)$domain['mod_fcgid_starter'] != - 1) - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$domain['mod_fcgid_starter'] . "\n"; - } - else - { - if((int)$phpconfig['mod_fcgid_starter'] != - 1) - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$phpconfig['mod_fcgid_starter'] . "\n"; - } - else - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$this->settings['system']['mod_fcgid_starter'] . "\n"; - } - } - - $starter_file.= "export PHP_FCGI_CHILDREN\n"; - - // set number of maximum requests for one domain - - if((int)$domain['mod_fcgid_maxrequests'] != - 1) - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$domain['mod_fcgid_maxrequests'] . "\n"; - } - else - { - if((int)$phpconfig['mod_fcgid_maxrequests'] != - 1) - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$phpconfig['mod_fcgid_maxrequests'] . "\n"; - } - else - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$this->settings['system']['mod_fcgid_maxrequests'] . "\n"; - } - } - - $starter_file.= "export PHP_FCGI_MAX_REQUESTS\n"; - - // Set Binary - - $starter_file.= "exec " . $phpconfig['binary'] . " -c " . escapeshellarg($configdir) . "\n"; - - //remove +i attibute, so starter can be overwritten - - if(file_exists($starter_filename)) - { - removeImmutable($starter_filename); - } - - $starter_file_handler = fopen($starter_filename, 'w'); - fwrite($starter_file_handler, $starter_file); - fclose($starter_file_handler); - safe_exec('chmod 750 ' . escapeshellarg($starter_filename)); - safe_exec('chown ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($starter_filename)); - setImmutable($starter_filename); - - // define the php.ini - - $openbasedir = ''; - $openbasedirc = ';'; - - if($domain['openbasedir'] == '1') - { - $openbasedirc = ''; - $_phpappendopenbasedir = ''; - - $_custom_openbasedir = explode(':', $this->settings['system']['mod_fcgid_peardir']); - foreach($_custom_openbasedir as $cobd) - { - $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); - } - - $_custom_openbasedir = explode(':', $this->settings['system']['phpappendopenbasedir']); - foreach($_custom_openbasedir as $cobd) - { - $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); - } - - if($domain['openbasedir_path'] == '0' && strstr($domain['documentroot'], ":") === false) - { - $openbasedir = appendOpenBasedirPath($domain['documentroot'], true); - } - else - { - $openbasedir = appendOpenBasedirPath($domain['customerroot'], true); - } - - $openbasedir .= appendOpenBasedirPath($tmpdir); - $openbasedir .= $_phpappendopenbasedir; - - $openbasedir = explode(':', $openbasedir); - $clean_openbasedir = array(); - foreach($openbasedir as $number => $path) - { - if(trim($path) != '/') - { - $clean_openbasedir[] = makeCorrectDir($path); - } - } - $openbasedir = implode(':', $clean_openbasedir); - } - else - { - $openbasedir = 'none'; - $openbasedirc = ';'; - } - - $admin = $this->getAdminData($domain['adminid']); - $php_ini_variables = array( - 'SAFE_MODE' => ($domain['safemode'] == '0' ? 'Off' : 'On'), - 'PEAR_DIR' => $this->settings['system']['mod_fcgid_peardir'], - 'OPEN_BASEDIR' => $openbasedir, - 'OPEN_BASEDIR_C' => $openbasedirc, - 'OPEN_BASEDIR_GLOBAL' => $this->settings['system']['phpappendopenbasedir'], - 'TMP_DIR' => $tmpdir, - 'CUSTOMER_EMAIL' => $domain['email'], - 'ADMIN_EMAIL' => $admin['email'], - 'DOMAIN' => $domain['domain'], - 'CUSTOMER' => $domain['loginname'], - 'ADMIN' => $admin['loginname'] - ); - - //insert a small header for the file - - $phpini_file = ";\n"; - $phpini_file.= "; php.ini created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $domain['domain'] . "' with id #" . $domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; - $phpini_file.= "; Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; - $phpini_file.= ";\n\n"; - $phpini_file.= replace_variables($phpconfig['phpsettings'], $php_ini_variables); - $phpini_file = str_replace('"none"', 'none', $phpini_file); - $phpini_file = preg_replace('/\"+/', '"', $phpini_file); - $phpini_file_handler = fopen($phpini_filename, 'w'); - fwrite($phpini_file_handler, $phpini_file); - fclose($phpini_file_handler); - safe_exec('chown root:0 ' . escapeshellarg($phpini_filename)); - safe_exec('chmod 0644 ' . escapeshellarg($phpini_filename)); } + + // create starter-file | config-file + $php->getInterface()->createConfig($phpconfig); + + // create php.ini + // @TODO make php-fpm support this + $php->getInterface()->createIniFile($phpconfig); } else { @@ -255,37 +87,6 @@ class apache_fcgid extends apache return $php_options_text; } - private function getPhpConfig($php_config_id) - { - $php_config_id = intval($php_config_id); - - // If domain has no config, we will use the default one. - - if($php_config_id == 0) - { - $php_config_id = 1; - } - - if(!isset($this->php_configs_cache[$php_config_id])) - { - $this->php_configs_cache[$php_config_id] = $this->getDB()->query_first("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = " . (int)$php_config_id); - } - - return $this->php_configs_cache[$php_config_id]; - } - - private function getAdminData($adminid) - { - $adminid = intval($adminid); - - if(!isset($this->admin_cache[$adminid])) - { - $this->admin_cache[$adminid] = $this->getDB()->query_first("SELECT `email`, `loginname` FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = " . (int)$adminid); - } - - return $this->admin_cache[$adminid]; - } - public function createOwnVhostStarter() { if ($this->settings['system']['mod_fcgid_ownvhost'] == '1') @@ -319,7 +120,8 @@ class apache_fcgid extends apache } // get php.ini for our own vhost - $phpconfig = $this->getPhpConfig((int)$this->settings['system']['mod_fcgid_defaultini_ownvhost']); + $php = new phpinterface($this->getDB(), $this->settings, null); + $phpconfig = $php->getPhpConfig($this->settings['system']['mod_fcgid_defaultini_ownvhost']); // create starter $starter_file = "#!/bin/sh\n\n"; @@ -397,83 +199,4 @@ class apache_fcgid extends apache safe_exec('chmod 0644 ' . escapeshellarg($phpini_filename)); } } - - private function _createFpmPart($domain) - { - $php_options_text = ''; - - if(!is_dir('/var/run/apache2/')) { - safe_exec('mkdir -p /var/run/apache2/'); - safe_exec('chown -R '.$this->settings['system']['httpuser'].':'.$this->settings['system']['httpgroup'].' /var/run/apache2/'); - } - $socket = makeCorrectFile('/var/run/apache2/'.$domain['loginname'].'-'.$domain['domain'].'-php-fpm.socket'); - $tmpfile = makeCorrectFile($this->settings['phpfpm']['configdir'].'/'.$domain['domain'].'.conf'); - - $fh = @fopen($tmpfile, 'w'); - if($fh) - { - $fpm_pm = $this->settings['phpfpm']['pm']; - $fpm_children = (int)$this->settings['phpfpm']['max_children']; - $fpm_start_servers = (int)$this->settings['phpfpm']['start_servers']; - $fpm_min_spare_servers = (int)$this->settings['phpfpm']['min_spare_servers']; - $fpm_max_spare_servers = (int)$this->settings['phpfpm']['max_spare_servers']; - $fpm_requests = (int)$this->settings['phpfpm']['max_requests']; - - if($fpm_children == 0) { - $fpm_children = 1; - } - - $tmpdir = makeCorrectDir($this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/'); - //$slowlog = makeCorrectFile($this->settings['system']['logfiles_directory'] . $domain['loginname'] . '/php-fpm_slow.log'); - - $fpm_config = ';PHP-FPM configuration for "'.$domain['domain'].'" created on ' . date("Y.m.d H:i:s") . "\n\n"; - $fpm_config.= '['.$domain['domain'].']'."\n"; - $fpm_config.= 'listen = '.$socket."\n"; - $fpm_config.= 'listen.owner = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.group = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.mode = 0666'."\n\n"; - - $fpm_config.= 'user = '.$domain['loginname']."\n"; - $fpm_config.= 'group = '.$domain['loginname']."\n\n"; - - $fpm_config.= 'pm = '.$fpm_pm."\n"; - $fpm_config.= 'pm.max_children = '.$fpm_children."\n"; - if($fpm_pm == 'dynamic') { - $fpm_config.= 'pm.start_servers = '.$fpm_start_servers."\n"; - $fpm_config.= 'pm.min_spare_servers = '.$fpm_min_spare_servers."\n"; - $fpm_config.= 'pm.max_spare_servers = '.$fpm_max_spare_servers."\n"; - } - $fpm_config.= 'pm.max_requests = '.$fpm_requests."\n\n"; - - $fpm_config.= ';chroot = '.makeCorrectDir($domain['documentroot'])."\n\n"; - - $fpm_config.= 'env[TMP] = '.$tmpdir."\n"; - $fpm_config.= 'env[TMPDIR] = '.$tmpdir."\n"; - $fpm_config.= 'env[TEMP] = '.$tmpdir."\n\n"; - - $fpm_config.= 'php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f '.$domain['email']."\n\n"; - $fpm_config.= 'php_admin_value[open_basedir] = ' . $this->settings['system']['documentroot_prefix'] . $domain['loginname'] . '/:' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/:' . $this->settings['phpfpm']['peardir'] . "\n"; - $fpm_config.= 'php_admin_value[session.save_path] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n"; - $fpm_config.= 'php_admin_value[upload_tmp_dir] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n\n"; - - fwrite($fh, $fpm_config, strlen($fpm_config)); - fclose($fh); - - $php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n"; - $php_options_text.= ' FastCgiExternalServer ' . makeCorrectDir($domain['documentroot']) . 'fpm.external -socket ' . $socket . ' -user ' . $domain['loginname'] . ' -group ' . $domain['loginname'] . "\n"; - $php_options_text.= ' ' . "\n"; - $php_options_text.= ' AddHandler php5-fastcgi .php'. "\n"; - $php_options_text.= ' Action php5-fastcgi /fastcgiphp' . "\n"; - $php_options_text.= ' Options +ExecCGI' . "\n"; - $php_options_text.= ' Order allow,deny' . "\n"; - $php_options_text.= ' allow from all' . "\n"; - $php_options_text.= ' ' . "\n"; - $php_options_text.= ' Alias /fastcgiphp ' . makeCorrectDir($domain['documentroot']) . 'fpm.external' . "\n"; - } - else - { - $php_options_text = ' # could not create php-fpm configuration for '.$domain['domain']. "\n"; - } - return $php_options_text; - } } diff --git a/scripts/jobs/cron_tasks.inc.http.25.lighttpd_fcgid.php b/scripts/jobs/cron_tasks.inc.http.25.lighttpd_fcgid.php index 63a1daab..a2921049 100644 --- a/scripts/jobs/cron_tasks.inc.http.25.lighttpd_fcgid.php +++ b/scripts/jobs/cron_tasks.inc.http.25.lighttpd_fcgid.php @@ -28,50 +28,31 @@ if(@php_sapi_name() != 'cli' class lighttpd_fcgid extends lighttpd { - private $php_configs_cache = array(); - private $admin_cache = array(); - protected function composePhpOptions($domain) { $php_options_text = ''; if($domain['phpenabled'] == '1') { + $php = new phpinterface($this->getDB(), $this->settings, $domain); + $phpconfig = $php->getPhpConfig((int)$domain['phpsettingid']); + + // vhost data for php-fpm if((int)$this->settings['phpfpm']['enabled'] == 1) { - $php_options_text = $this->_createFpmPart($domain); + $php_options_text = ' fastcgi.server = ( '."\n"; + $php_options_text.= "\t".'".php" => ('."\n"; + $php_options_text.= "\t\t".'"localhost" => ('."\n"; + $php_options_text.= "\t\t".'"socket" => "'.$php->getInterface()->getSocketFile().'",'."\n"; + $php_options_text.= "\t\t".'"check-local" => "enable",'."\n"; + $php_options_text.= "\t\t".'"disable-time" => 1'."\n"; + $php_options_text.= "\t".')'."\n"; + $php_options_text.= "\t".')'."\n"; + $php_options_text.= ' )'."\n"; } - else + // vhost data for fcgid + elseif((int)$this->settings['system']['mod_fcgid'] == 1) { - // This vHost has PHP enabled and we are using mod_fcgid - //create basic variables for config - - $configdir = makeCorrectDir($this->settings['system']['mod_fcgid_configdir'] . '/' . $domain['loginname'] . '/' . $domain['domain'] . '/'); - $starter_filename = makeCorrectFile($configdir . '/php-fcgi-starter'); - $phpini_filename = makeCorrectFile($configdir . '/php.ini'); - $tmpdir = makeCorrectDir($this->settings['system']['mod_fcgid_tmpdir'] . '/' . $domain['loginname'] . '/'); - - // create config dir if necessary - - if(!is_dir($configdir)) - { - safe_exec('mkdir -p ' . escapeshellarg($configdir)); - safe_exec('chown ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($configdir)); - } - - // create tmp dir if necessary - - if(!is_dir($tmpdir)) - { - safe_exec('mkdir -p ' . escapeshellarg($tmpdir)); - safe_exec('chown -R ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($tmpdir)); - safe_exec('chmod 0750 ' . escapeshellarg($tmpdir)); - } - - // Load php config - - $phpconfig = $this->getPhpConfig((int)$domain['phpsettingid']); - $php_options_text = ' fastcgi.server = ( '."\n"; $file_extensions = explode(' ', $phpconfig['file_extensions']); foreach($file_extensions as $f_extension) @@ -79,7 +60,7 @@ class lighttpd_fcgid extends lighttpd $php_options_text.= "\t".'".'.$f_extension.'" => ('."\n"; $php_options_text.= "\t\t".'"localhost" => ('."\n"; $php_options_text.= "\t\t".'"socket" => "/var/run/lighttpd/'.$domain['loginname'].'-'.$domain['domain'].'-php.socket",'."\n"; - $php_options_text.= "\t\t".'"bin-path" => "'.$phpconfig['binary'].' -c '.$phpini_filename.'",'."\n"; + $php_options_text.= "\t\t".'"bin-path" => "'.$phpconfig['binary'].' -c '.$php->getInterface()->getIniFile().'",'."\n"; $php_options_text.= "\t\t".'"bin-environment" => ('."\n"; if((int)$domain['mod_fcgid_starter'] != - 1) { @@ -119,157 +100,14 @@ class lighttpd_fcgid extends lighttpd } // foreach extension $php_options_text.= ' )'."\n"; - - // create starter - - $starter_file = "#!/bin/sh\n\n"; - $starter_file.= "#\n"; - $starter_file.= "# starter created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $domain['domain'] . "' with id #" . $domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; - $starter_file.= "# Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; - $starter_file.= "#\n\n"; - $starter_file.= "umask 022\n"; - $starter_file.= "PHPRC=" . escapeshellarg($configdir) . "\n"; - $starter_file.= "export PHPRC\n"; - - // set number of processes for one domain - - if((int)$domain['mod_fcgid_starter'] != - 1) - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$domain['mod_fcgid_starter'] . "\n"; - } - else - { - if((int)$phpconfig['mod_fcgid_starter'] != - 1) - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$phpconfig['mod_fcgid_starter'] . "\n"; - } - else - { - $starter_file.= "PHP_FCGI_CHILDREN=" . (int)$this->settings['system']['mod_fcgid_starter'] . "\n"; - } - } - - $starter_file.= "export PHP_FCGI_CHILDREN\n"; - - // set number of maximum requests for one domain - - if((int)$domain['mod_fcgid_maxrequests'] != - 1) - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$domain['mod_fcgid_maxrequests'] . "\n"; - } - else - { - if((int)$phpconfig['mod_fcgid_maxrequests'] != - 1) - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$phpconfig['mod_fcgid_maxrequests'] . "\n"; - } - else - { - $starter_file.= "PHP_FCGI_MAX_REQUESTS=" . (int)$this->settings['system']['mod_fcgid_maxrequests'] . "\n"; - } - } - - $starter_file.= "export PHP_FCGI_MAX_REQUESTS\n"; - - // Set Binary - - $starter_file.= "exec " . $phpconfig['binary'] . " -c " . escapeshellarg($configdir) . "\n"; - - //remove +i attibute, so starter can be overwritten - - if(file_exists($starter_filename)) - { - removeImmutable($starter_filename); - } - - $starter_file_handler = fopen($starter_filename, 'w'); - fwrite($starter_file_handler, $starter_file); - fclose($starter_file_handler); - safe_exec('chmod 750 ' . escapeshellarg($starter_filename)); - safe_exec('chown ' . $domain['guid'] . ':' . $domain['guid'] . ' ' . escapeshellarg($starter_filename)); - setImmutable($starter_filename); - - // define the php.ini - - $openbasedir = ''; - $openbasedirc = ';'; - - if($domain['openbasedir'] == '1') - { - $openbasedirc = ''; - $_phpappendopenbasedir = ''; - - $_custom_openbasedir = explode(':', $this->settings['system']['mod_fcgid_peardir']); - foreach($_custom_openbasedir as $cobd) - { - $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); - } - - $_custom_openbasedir = explode(':', $this->settings['system']['phpappendopenbasedir']); - foreach($_custom_openbasedir as $cobd) - { - $_phpappendopenbasedir .= appendOpenBasedirPath($cobd); - } - - if($domain['openbasedir_path'] == '0' && strstr($domain['documentroot'], ":") === false) - { - $openbasedir = appendOpenBasedirPath($domain['documentroot'], true); - } - else - { - $openbasedir = appendOpenBasedirPath($domain['customerroot'], true); - } - - $openbasedir .= appendOpenBasedirPath($tmpdir); - $openbasedir .= $_phpappendopenbasedir; - - $openbasedir = explode(':', $openbasedir); - $clean_openbasedir = array(); - foreach($openbasedir as $number => $path) - { - if(trim($path) != '/') - { - $clean_openbasedir[] = makeCorrectDir($path); - } - } - $openbasedir = implode(':', $clean_openbasedir); - } - else - { - $openbasedir = 'none'; - $openbasedirc = ';'; - } - - $admin = $this->getAdminData($domain['adminid']); - $php_ini_variables = array( - 'SAFE_MODE' => ($domain['safemode'] == '0' ? 'Off' : 'On'), - 'PEAR_DIR' => $this->settings['system']['mod_fcgid_peardir'], - 'OPEN_BASEDIR' => $openbasedir, - 'OPEN_BASEDIR_C' => $openbasedirc, - 'OPEN_BASEDIR_GLOBAL' => $this->settings['system']['phpappendopenbasedir'], - 'TMP_DIR' => $tmpdir, - 'CUSTOMER_EMAIL' => $domain['email'], - 'ADMIN_EMAIL' => $admin['email'], - 'DOMAIN' => $domain['domain'], - 'CUSTOMER' => $domain['loginname'], - 'ADMIN' => $admin['loginname'] - ); - - //insert a small header for the file - - $phpini_file = ";\n"; - $phpini_file.= "; php.ini created/changed on " . date("Y.m.d H:i:s") . " for domain '" . $domain['domain'] . "' with id #" . $domain['id'] . " from php template '" . $phpconfig['description'] . "' with id #" . $phpconfig['id'] . "\n"; - $phpini_file.= "; Do not change anything in this file, it will be overwritten by the Froxlor Cronjob!\n"; - $phpini_file.= ";\n\n"; - $phpini_file.= replace_variables($phpconfig['phpsettings'], $php_ini_variables); - $phpini_file = str_replace('"none"', 'none', $phpini_file); - $phpini_file = preg_replace('/\"+/', '"', $phpini_file); - $phpini_file_handler = fopen($phpini_filename, 'w'); - fwrite($phpini_file_handler, $phpini_file); - fclose($phpini_file_handler); - safe_exec('chown root:0 ' . escapeshellarg($phpini_filename)); - safe_exec('chmod 0644 ' . escapeshellarg($phpini_filename)); } + + // create starter-file | config-file + $php->getInterface()->createConfig($phpconfig); + + // create php.ini + // @TODO make php-fpm support this + $php->getInterface()->createIniFile($phpconfig); } else { @@ -278,109 +116,4 @@ class lighttpd_fcgid extends lighttpd return $php_options_text; } - - private function getPhpConfig($php_config_id) - { - $php_config_id = intval($php_config_id); - - // If domain has no config, we will use the default one. - - if($php_config_id == 0) - { - $php_config_id = 1; - } - - if(!isset($this->php_configs_cache[$php_config_id])) - { - $this->php_configs_cache[$php_config_id] = $this->getDB()->query_first("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = " . (int)$php_config_id); - } - - return $this->php_configs_cache[$php_config_id]; - } - - private function getAdminData($adminid) - { - $adminid = intval($adminid); - - if(!isset($this->admin_cache[$adminid])) - { - $this->admin_cache[$adminid] = $this->getDB()->query_first("SELECT `email`, `loginname` FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = " . (int)$adminid); - } - - return $this->admin_cache[$adminid]; - } - - private function _createFpmPart($domain) - { - $php_options_text = ''; - - $socket = makeCorrectFile('/var/run/lighttpd/'.$domain['loginname'].'-'.$domain['domain'].'-php-fpm.socket'); - $tmpfile = makeCorrectFile($this->settings['phpfpm']['configdir'].'/'.$domain['domain'].'.conf'); - - $fh = @fopen($tmpfile, 'w'); - if($fh) - { - $fpm_pm = $this->settings['phpfpm']['pm']; - $fpm_children = (int)$this->settings['phpfpm']['max_children']; - $fpm_start_servers = (int)$this->settings['phpfpm']['start_servers']; - $fpm_min_spare_servers = (int)$this->settings['phpfpm']['min_spare_servers']; - $fpm_max_spare_servers = (int)$this->settings['phpfpm']['max_spare_servers']; - $fpm_requests = (int)$this->settings['phpfpm']['max_requests']; - - if($fpm_children == 0) { - $fpm_children = 1; - } - - $tmpdir = makeCorrectDir($this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/'); - //$slowlog = makeCorrectFile($this->settings['system']['logfiles_directory'] . $domain['loginname'] . '/php-fpm_slow.log'); - - $fpm_config = ';PHP-FPM configuration for "'.$domain['domain'].'" created on ' . date("Y.m.d H:i:s") . "\n\n"; - $fpm_config.= '['.$domain['domain'].']'."\n"; - $fpm_config.= 'listen = '.$socket."\n"; - $fpm_config.= 'listen.owner = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.group = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.mode = 0666'."\n\n"; - - $fpm_config.= 'user = '.$domain['loginname']."\n"; - $fpm_config.= 'group = '.$domain['loginname']."\n\n"; - - $fpm_config.= 'pm = '.$fpm_pm."\n"; - $fpm_config.= 'pm.max_children = '.$fpm_children."\n"; - if($fpm_pm == 'dynamic') { - $fpm_config.= 'pm.start_servers = '.$fpm_start_servers."\n"; - $fpm_config.= 'pm.min_spare_servers = '.$fpm_min_spare_servers."\n"; - $fpm_config.= 'pm.max_spare_servers = '.$fpm_max_spare_servers."\n"; - } - $fpm_config.= 'pm.max_requests = '.$fpm_requests."\n\n"; - - $fpm_config.= ';chroot = '.makeCorrectDir($domain['documentroot'])."\n\n"; - - $fpm_config.= 'env[TMP] = '.$tmpdir."\n"; - $fpm_config.= 'env[TMPDIR] = '.$tmpdir."\n"; - $fpm_config.= 'env[TEMP] = '.$tmpdir."\n\n"; - - $fpm_config.= 'php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f '.$domain['email']."\n\n"; - $fpm_config.= 'php_admin_value[open_basedir] = ' . $this->settings['system']['documentroot_prefix'] . $domain['loginname'] . '/:' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/:' . $this->settings['phpfpm']['peardir'] . "\n"; - $fpm_config.= 'php_admin_value[session.save_path] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n"; - $fpm_config.= 'php_admin_value[upload_tmp_dir] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n\n"; - - fwrite($fh, $fpm_config, strlen($fpm_config)); - fclose($fh); - - $php_options_text = ' fastcgi.server = ( '."\n"; - $php_options_text.= "\t".'".php" => ('."\n"; - $php_options_text.= "\t\t".'"localhost" => ('."\n"; - $php_options_text.= "\t\t".'"socket" => "'.$socket.'",'."\n"; - $php_options_text.= "\t\t".'"check-local" => "enable",'."\n"; - $php_options_text.= "\t\t".'"disable-time" => 1'."\n"; - $php_options_text.= "\t".')'."\n"; - $php_options_text.= "\t".')'."\n"; - $php_options_text.= ' )'."\n"; - } - else - { - $php_options_text = ' # could not create php-fpm configuration for '.$domain['domain']. "\n"; - } - return $php_options_text; - } } diff --git a/scripts/jobs/cron_tasks.inc.http.35.nginx_phpfpm.php b/scripts/jobs/cron_tasks.inc.http.35.nginx_phpfpm.php index 088e67b8..41edbf2c 100644 --- a/scripts/jobs/cron_tasks.inc.http.35.nginx_phpfpm.php +++ b/scripts/jobs/cron_tasks.inc.http.35.nginx_phpfpm.php @@ -28,16 +28,28 @@ if(@php_sapi_name() != 'cli' class nginx_phpfpm extends nginx { - private $php_configs_cache = array(); - private $admin_cache = array(); - protected function composePhpOptions($domain) { $php_options_text = ''; if($domain['phpenabled'] == '1') { - $php_options_text = $this->_createFpmPart($domain); + $php = new phpinterface($this->getDB(), $this->settings, $domain); + $phpconfig = $php->getPhpConfig((int)$domain['phpsettingid']); + + $php_options_text = "\t".'location ~ \.php$ {'."\n"; + $php_options_text.= "\t\t".'fastcgi_index index.php;'."\n"; + $php_options_text.= "\t\t".'include /etc/nginx/fastcgi_params;'."\n"; + $php_options_text.= "\t\t".'fastcgi_param SCRIPT_FILENAME '.makeCorrectDir($domain['documentroot']).'$fastcgi_script_name;'."\n"; + $php_options_text.= "\t\t".'fastcgi_pass unix:' . $php->getInterface()->getSocketFile() . ';' . "\n"; + $php_options_text.= "\t".'}'."\n"; + + // create starter-file | config-file + $php->getInterface()->createConfig($phpconfig); + + // create php.ini + // @TODO make php-fpm support this + $php->getInterface()->createIniFile($phpconfig); } else { @@ -46,111 +58,4 @@ class nginx_phpfpm extends nginx return $php_options_text; } - - private function getPhpConfig($php_config_id) - { - $php_config_id = intval($php_config_id); - - // If domain has no config, we will use the default one. - - if($php_config_id == 0) - { - $php_config_id = 1; - } - - if(!isset($this->php_configs_cache[$php_config_id])) - { - $this->php_configs_cache[$php_config_id] = $this->getDB()->query_first("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = " . (int)$php_config_id); - } - - return $this->php_configs_cache[$php_config_id]; - } - - private function getAdminData($adminid) - { - $adminid = intval($adminid); - - if(!isset($this->admin_cache[$adminid])) - { - $this->admin_cache[$adminid] = $this->getDB()->query_first("SELECT `email`, `loginname` FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = " . (int)$adminid); - } - - return $this->admin_cache[$adminid]; - } - - private function _createFpmPart($domain) - { - $php_options_text = ''; - - if(!is_dir('/var/run/nginx/')) { - safe_exec('mkdir -p /var/run/nginx/'); - safe_exec('chown -R '.$this->settings['system']['httpuser'].':'.$this->settings['system']['httpgroup'].' /var/run/nginx/'); - } - $socket = makeCorrectFile('/var/run/nginx/'.$domain['loginname'].'-'.$domain['domain'].'-php-fpm.socket'); - $tmpfile = makeCorrectFile($this->settings['phpfpm']['configdir'].'/'.$domain['domain'].'.conf'); - - $fh = @fopen($tmpfile, 'w'); - if($fh) - { - $fpm_pm = $this->settings['phpfpm']['pm']; - $fpm_children = (int)$this->settings['phpfpm']['max_children']; - $fpm_start_servers = (int)$this->settings['phpfpm']['start_servers']; - $fpm_min_spare_servers = (int)$this->settings['phpfpm']['min_spare_servers']; - $fpm_max_spare_servers = (int)$this->settings['phpfpm']['max_spare_servers']; - $fpm_requests = (int)$this->settings['phpfpm']['max_requests']; - - if($fpm_children == 0) { - $fpm_children = 1; - } - - $tmpdir = makeCorrectDir($this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/'); - //$slowlog = makeCorrectFile($this->settings['system']['logfiles_directory'] . $domain['loginname'] . '/php-fpm_slow.log'); - - $fpm_config = ';PHP-FPM configuration for "'.$domain['domain'].'" created on ' . date("Y.m.d H:i:s") . "\n\n"; - $fpm_config.= '['.$domain['domain'].']'."\n"; - $fpm_config.= 'listen = '.$socket."\n"; - $fpm_config.= 'listen.owner = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.group = '.$domain['loginname']."\n"; - $fpm_config.= 'listen.mode = 0666'."\n\n"; - - $fpm_config.= 'user = '.$domain['loginname']."\n"; - $fpm_config.= 'group = '.$domain['loginname']."\n\n"; - - $fpm_config.= 'pm = '.$fpm_pm."\n"; - $fpm_config.= 'pm.max_children = '.$fpm_children."\n"; - if($fpm_pm == 'dynamic') { - $fpm_config.= 'pm.start_servers = '.$fpm_start_servers."\n"; - $fpm_config.= 'pm.min_spare_servers = '.$fpm_min_spare_servers."\n"; - $fpm_config.= 'pm.max_spare_servers = '.$fpm_max_spare_servers."\n"; - } - $fpm_config.= 'pm.max_requests = '.$fpm_requests."\n\n"; - - $fpm_config.= ';chroot = '.makeCorrectDir($domain['documentroot'])."\n\n"; - - $fpm_config.= 'env[TMP] = '.$tmpdir."\n"; - $fpm_config.= 'env[TMPDIR] = '.$tmpdir."\n"; - $fpm_config.= 'env[TEMP] = '.$tmpdir."\n\n"; - - $fpm_config.= 'php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f '.$domain['email']."\n\n"; - $fpm_config.= 'php_admin_value[open_basedir] = ' . $this->settings['system']['documentroot_prefix'] . $domain['loginname'] . '/:' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/:' . $this->settings['phpfpm']['peardir'] . "\n"; - $fpm_config.= 'php_admin_value[session.save_path] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n"; - $fpm_config.= 'php_admin_value[upload_tmp_dir] = ' . $this->settings['phpfpm']['tmpdir'] . '/' . $domain['loginname'] . '/' . "\n\n"; - - fwrite($fh, $fpm_config, strlen($fpm_config)); - fclose($fh); - - $php_options_text = "\t".'location ~ \.php$ {'."\n"; - $php_options_text.= "\t\t".'fastcgi_index index.php;'."\n"; - $php_options_text.= "\t\t".'include /etc/nginx/fastcgi_params;'."\n"; - $php_options_text.= "\t\t".'fastcgi_param SCRIPT_FILENAME '.makeCorrectDir($domain['documentroot']).'$fastcgi_script_name;'."\n"; - $php_options_text.= "\t\t".'fastcgi_pass unix:' . $socket . ';' . "\n"; - $php_options_text.= "\t".'}'."\n"; - - } - else - { - $php_options_text = ' # could not create php-fpm configuration for '.$domain['domain']. "\n"; - } - return $php_options_text; - } }