From 445513c1a26f7f1639fad2f622ce12f7491dfd88 Mon Sep 17 00:00:00 2001
From: ftimme <ft@falkotimme.com>
Date: Tue, 27 Sep 2011 08:28:22 -0400
Subject: [PATCH] - Added PHP-FPM pm settings (pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers) to the "Options" tab of a website.

---
 interface/web/sites/templates/web_domain_advanced.htm |   16 +++++
 server/conf/vhost.conf.master                         |    2 
 install/sql/incremental/upd_0025.sql                  |    4 +
 server/conf/nginx_vhost.conf.master                   |    2 
 install/sql/ispconfig3.sql                            |    4 +
 interface/web/sites/lib/lang/de_web_domain.lng        |    9 +++
 interface/web/sites/lib/lang/en_web_domain.lng        |    9 +++
 interface/web/sites/web_domain_edit.php               |   24 +++++--
 server/plugins-available/nginx_plugin.inc.php         |    4 +
 interface/web/sites/form/web_domain.tform.php         |   48 ++++++++++++++++
 server/conf/php_fpm_pool.conf.master                  |    8 +-
 11 files changed, 116 insertions(+), 14 deletions(-)

diff --git a/install/sql/incremental/upd_0025.sql b/install/sql/incremental/upd_0025.sql
new file mode 100644
index 0000000..c49a971
--- /dev/null
+++ b/install/sql/incremental/upd_0025.sql
@@ -0,0 +1,4 @@
+ALTER TABLE `web_domain` ADD `pm_max_children` INT NOT NULL DEFAULT '50' AFTER `php_fpm_use_socket` ,
+ADD `pm_start_servers` INT NOT NULL DEFAULT '20' AFTER `pm_max_children` ,
+ADD `pm_min_spare_servers` INT NOT NULL DEFAULT '5' AFTER `pm_start_servers` ,
+ADD `pm_max_spare_servers` INT NOT NULL DEFAULT '35' AFTER `pm_min_spare_servers`;
\ No newline at end of file
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 378af4a..8a9fad6 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -1513,6 +1513,10 @@
   `apache_directives` mediumtext,
   `nginx_directives` mediumtext,
   `php_fpm_use_socket` ENUM('n','y') NOT NULL DEFAULT 'n',
+  `pm_max_children` int(11) NOT NULL DEFAULT '50',
+  `pm_start_servers` int(11) NOT NULL DEFAULT '20',
+  `pm_min_spare_servers` int(11) NOT NULL DEFAULT '5',
+  `pm_max_spare_servers` int(11) NOT NULL DEFAULT '35',
   `php_open_basedir` mediumtext,
   `custom_php_ini` mediumtext,
   `backup_interval` VARCHAR( 255 ) NOT NULL DEFAULT 'none',
diff --git a/interface/web/sites/form/web_domain.tform.php b/interface/web/sites/form/web_domain.tform.php
index 43dce0b..4c6bed4 100644
--- a/interface/web/sites/form/web_domain.tform.php
+++ b/interface/web/sites/form/web_domain.tform.php
@@ -511,6 +511,54 @@
 			'default'	=> 'n',
 			'value'		=> array(0 => 'n',1 => 'y')
 		),
+		'pm_max_children' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'REGEX',
+														'regex' => '/^([1-9][0-9]{0,10})$/',
+														'errmsg'=> 'pm_max_children_error_regex'),
+									),
+			'default'	=> '50',
+			'value'		=> '',
+			'width'		=> '3',
+			'maxlength'	=> '3'
+		),
+		'pm_start_servers' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'REGEX',
+														'regex' => '/^([1-9][0-9]{0,10})$/',
+														'errmsg'=> 'pm_start_servers_error_regex'),
+									),
+			'default'	=> '20',
+			'value'		=> '',
+			'width'		=> '3',
+			'maxlength'	=> '3'
+		),
+		'pm_min_spare_servers' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'REGEX',
+														'regex' => '/^([1-9][0-9]{0,10})$/',
+														'errmsg'=> 'pm_min_spare_servers_error_regex'),
+									),
+			'default'	=> '5',
+			'value'		=> '',
+			'width'		=> '3',
+			'maxlength'	=> '3'
+		),
+		'pm_max_spare_servers' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'REGEX',
+														'regex' => '/^([1-9][0-9]{0,10})$/',
+														'errmsg'=> 'pm_max_spare_servers_error_regex'),
+									),
+			'default'	=> '35',
+			'value'		=> '',
+			'width'		=> '3',
+			'maxlength'	=> '3'
+		),
 		'php_open_basedir' => array (
 			'datatype'	=> 'VARCHAR',
 			'formtype'	=> 'TEXT',
diff --git a/interface/web/sites/lib/lang/de_web_domain.lng b/interface/web/sites/lib/lang/de_web_domain.lng
index b69695a..7aec4b1 100644
--- a/interface/web/sites/lib/lang/de_web_domain.lng
+++ b/interface/web/sites/lib/lang/de_web_domain.lng
@@ -80,4 +80,13 @@
 $wb['ipv6_address_txt'] = 'IPv6-Address';
 $wb['error_no_sni_txt'] = 'SNI for SSL is not activated on this server. You can enable only one SSL certificate on each IP address.';
 $wb["python_txt"] = 'Python';
+$wb["pm_max_children_txt"] = 'PHP-FPM pm.max_children';
+$wb["pm_start_servers_txt"] = 'PHP-FPM pm.start_servers';
+$wb["pm_min_spare_servers_txt"] = 'PHP-FPM pm.min_spare_servers';
+$wb["pm_max_spare_servers_txt"] = 'PHP-FPM pm.max_spare_servers';
+$wb["error_php_fpm_pm_settings_txt"] = 'Die Werte der PHP-FPM pm Einstellungen m&uuml;ssen wie folgt sein: pm.max_children &gt;= pm.max_spare_servers &gt;= pm.start_servers &gt;= pm.min_spare_servers &gt; 0';
+$wb["pm_max_children_error_regex"] = 'PHP-FPM pm.max_children mu&szlig; eine positive ganze Zahl sein.';
+$wb["pm_start_servers_error_regex"] = 'PHP-FPM pm.start_servers mu&szlig; eine positive ganze Zahl sein.';
+$wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers mu&szlig; eine positive ganze Zahl sein.';
+$wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers mu&szlig; eine positive ganze Zahl sein.';
 ?>
diff --git a/interface/web/sites/lib/lang/en_web_domain.lng b/interface/web/sites/lib/lang/en_web_domain.lng
index af1e098..b7fcc67 100644
--- a/interface/web/sites/lib/lang/en_web_domain.lng
+++ b/interface/web/sites/lib/lang/en_web_domain.lng
@@ -80,4 +80,13 @@
 $wb["php_fpm_use_socket_txt"] = 'Use Socket For PHP-FPM';
 $wb["error_no_sni_txt"] = 'SNI for SSL is not activated on this server. You can enable only one SSL certificate on each IP address.';
 $wb["python_txt"] = 'Python';
+$wb["pm_max_children_txt"] = 'PHP-FPM pm.max_children';
+$wb["pm_start_servers_txt"] = 'PHP-FPM pm.start_servers';
+$wb["pm_min_spare_servers_txt"] = 'PHP-FPM pm.min_spare_servers';
+$wb["pm_max_spare_servers_txt"] = 'PHP-FPM pm.max_spare_servers';
+$wb["error_php_fpm_pm_settings_txt"] = 'Values of PHP-FPM pm settings must be as follows: pm.max_children &gt;= pm.max_spare_servers &gt;= pm.start_servers &gt;= pm.min_spare_servers &gt; 0';
+$wb["pm_max_children_error_regex"] = 'PHP-FPM pm.max_children must be a positive integer value.';
+$wb["pm_start_servers_error_regex"] = 'PHP-FPM pm.start_servers must be a positive integer value.';
+$wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers must be a positive integer value.';
+$wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.';
 ?>
\ No newline at end of file
diff --git a/interface/web/sites/templates/web_domain_advanced.htm b/interface/web/sites/templates/web_domain_advanced.htm
index 4b51cc1..2000ff6 100644
--- a/interface/web/sites/templates/web_domain_advanced.htm
+++ b/interface/web/sites/templates/web_domain_advanced.htm
@@ -26,6 +26,22 @@
 						{tmpl_var name='php_fpm_use_socket'}
 					</div>
 			</div>
+	  <div class="ctrlHolder nginx">
+      	<label for="pm_max_children">{tmpl_var name='pm_max_children_txt'}</label>
+        <input name="pm_max_children" id="pm_max_children" value="{tmpl_var name='pm_max_children'}" size="3" maxlength="3" type="text" class="textInput formLengthLimit" />
+			</div>
+	<div class="ctrlHolder nginx">
+      	<label for="pm_start_servers">{tmpl_var name='pm_start_servers_txt'}</label>
+        <input name="pm_start_servers" id="pm_start_servers" value="{tmpl_var name='pm_start_servers'}" size="3" maxlength="3" type="text" class="textInput formLengthLimit" />
+			</div>
+	<div class="ctrlHolder nginx">
+      	<label for="pm_min_spare_servers">{tmpl_var name='pm_min_spare_servers_txt'}</label>
+        <input name="pm_min_spare_servers" id="pm_min_spare_servers" value="{tmpl_var name='pm_min_spare_servers'}" size="3" maxlength="3" type="text" class="textInput formLengthLimit" />
+			</div>
+	<div class="ctrlHolder nginx">
+      	<label for="pm_max_spare_servers">{tmpl_var name='pm_max_spare_servers_txt'}</label>
+        <input name="pm_max_spare_servers" id="pm_max_spare_servers" value="{tmpl_var name='pm_max_spare_servers'}" size="3" maxlength="3" type="text" class="textInput formLengthLimit" />
+			</div>
 	  <div class="ctrlHolder">
       	<label for="php_open_basedir">{tmpl_var name='php_open_basedir_txt'}</label>
         <input name="php_open_basedir" id="php_open_basedir" value="{tmpl_var name='php_open_basedir'}" size="30" type="text" class="textInput"  style="width:400px;" />
diff --git a/interface/web/sites/web_domain_edit.php b/interface/web/sites/web_domain_edit.php
index 13af0a1..dff5148 100644
--- a/interface/web/sites/web_domain_edit.php
+++ b/interface/web/sites/web_domain_edit.php
@@ -418,15 +418,23 @@
 		if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]);
 		
 		//* get the server config for this server
-			$app->uses("getconf");
-			$web_config = $app->getconf->get_server_config(intval($this->dataRecord["server_id"]),'web');
-			//* Check for duplicate ssl certs per IP if SNI is disabled
-			if(isset($this->dataRecord['ssl']) && $this->dataRecord['ssl'] == 'y' && $web_config['enable_sni'] != 'y') {
-				$sql = "SELECT count(domain_id) as number FROM web_domain WHERE `ssl` = 'y' AND ip_address = '".$app->db->quote($this->dataRecord['ip_address'])."' and domain_id != ".$this->id;
-				$tmp = $app->db->queryOneRecord($sql);
-				if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("error_no_sni_txt");
-			}
+		$app->uses("getconf");
+		$web_config = $app->getconf->get_server_config(intval($this->dataRecord["server_id"]),'web');
+		//* Check for duplicate ssl certs per IP if SNI is disabled
+		if(isset($this->dataRecord['ssl']) && $this->dataRecord['ssl'] == 'y' && $web_config['enable_sni'] != 'y') {
+			$sql = "SELECT count(domain_id) as number FROM web_domain WHERE `ssl` = 'y' AND ip_address = '".$app->db->quote($this->dataRecord['ip_address'])."' and domain_id != ".$this->id;
+			$tmp = $app->db->queryOneRecord($sql);
+			if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("error_no_sni_txt");
+		}
 		
+		// Check if pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0
+		if(isset($this->dataRecord['pm_max_children'])) {
+			if(intval($this->dataRecord['pm_max_children']) >= intval($this->dataRecord['pm_max_spare_servers']) && intval($this->dataRecord['pm_max_spare_servers']) >= intval($this->dataRecord['pm_start_servers']) && intval($this->dataRecord['pm_start_servers']) >= intval($this->dataRecord['pm_min_spare_servers']) && intval($this->dataRecord['pm_min_spare_servers']) > 0){
+		
+			} else {
+				$app->tform->errorMessage .= $app->tform->lng("error_php_fpm_pm_settings_txt").'<br>';
+			}
+		}
 
 		parent::onSubmit();
 	}
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master
index fd05731..4027b56 100644
--- a/server/conf/nginx_vhost.conf.master
+++ b/server/conf/nginx_vhost.conf.master
@@ -44,7 +44,7 @@
         error_page 404 /error/404.html;
         error_page 405 /error/405.html;
         error_page 500 /error/500.html;
-		error_page 502 /error/502.html;
+        error_page 502 /error/502.html;
         error_page 503 /error/503.html;
 </tmpl_if>
 		
diff --git a/server/conf/php_fpm_pool.conf.master b/server/conf/php_fpm_pool.conf.master
index 0e74173..cd1ba12 100644
--- a/server/conf/php_fpm_pool.conf.master
+++ b/server/conf/php_fpm_pool.conf.master
@@ -15,10 +15,10 @@
 group = <tmpl_var name='fpm_group'>
 
 pm = dynamic
-pm.max_children = 50
-pm.start_servers = 20
-pm.min_spare_servers = 5
-pm.max_spare_servers = 35
+pm.max_children = <tmpl_var name='pm_max_children'>
+pm.start_servers = <tmpl_var name='pm_start_servers'>
+pm.min_spare_servers = <tmpl_var name='pm_min_spare_servers'>
+pm.max_spare_servers = <tmpl_var name='pm_max_spare_servers'>
 
 chdir = /
 
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 8ea14b7..410d44d 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -33,7 +33,7 @@
     ErrorDocument 404 /error/404.html
     ErrorDocument 405 /error/405.html
     ErrorDocument 500 /error/500.html
-	ErrorDocument 502 /error/502.html
+    ErrorDocument 502 /error/502.html
     ErrorDocument 503 /error/503.html
 </tmpl_if>
 
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index 4c9c2ab..5e927cd 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -1132,6 +1132,10 @@
 		$tpl->setVar('fpm_port', $web_config['php_fpm_start_port'] + $data['new']['domain_id'] + 1);
 		$tpl->setVar('fpm_user', $data['new']['system_user']);
 		$tpl->setVar('fpm_group', $data['new']['system_group']);
+		$tpl->setVar('pm_max_children', $data['new']['pm_max_children']);
+		$tpl->setVar('pm_start_servers', $data['new']['pm_start_servers']);
+		$tpl->setVar('pm_min_spare_servers', $data['new']['pm_min_spare_servers']);
+		$tpl->setVar('pm_max_spare_servers', $data['new']['pm_max_spare_servers']);
 		$tpl->setVar('document_root', $data['new']['document_root']);
 		$tpl->setVar('security_level',$web_config['security_level']);
 		$php_open_basedir = ($data['new']['php_open_basedir'] == '')?escapeshellcmd($data['new']['document_root']):escapeshellcmd($data['new']['php_open_basedir']);

--
Gitblit v1.9.1