Skip to content

Commit b4687b3

Browse files
committed
- nginx: added support for multiple PHP-FPM versions (FS#1963 now complete).
1 parent a8b07ff commit b4687b3

File tree

3 files changed

+155
-13
lines changed

3 files changed

+155
-13
lines changed

interface/web/sites/ajax_get_json.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
//* Check permissions for module
3535
$app->auth->check_module_permissions('sites');
3636

37+
$app->uses('getconf');
38+
3739
$server_id = intval($_GET["server_id"]);
3840
$web_id = intval($_GET["web_id"]);
3941
$type = $_GET["type"];
@@ -43,7 +45,6 @@
4345
if($type == 'getservertype'){
4446
$json = '{"servertype":"';
4547
$server_type = 'apache';
46-
$app->uses('getconf');
4748
$web_config = $app->getconf->get_server_config($server_id, 'web');
4849
if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
4950
$json .= $server_type;
@@ -62,12 +63,24 @@
6263

6364
if($type == 'getphpfastcgi'){
6465
$json = '{';
65-
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id";
66+
67+
$server_type = 'apache';
68+
$web_config = $app->getconf->get_server_config($server_id, 'web');
69+
if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
70+
if($server_type == 'nginx'){
71+
$sql = "SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = $server_id";
72+
} else {
73+
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id";
74+
}
6675
$php_records = $app->db->queryAllRecords($sql);
6776
$php_select = "";
6877
if(is_array($php_records) && !empty($php_records)) {
6978
foreach( $php_records as $php_record) {
70-
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
79+
if($server_type == 'nginx'){
80+
$php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir'];
81+
} else {
82+
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
83+
}
7184
$json .= '"'.$php_version.'": "'.$php_record['name'].'",';
7285
}
7386
}

interface/web/sites/web_domain_edit.php

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ function onShowNew() {
8686

8787
function onShowEnd() {
8888
global $app, $conf;
89+
90+
$app->uses('ini_parser,getconf');
8991

9092
//* Client: If the logged in user is not admin and has no sub clients (no reseller)
9193
if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) {
@@ -130,12 +132,23 @@ function onShowEnd() {
130132
unset($ips);
131133

132134
//PHP Version Selection (FastCGI)
133-
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
135+
$server_type = 'apache';
136+
$web_config = $app->getconf->get_server_config($client['default_webserver'], 'web');
137+
if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
138+
if($server_type == 'nginx'){
139+
$sql = "SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
140+
} else {
141+
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
142+
}
134143
$php_records = $app->db->queryAllRecords($sql);
135144
$php_select = "<option value=''>Default</option>";
136145
if(is_array($php_records) && !empty($php_records)) {
137146
foreach( $php_records as $php_record) {
138-
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
147+
if($server_type == 'nginx'){
148+
$php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir'];
149+
} else {
150+
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
151+
}
139152
$selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':'';
140153
$php_select .= "<option value='$php_version' $selected>".$php_record['name']."</option>\r\n";
141154
}
@@ -200,12 +213,23 @@ function onShowEnd() {
200213
unset($ips);
201214

202215
//PHP Version Selection (FastCGI)
203-
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
216+
$server_type = 'apache';
217+
$web_config = $app->getconf->get_server_config($client['default_webserver'], 'web');
218+
if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
219+
if($server_type == 'nginx'){
220+
$sql = "SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
221+
} else {
222+
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = ".$client['default_webserver']." AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")";
223+
}
204224
$php_records = $app->db->queryAllRecords($sql);
205225
$php_select = "<option value=''>Default</option>";
206226
if(is_array($php_records) && !empty($php_records)) {
207227
foreach( $php_records as $php_record) {
208-
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
228+
if($server_type == 'nginx'){
229+
$php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir'];
230+
} else {
231+
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
232+
}
209233
$selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':'';
210234
$php_select .= "<option value='$php_version' $selected>".$php_record['name']."</option>\r\n";
211235
}
@@ -256,12 +280,23 @@ function onShowEnd() {
256280
unset($ips);
257281

258282
//PHP Version Selection (FastCGI)
259-
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id";
283+
$server_type = 'apache';
284+
$web_config = $app->getconf->get_server_config($server_id, 'web');
285+
if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
286+
if($server_type == 'nginx'){
287+
$sql = "SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = $server_id";
288+
} else {
289+
$sql = "SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id";
290+
}
260291
$php_records = $app->db->queryAllRecords($sql);
261292
$php_select = "<option value=''>Default</option>";
262293
if(is_array($php_records) && !empty($php_records)) {
263294
foreach( $php_records as $php_record) {
264-
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
295+
if($server_type == 'nginx'){
296+
$php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir'];
297+
} else {
298+
$php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir'];
299+
}
265300
$selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':'';
266301
$php_select .= "<option value='$php_version' $selected>".$php_record['name']."</option>\r\n";
267302
}
@@ -314,7 +349,6 @@ function onShowEnd() {
314349
* Now we have to check, if we should use the domain-module to select the domain
315350
* or not
316351
*/
317-
$app->uses('ini_parser,getconf');
318352
$settings = $app->getconf->get_global_config('domains');
319353
if ($settings['use_domain_module'] == 'y') {
320354
/*

server/plugins-available/nginx_plugin.inc.php

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,20 @@ function update($event_name,$data) {
712712
if($data['new']['ipv6_address'] != '') $tpl->setVar('ipv6_enabled', 1);
713713

714714
// PHP-FPM
715-
$pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
715+
// Support for multiple PHP versions
716+
if(trim($data['new']['fastcgi_php_version']) != ''){
717+
$default_php_fpm = false;
718+
list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
719+
if(substr($custom_php_fpm_ini_dir,-1) != '/') $custom_php_fpm_ini_dir .= '/';
720+
} else {
721+
$default_php_fpm = true;
722+
}
723+
724+
if($default_php_fpm){
725+
$pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
726+
} else {
727+
$pool_dir = $custom_php_fpm_pool_dir;
728+
}
716729
if(substr($pool_dir,-1) != '/') $pool_dir .= '/';
717730
$pool_name = 'web'.$data['new']['domain_id'];
718731
$socket_dir = escapeshellcmd($web_config['php_fpm_socket_dir']);
@@ -1386,6 +1399,14 @@ private function php_fpm_pool_update ($data,$web_config,$pool_dir,$pool_name,$so
13861399
global $app, $conf;
13871400
//$reload = false;
13881401

1402+
if(trim($data['new']['fastcgi_php_version']) != ''){
1403+
$default_php_fpm = false;
1404+
list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
1405+
if(substr($custom_php_fpm_ini_dir,-1) != '/') $custom_php_fpm_ini_dir .= '/';
1406+
} else {
1407+
$default_php_fpm = true;
1408+
}
1409+
13891410
if($data['new']['php'] == 'no'){
13901411
if(@is_file($pool_dir.$pool_name.'.conf')){
13911412
unlink($pool_dir.$pool_name.'.conf');
@@ -1474,24 +1495,98 @@ private function php_fpm_pool_update ($data,$web_config,$pool_dir,$pool_name,$so
14741495
file_put_contents($pool_dir.$pool_name.'.conf',$tpl->grab());
14751496
$app->log('Writing the PHP-FPM config file: '.$pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
14761497
unset($tpl);
1498+
1499+
// delete pool in all other PHP versions
1500+
$default_pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
1501+
if(substr($default_pool_dir,-1) != '/') $default_pool_dir .= '/';
1502+
if($default_pool_dir != $pool_dir){
1503+
if ( @is_file($default_pool_dir.$pool_name.'.conf') ) {
1504+
unlink($default_pool_dir.$pool_name.'.conf');
1505+
$app->log('Removed PHP-FPM config file: '.$default_pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
1506+
exec($conf['init_scripts'] . '/' . $web_config['php_fpm_init_script'] . ' reload');
1507+
}
1508+
}
1509+
$php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$conf["server_id"]);
1510+
if(is_array($php_versions) && !empty($php_versions)){
1511+
foreach($php_versions as $php_version){
1512+
if(substr($php_version['php_fpm_pool_dir'],-1) != '/') $php_version['php_fpm_pool_dir'] .= '/';
1513+
if($php_version['php_fpm_pool_dir'] != $pool_dir){
1514+
if ( @is_file($php_version['php_fpm_pool_dir'].$pool_name.'.conf') ) {
1515+
unlink($php_version['php_fpm_pool_dir'].$pool_name.'.conf');
1516+
$app->log('Removed PHP-FPM config file: '.$php_version['php_fpm_pool_dir'].$pool_name.'.conf',LOGLEVEL_DEBUG);
1517+
exec($php_version['php_fpm_init_script'] . ' reload');
1518+
}
1519+
}
1520+
}
1521+
}
1522+
// Reload current PHP-FPM after all others
1523+
if(!$default_php_fpm){
1524+
sleep(1);
1525+
exec($custom_php_fpm_init_script . ' reload');
1526+
}
1527+
14771528
//$reload = true;
14781529

14791530
//if($reload == true) $app->services->restartService('php-fpm','reload');
14801531
}
14811532

14821533
//* Delete the PHP-FPM pool configuration file
14831534
private function php_fpm_pool_delete ($data,$web_config) {
1484-
global $app;
1535+
global $app, $conf;
1536+
1537+
if(trim($data['old']['fastcgi_php_version']) != ''){
1538+
$default_php_fpm = false;
1539+
list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version']));
1540+
if(substr($custom_php_fpm_ini_dir,-1) != '/') $custom_php_fpm_ini_dir .= '/';
1541+
} else {
1542+
$default_php_fpm = true;
1543+
}
1544+
1545+
if($default_php_fpm){
1546+
$pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
1547+
} else {
1548+
$pool_dir = $custom_php_fpm_pool_dir;
1549+
}
14851550

1486-
$pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
14871551
if(substr($pool_dir,-1) != '/') $pool_dir .= '/';
14881552
$pool_name = 'web'.$data['old']['domain_id'];
14891553

14901554
if ( @is_file($pool_dir.$pool_name.'.conf') ) {
14911555
unlink($pool_dir.$pool_name.'.conf');
14921556
$app->log('Removed PHP-FPM config file: '.$pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
1557+
14931558
//$app->services->restartService('php-fpm','reload');
14941559
}
1560+
1561+
// delete pool in all other PHP versions
1562+
$default_pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
1563+
if(substr($default_pool_dir,-1) != '/') $default_pool_dir .= '/';
1564+
if($default_pool_dir != $pool_dir){
1565+
if ( @is_file($default_pool_dir.$pool_name.'.conf') ) {
1566+
unlink($default_pool_dir.$pool_name.'.conf');
1567+
$app->log('Removed PHP-FPM config file: '.$default_pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
1568+
exec($conf['init_scripts'] . '/' . $web_config['php_fpm_init_script'] . ' reload');
1569+
}
1570+
}
1571+
$php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$data['old']['server_id']);
1572+
if(is_array($php_versions) && !empty($php_versions)){
1573+
foreach($php_versions as $php_version){
1574+
if(substr($php_version['php_fpm_pool_dir'],-1) != '/') $php_version['php_fpm_pool_dir'] .= '/';
1575+
if($php_version['php_fpm_pool_dir'] != $pool_dir){
1576+
if ( @is_file($php_version['php_fpm_pool_dir'].$pool_name.'.conf') ) {
1577+
unlink($php_version['php_fpm_pool_dir'].$pool_name.'.conf');
1578+
$app->log('Removed PHP-FPM config file: '.$php_version['php_fpm_pool_dir'].$pool_name.'.conf',LOGLEVEL_DEBUG);
1579+
exec($php_version['php_fpm_init_script'] . ' reload');
1580+
}
1581+
}
1582+
}
1583+
}
1584+
1585+
// Reload current PHP-FPM after all others
1586+
if(!$default_php_fpm){
1587+
sleep(1);
1588+
exec($custom_php_fpm_init_script . ' reload');
1589+
}
14951590
}
14961591

14971592
function client_delete($event_name,$data) {

0 commit comments

Comments
 (0)