1

我正在开发一个带有 codeigniter 的虚拟主机托管控制面板。到目前为止,一切都很好。:)

现在我正在研究创建虚拟主机的解决方案。我创建虚拟主机的 shell 脚本有效,所以我的第一个想法是在 cronjob 中触发该脚本,假设每 15 分钟一次。那应该行得通。

但并不是每 15 分钟就不会创建一个新的虚拟主机。所以,我认为每 15 分钟重新加载一次 apache 配置实在是太过分了。

顺便说一句,在 codeigniter 端,它只是使用该新虚拟主机所属的值创建一个简单的文本文件。

那么,是否有实时保存的解决方案?我的猜测是,这是实时使用 shell_exec() 的唯一方法,但这不是一种保存方法。

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

这是我的 shell 脚本:

#!/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

我希望有人对这个问题有一个简单但有效的解决方案。

4

2 回答 2

2

您可以只在脚本中添加一个bool 变量,并且只有在添加了新的虚拟主机时才重新启动网络服务器。

未经测试:

#!/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不能用于将除您的虚拟主机之外的其他内容注入配置中。:)

于 2013-01-05T11:42:47.150 回答
2

很有用。我制作了一个新版本的脚本,它也删除了虚拟主机,查看了另一个 .txt 文件。文档根文件夹存储在 /var/www/html/websites 中。根据您的需要更改它。该脚本还检查变量 $domain 是否为空,以确保脚本不会运行,以防域名出现问题

#!/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>
      <title>Welcome to nginx on Debian!</title>
      <style>
        body {
            width: 35em;
            margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
        }
      </style>
      </head>
      <body>
      <h1>Welcome to "$domain"</h1>
      <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
于 2016-08-11T16:22:19.197 回答