关于php:困境:实时创建虚拟主机还是使用crontab?

Dilemma: realtime create virtual hosts or with a crontab?

我正在开发一个主机托管控制面板与代码点火器。到现在为止,一直都还不错。:)

现在我正在研究一个创建虚拟主机的解决方案。创建虚拟主机的shell脚本可以工作,所以我的第一个想法是每隔15分钟在cronjob中启动该脚本。那应该管用。

但不是每15分钟就有一个新的虚拟主机要创建。所以,我认为每15分钟重新加载Apache配置非常重要。

顺便说一句,在CodeIgniter方面,它只是生成一个简单的文本文件,其中包含该新虚拟主机所属的值。

那么,是否有一个节省的解决方案来实时进行呢?我的猜测是,这是实时使用shell_exec()的唯一方法,但这不是一种节省方法。

我必须说我的shell scipting非常新手,所以可能有一种方法可以触发if或else语句来选择创建虚拟主机或什么都不做。但我该怎么做呢?那我就不需要实时做了。

这是我的shell脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
vhroot='/etc/apache2/sites-available/'
NEW_DOMAINS="/home/domain.txt"

cat ${NEW_DOMAINS} | \

while read domain user email
do

echo"<VirtualHost *:80>
  ServerName "
$domain"
  ServerAlias www."
$domain"
  ServerAdmin"
$email"
  DocumentRoot /home/"
$user"/domains/"$domain"/public_html
</VirtualHost>"
> $vhroot/$domain

#mkdir /home/$user/domains/domain
#mkdir /home/$user/domains/$domain/public_html
#chown -R $user.$user /home/$user/domains/$domain

echo"111.21.111.111       $domain">> host.txt
#a2ensite $hostname
done

echo""> /home/domain.txt

# /etc/init.d/apache2 reload

我希望有人能为这个问题找到一个简单但有效的解决办法。


非常有用。我做了一个新版本的脚本,它也删除了vhost,查找另一个.txt文件。文档根文件夹存储在/var/www/html/websites中。根据需要进行更改。脚本还检查变量$DOMAIN是否为空,以确保脚本不会在域名出错时运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/bin/bash
vhroot='/etc/apache2/sites-available/'
NEW_DOMAINS="adddomain.txt"
has_new_domains=false #No new domains by default = do not reload the apache config.

cat ${NEW_DOMAINS} | \

while read domain
do
  if [ ! -z"$domain" ];
  then
      has_new_domains=true #true = at least one new domain = reload apache config
     echo"<VirtualHost *:80>
      ServerName "
$domain"
      ServerAlias www."
$domain"
      ServerAdmin postmaster@"
$domain"
      DocumentRoot /var/www/html/websites/"
$domain"
      </VirtualHost>"
> $vhroot/"$domain".conf #.conf extension needed to make a2ensite work in apache -debian
     mkdir /var/www/html/websites/
      mkdir /var/www/html/websites/$domain
      chown -R root:www-data /var/www/html/websites
      chmod -R 755 /var/www/html/websites

      #create index.html file
     echo"<!DOCTYPE html>
      <html>
      <head>
      Welcome to nginx on Debian!
      <style>
        body {
            width: 35em;
            margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
        }
      </style>
      </head>
      <body>
      Welcome to"
$domain"
      <p>
If you see this page, the Apache web server is successfully installed and working.
</p>

      <p>

      You can start building your website
     
</p>

      </body> </html>"
>/var/www/html/websites/$domain/index.html
      #echo"111.21.111.111       $domain">> host.txt
     a2ensite"$domain".conf
    else echo 'No new domains'
    fi
done

> adddomain.txt # with echo"" an empty line is still present in file
DEL_DOMAINS="deldomain.txt"
cat ${DEL_DOMAINS} | \

while read deldomain
do
  has_new_domains=true #true = at least one new domain = reload apache config
 #Make sure we don't delete all parent directory , in case variable is empty
 if [ ! -z"$deldomain" ]; then
      a2dissite"$deldomain".conf
      echo"dominio"$deldomain" eliminado"
      rm -r /var/www/html/websites/$deldomain
      rm $vhroot/"$deldomain".conf
  fi
done
> deldomain.txt
if $has_new_domains ; then #only reload the apache config if there is at least one new domain
   /etc/init.d/apache2 reload
fi

您可以向脚本中添加一个bool变量,并且仅在添加了新的vhost时重新启动Web服务器。

未经测试的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
vhroot='/etc/apache2/sites-available/'
NEW_DOMAINS="/home/domain.txt"
has_new_domains=false #No new domains by default = do not reload the apache config.

cat ${NEW_DOMAINS} | \

while read domain user email
do
  has_new_domains=true #true = at least one new domain = reload apache config
 echo"<VirtualHost *:80>
  ServerName "
$domain"
  ServerAlias www."
$domain"
  ServerAdmin"
$email"
  DocumentRoot /home/"
$user"/domains/"$domain"/public_html
</VirtualHost>"
> $vhroot/$domain

  #mkdir /home/$user/domains/domain
 #mkdir /home/$user/domains/$domain/public_html
 #chown -R $user.$user /home/$user/domains/$domain

  echo"111.21.111.111       $domain">> host.txt
  #a2ensite $hostname
done

echo""> /home/domain.txt

if $has_new_domains ; then #only reload the apache config if there is at least one new domain
 /etc/init.d/apache2 reload
fi

顺便说一句:我希望$user$domain中的所有东西都是安全的,不能用来将vhost以外的东西注入配置中。:)