Apache - 配置数百个类似站点而不指定每个站点
Apache - Configure hundreds of similar sites without specifying each one
假设我在磁盘上有这个文件夹结构:
/var/www/site1.domain.com
/var/www/site2.domain.com
/var/www/site3.domain.com
/var/www/site4.domain.com
/var/www/site5.anotherdomain.com
/var/www/site6.anotherdomain.com
/var/www/site7.anotherdomain.com
/var/www/site8.anotherdomain.com
这些都是以完全相同的方式配置的类似普通 html/css/js 网站。
是否可以在不配置数百个 <VirtualHost..>
节点的情况下将每个域的传入请求定向到适当目录的方式设置 apache?我想我可以自动生成它们,但我希望在请求的域的文件夹类型配置中仔细查看..
这可能吗?即使有可能,这种安全性或其他方面是否存在任何问题?
如果不可能,是否有其他网络技术(例如 nginx)可以做到这一点?
使用 nginx 非常简单:
location / {
root /var/www/$host;
}
此外,nginx 的速度快得惊人。如果你想坚持使用 Apache,你应该阅读这个:https://httpd.apache.org/docs/2.4/vhosts/mass.html
原来有一个 apache 模块:
sudo a2enmod vhost_alias
在此处阅读有关该模块的更多信息:
http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html
这是对我有用的配置:
#Define SNAME 999
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName domainname.com
ServerAlias *.domainname.com
VirtualDocumentRoot /var/www/domainname.com/%0
#RewriteEngine on
#This sets the variable to env:
#RewriteRule .* - [E=SNAME:%{SERVER_NAME}]
ErrorLog ${APACHE_LOG_DIR}/domainname.com.error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/domainname.com.access.log combined
</VirtualHost>
是的,存在安全和其他问题。最好每个站点有一个虚拟主机,具有单独的日志记录和单独的 SSL 证书等。
如果它们是不同的站点,最好将它们分开,因为:
- 为每个设置日志文件更容易
- 如果它们使用不同的域,则更容易为 HTTPS 配置 SSL 证书。
- 请记住,用户可以轻松修改 $host header,因此如果有一天您创建了目录:
/var/www/site1.domain.com-backup
或 /var/www/secret-logs
,则可以访问它们。
- 每个站点的监控。
- 如果有一天您需要对某些站点进行特殊配置,设置基本身份验证,更改某些参数等,您可以使用不同的虚拟主机。混合在一起会很困难和肮脏。
不如auto-generate他们。您可以使用许多模板工具,从接受环境变量上的一些参数的简单 bash 脚本到更复杂的工具,如 SaltStack / Ansible。
这里有一个简单的 bash 脚本,它应该适合您的需要:
#!/bin/bash
cat << EOF > /etc/nginx/sites-available/$SERVER_NAME.conf
server {
listen 80;
server_name $SERVER_NAME $ADDITIONAL_SERVER_NAMES;
access_log /var/log/nginx/$SERVER_NAME-access.log;
error_log /var/log/nginx/$SEVER_NAME-error.log;
location / {
root /var/www/$SERVER_NAME;
}
}
EOF
# Enable config on nginx
ln -s /etc/nginx/sites-available/$SERVER_NAME.conf /etc/nginx/sites-enabled
# Test configration and apply if no errors
nginx -t && service nginx reload
要执行名为 nginx-site-generator
的脚本,请授予执行权限并:
SERVER_NAME=site1.com ADDITIONAL_SERVER_NAMES=www.site1.com ./nginx-site-generator
假设我在磁盘上有这个文件夹结构:
/var/www/site1.domain.com
/var/www/site2.domain.com
/var/www/site3.domain.com
/var/www/site4.domain.com
/var/www/site5.anotherdomain.com
/var/www/site6.anotherdomain.com
/var/www/site7.anotherdomain.com
/var/www/site8.anotherdomain.com
这些都是以完全相同的方式配置的类似普通 html/css/js 网站。
是否可以在不配置数百个 <VirtualHost..>
节点的情况下将每个域的传入请求定向到适当目录的方式设置 apache?我想我可以自动生成它们,但我希望在请求的域的文件夹类型配置中仔细查看..
这可能吗?即使有可能,这种安全性或其他方面是否存在任何问题?
如果不可能,是否有其他网络技术(例如 nginx)可以做到这一点?
使用 nginx 非常简单:
location / {
root /var/www/$host;
}
此外,nginx 的速度快得惊人。如果你想坚持使用 Apache,你应该阅读这个:https://httpd.apache.org/docs/2.4/vhosts/mass.html
原来有一个 apache 模块:
sudo a2enmod vhost_alias
在此处阅读有关该模块的更多信息:
http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html
这是对我有用的配置:
#Define SNAME 999
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName domainname.com
ServerAlias *.domainname.com
VirtualDocumentRoot /var/www/domainname.com/%0
#RewriteEngine on
#This sets the variable to env:
#RewriteRule .* - [E=SNAME:%{SERVER_NAME}]
ErrorLog ${APACHE_LOG_DIR}/domainname.com.error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/domainname.com.access.log combined
</VirtualHost>
是的,存在安全和其他问题。最好每个站点有一个虚拟主机,具有单独的日志记录和单独的 SSL 证书等。
如果它们是不同的站点,最好将它们分开,因为:
- 为每个设置日志文件更容易
- 如果它们使用不同的域,则更容易为 HTTPS 配置 SSL 证书。
- 请记住,用户可以轻松修改 $host header,因此如果有一天您创建了目录:
/var/www/site1.domain.com-backup
或/var/www/secret-logs
,则可以访问它们。 - 每个站点的监控。
- 如果有一天您需要对某些站点进行特殊配置,设置基本身份验证,更改某些参数等,您可以使用不同的虚拟主机。混合在一起会很困难和肮脏。
不如auto-generate他们。您可以使用许多模板工具,从接受环境变量上的一些参数的简单 bash 脚本到更复杂的工具,如 SaltStack / Ansible。
这里有一个简单的 bash 脚本,它应该适合您的需要:
#!/bin/bash
cat << EOF > /etc/nginx/sites-available/$SERVER_NAME.conf
server {
listen 80;
server_name $SERVER_NAME $ADDITIONAL_SERVER_NAMES;
access_log /var/log/nginx/$SERVER_NAME-access.log;
error_log /var/log/nginx/$SEVER_NAME-error.log;
location / {
root /var/www/$SERVER_NAME;
}
}
EOF
# Enable config on nginx
ln -s /etc/nginx/sites-available/$SERVER_NAME.conf /etc/nginx/sites-enabled
# Test configration and apply if no errors
nginx -t && service nginx reload
要执行名为 nginx-site-generator
的脚本,请授予执行权限并:
SERVER_NAME=site1.com ADDITIONAL_SERVER_NAMES=www.site1.com ./nginx-site-generator