00m.Ru
11Ноя/130

Скрипт создания виртуальных хостов Nginx + PHP-FPM

Скрипт был написан на коленке, функционала мне хватает, если кому надо, с легкостью допилят под свои нужды

Скрипт запускается из коммандной строки в режиме CLI, при запуске двух строчный хелп 🙂

# ./create_vhost.php
For using:
./create_vhost.php -d www.example.com

Что бы воспользоваться скриптом, создайте в любой директории файл в принципе можно назвать как угодно, но я рекомендую "create_vhost.php", далее поместите текст скрипта (см. ниже) в созданный файл, например копи-пастом, измените пути под свой сервер, сохраните файл, назначте права на файл chmod +x create_vhost.php и собственно запустите ./create_vhost.php. Что бы создать виртуальный хост вводим ./create_vhost.php -d www.00m.ru  далее создадутся пользователи, папки, конфиги и т.д. назначатся права на них

Важное замечание: что бы правильно создавались конфиги php-fpm создайте пустой файл "9000_t.conf" (9000 - это номер начального порта)в директории "/usr/local/etc/php-fpm.d", это нужно что бы скрипт распознал какой порт для php-fpm ему использовать, после первого создания виртуального хоста файл "9000_t.conf" можно удалить. В дальнейшем структура папки будет примерно такая:

[root@srv /home/user]# ls -l /usr/local/etc/php-fpm.d    
-rw-r--r--  1 root  wheel  690 Oct  6 18:30 9001_host1.conf
-rw-r--r--  1 root  wheel  718 Oct  6 18:30 9002_testhost1.conf
-rw-r--r--  1 root  wheel  744 Oct  6 18:30 9003_host2.conf
[root@srv /home/user]#

Скрипт написан для FreeBSD для Linux будут отличатся пути расположения конфигов и перезапуска демонов

#!/usr/local/bin/php
<?php

//nginx config dir
$nginxSA = '/usr/local/etc/nginx/sites-available';
$nginxSE = '/usr/local/etc/nginx/sites-enabled';

//php-fpm config dir
$phpfpm = '/usr/local/etc/php-fpm.d';

//WWW dir
$wwwdir = '/sites';

//Mini sendmail
$mini_sendmail = '/usr/local/bin/mini_sendmail';

//bash-static
$bash = '/usr/local/bin/bash';

///////////////////////////////////////////////////
if (PHP_SAPI != 'cli'){
die("Error, this script must be run in CLI mode.");
}
$options = getopt("d:");
if (!isset($options['d'])){
$help = '
For using:
./create_vhost.php -d www.example.com

'
;
echo $help;
die();
} else {
$domain = $options['d'];
$domain_m = str_replace('.', '', $domain);
}

$max_port = get_port();

//nginx config template
$nginx_tpl = '
server {
listen 80;
server_name '
.$domain.' www.'.$domain.';
charset utf-8;
access_log '
.$wwwdir.'/'.$domain_m.'/log/access.log;
error_log '
.$wwwdir.'/'.$domain_m.'/log/error_log debug;
root '
.$wwwdir.'/'.$domain_m.'/public;
index index.php index.html;

location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:'
.$max_port.';
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
'
;
//php-fpm config template
$phpfpm_tpl = '
['
.$domain_m.']
listen = 127.0.0.1:'
.$max_port.'
user = '
.$domain_m.'
group = '
.$domain_m.'
chroot = /sites/'
.$domain_m.'
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-'
.$domain_m.'.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
php_admin_value[doc_root] = /public
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_value[sendmail_path] = /bin/mini_sendmail -t
env[HOSTNAME] = '
.$domain.'
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
'
;

create_dir($wwwdir.'/'.$domain_m.'/public');
create_dir($wwwdir.'/'.$domain_m.'/private');
create_dir($wwwdir.'/'.$domain_m.'/backup');
create_dir($wwwdir.'/'.$domain_m.'/tmp');
create_dir($wwwdir.'/'.$domain_m.'/log');
create_dir($wwwdir.'/'.$domain_m.'/bin');

$f = fopen($nginxSA.'/'.$domain_m.'.conf', 'w');
fputs($f, $nginx_tpl);
fclose($f);
$f = fopen($phpfpm.'/'.$max_port.'_'.$domain_m.'.conf', 'w');
fputs($f, $phpfpm_tpl);
fclose($f);

shell_exec('pw group add '.$domain_m);
shell_exec('pw adduser '.$domain_m.' -g '.$domain_m.' -d /nonexistent -s /usr/sbin/nologin -c "WWW user '.$domain.'"');
shell_exec('ln '.$mini_sendmail.' '.$wwwdir.'/'.$domain_m.'/bin/mini_sendmail');
shell_exec('ln '.$nginxSA.'/'.$domain_m.'.conf '.$nginxSE.'/'.$domain_m.'.conf');
shell_exec('ln '.$bash.' '.$wwwdir.'/'.$domain_m.'/bin/sh');
shell_exec('chown -R '.$domain_m.':'.$domain_m.' '.$wwwdir.'/'.$domain_m);
shell_exec('/usr/local/etc/rc.d/nginx restart &amp;&amp; /usr/local/etc/rc.d/php-fpm restart');

function create_dir($path){
if (file_exists($path)) {
echo "Directory $path already exist.\n";
die();
} else {
if (!mkdir($path, 0775, true)) {
die('Error. Directory not created...\n');
} else {
echo "Directory $path created!\n";
}
}
}

function get_port(){
global $phpfpm;
if ($handle = opendir($phpfpm)) {
$filelist = array();
while (false !== ($entry = readdir($handle))) {
if ($entry != "." &amp;&amp; $entry != "..") {
array_push($filelist, substr($entry, 0, 4));
}
}
$max_port = max($filelist);
}
return $max_port+1;
}