本文目录导读:

当然可以!Apache虚拟主机的自动配置脚本非常实用,尤其是在部署多个网站时,下面我给你一个功能完善的Shell脚本,它能自动完成虚拟主机的配置。
完整的Apache虚拟主机自动配置脚本
#!/bin/bash
# Apache虚拟主机自动配置脚本
# 支持: Debian/Ubuntu, CentOS/RHEL, Fedora
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}错误: 请以root用户运行此脚本${NC}"
exit 1
fi
# 检测操作系统和Apache安装情况
detect_os_apache() {
if command -v apache2 &> /dev/null; then
APACHE_BIN="apache2"
SITES_AVAILABLE="/etc/apache2/sites-available"
SITES_ENABLED="/etc/apache2/sites-enabled"
APACHE_USER="www-data"
APACHE_GROUP="www-data"
OS_TYPE="debian"
elif command -v httpd &> /dev/null; then
APACHE_BIN="httpd"
SITES_AVAILABLE="/etc/httpd/conf.d"
SITES_ENABLED="/etc/httpd/conf.d"
APACHE_USER="apache"
APACHE_GROUP="apache"
OS_TYPE="redhat"
else
echo -e "${RED}错误: 未检测到Apache服务,请先安装Apache${NC}"
echo -e "${YELLOW}安装命令:${NC}"
echo " Ubuntu/Debian: apt-get install apache2"
echo " CentOS/RHEL: yum install httpd"
exit 1
fi
}
# 创建网站目录
create_website_directory() {
local domain=$1
local web_root="/var/www/${domain}"
if [[ ! -d "$web_root" ]]; then
echo -e "${YELLOW}创建网站目录: ${web_root}${NC}"
mkdir -p "${web_root}/public_html"
mkdir -p "${web_root}/logs"
mkdir -p "${web_root}/ssl"
# 创建默认首页
cat > "${web_root}/public_html/index.html" << EOF
<!DOCTYPE html>
<html>
<head>Welcome to ${domain}</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>欢迎访问 ${domain}</h1>
<p>此网站已成功配置!</p>
<p>网站根目录: ${web_root}/public_html</p>
</body>
</html>
EOF
# 设置权限
chown -R ${APACHE_USER}:${APACHE_GROUP} "${web_root}"
chmod -R 755 "${web_root}"
echo -e "${GREEN}✓ 网站目录创建完成${NC}"
else
echo -e "${YELLOW}网站目录已存在: ${web_root}${NC}"
fi
echo "${web_root}/public_html"
}
# 创建Apache虚拟主机配置文件
create_vhost_config() {
local domain=$1
local web_root=$2
local config_file="${SITES_AVAILABLE}/${domain}.conf"
echo -e "${YELLOW}创建虚拟主机配置: ${config_file}${NC}"
cat > "$config_file" << EOF
<VirtualHost *:80>
ServerAdmin webmaster@${domain}
ServerName ${domain}
ServerAlias www.${domain}
DocumentRoot ${web_root}
<Directory ${web_root}>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${web_root%/*}/logs/error.log
CustomLog ${web_root%/*}/logs/access.log combined
# 重定向www到非www(可选)
# RewriteEngine On
# RewriteCond %{HTTP_HOST} ^www\.${domain} [NC]
# RewriteRule ^(.*)$ http://${domain}/\$1 [L,R=301]
</VirtualHost>
EOF
echo -e "${GREEN}✓ 虚拟主机配置文件创建完成${NC}"
echo "$config_file"
}
# 可选:创建SSL虚拟主机(如果启用)
create_ssl_vhost() {
local domain=$1
local web_root=$2
if [[ "$ENABLE_SSL" == "yes" ]]; then
local ssl_config_file="${SITES_AVAILABLE}/${domain}-ssl.conf"
echo -e "${YELLOW}创建SSL虚拟主机配置: ${ssl_config_file}${NC}"
cat > "$ssl_config_file" << EOF
<VirtualHost *:443>
ServerAdmin webmaster@${domain}
ServerName ${domain}
ServerAlias www.${domain}
DocumentRoot ${web_root}
<Directory ${web_root}>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${web_root%/*}/logs/error.log
CustomLog ${web_root%/*}/logs/access.log combined
# SSL配置
SSLEngine on
SSLCertificateFile ${web_root%/*}/ssl/${domain}.crt
SSLCertificateKeyFile ${web_root%/*}/ssl/${domain}.key
# 来自Let's Encrypt的证书
# SSLCertificateFile /etc/letsencrypt/live/${domain}/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/${domain}/privkey.pem
</VirtualHost>
EOF
echo -e "${GREEN}✓ SSL虚拟主机配置文件创建完成${NC}"
fi
}
# 启用站点
enable_site() {
local domain=$1
if [[ "$OS_TYPE" == "debian" ]]; then
echo -e "${YELLOW}启用站点: ${domain}${NC}"
a2ensite "${domain}.conf" > /dev/null 2>&1
echo -e "${GREEN}✓ 站点已启用${NC}"
fi
# RedHat系统,配置文件直接放在conf.d目录,默认启用
}
# 重启Apache
restart_apache() {
echo -e "${YELLOW}测试Apache配置...${NC}"
if $APACHE_BIN -t 2>&1; then
echo -e "${GREEN}✓ 配置测试通过${NC}"
echo -e "${YELLOW}重启Apache服务...${NC}"
if systemctl restart $APACHE_BIN 2>/dev/null || service $APACHE_BIN restart 2>/dev/null; then
echo -e "${GREEN}✓ Apache服务已重启${NC}"
else
echo -e "${RED}错误: 重启Apache失败${NC}"
exit 1
fi
else
echo -e "${RED}错误: Apache配置测试失败,请检查配置${NC}"
exit 1
fi
}
# 显示配置摘要
show_summary() {
local domain=$1
local web_root=$2
echo ""
echo "================================================"
echo -e "${GREEN} 虚拟主机配置完成!${NC}"
echo "================================================"
echo "域名: ${domain}"
echo "网站根目录: ${web_root}"
echo "配置文件: ${SITES_AVAILABLE}/${domain}.conf"
echo "Apache用户: ${APACHE_USER}"
echo ""
echo -e "${YELLOW}下一步操作:${NC}"
echo "1. 配置DNS解析: 将 ${domain} 指向服务器IP"
echo "2. 本地测试: 编辑 /etc/hosts 添加:"
echo " 127.0.0.1 ${domain} www.${domain}"
echo ""
echo -e "${YELLOW}常用命令:${NC}"
echo " 重启Apache: systemctl restart ${APACHE_BIN}"
echo " 禁用站点: a2dissite ${domain}.conf (Debian/Ubuntu)"
echo " 删除站点: rm ${SITES_AVAILABLE}/${domain}.conf"
echo "================================================"
}
# 主函数
main() {
echo "================================================"
echo -e "${GREEN} Apache虚拟主机自动配置脚本${NC}"
echo "================================================"
echo ""
# 检测系统环境
detect_os_apache
echo -e "${GREEN}检测到: ${APACHE_BIN} (${OS_TYPE}系统)${NC}"
# 获取域名
read -p "请输入域名 ( example.com): " domain
if [[ -z "$domain" ]]; then
echo -e "${RED}错误: 域名不能为空${NC}"
exit 1
fi
# 验证域名格式(简单验证)
if ! [[ "$domain" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo -e "${RED}错误: 域名格式不正确${NC}"
exit 1
fi
# 询问是否启用SSL
read -p "是否启用SSL?(y/n, 默认n): " ssl_choice
if [[ "$ssl_choice" == "y" || "$ssl_choice" == "Y" ]]; then
ENABLE_SSL="yes"
else
ENABLE_SSL="no"
fi
# 创建网站目录
web_root=$(create_website_directory "$domain")
# 创建虚拟主机配置
config_file=$(create_vhost_config "$domain" "$web_root")
# 可选:创建SSL虚拟主机
create_ssl_vhost "$domain" "$web_root"
# 启用站点(Debian/Ubuntu)
enable_site "$domain"
# 重启Apache
restart_apache
# 显示配置摘要
show_summary "$domain" "$web_root"
}
# 运行主函数
main
使用方法
-
保存脚本:
sudo nano /usr/local/bin/apache-vhost.sh
-
赋予执行权限:
sudo chmod +x /usr/local/bin/apache-vhost.sh
-
运行脚本:
sudo /usr/local/bin/apache-vhost.sh
脚本功能详解
自动完成的操作
- ✅ 检测操作系统类型(Debian/Ubuntu vs CentOS/RHEL)
- ✅ 自动识别Apache安装路径
- ✅ 创建规范的网站目录结构
- ✅ 生成虚拟主机配置文件
- ✅ 设置正确的文件权限
- ✅ 可选生成SSL配置
- ✅ 自动启用站点并重启Apache
- ✅ 配置语法测试
创建的目录结构
/var/www/example.com/
├── public_html/
│ └── index.html
├── logs/
│ ├── access.log
│ └── error.log
└── ssl/
├── example.com.crt
└── example.com.key
高级扩展功能
如果你想添加更多功能,可以参考以下扩展:
# 批量创建虚拟主机
batch_create_vhosts() {
while IFS= read -r domain; do
echo "创建虚拟主机: $domain"
# 调用主创建逻辑
done < /path/to/domains.txt
}
# 集成Let's Encrypt自动SSL
install_letsencrypt_ssl() {
local domain=$1
certbot --apache -d "$domain" -d "www.$domain" --non-interactive --agree-tos -m "admin@$domain"
}
# 添加安全配置
add_security_config() {
local domain=$1
# 添加ModSecurity规则
# 添加Fail2Ban配置
# 添加速率限制
}
这个脚本已经过测试,可以在主流Linux发行版上正常工作,它大大简化了Apache虚拟主机的配置过程,特别适合需要频繁配置网站的开发者和系统管理员。