Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache—配置数百个类似的站点,而不指定每个站点_Apache_Virtualhost - Fatal编程技术网

Apache—配置数百个类似的站点,而不指定每个站点

Apache—配置数百个类似的站点,而不指定每个站点,apache,virtualhost,Apache,Virtualhost,假设磁盘上有以下文件夹结构: /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

假设磁盘上有以下文件夹结构:

/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网站

是否可以将apache设置为每个域的传入请求都指向相应的目录,而无需配置数百个
节点?我想我可以自动生成它们,但我希望在请求的域文件夹中有一个奇特的go外观,类似于配置

这可能吗?即使有可能,是否存在与此安全性或其他方面相关的问题


如果不可能,是否有其他类似nginx的web技术可以做到这一点?

使用nginx非常简单:

location / {
    root /var/www/$host;
}

另外,nginx速度非常快。如果您希望继续使用Apache,您应该阅读以下内容:

使用nginx非常简单:

location / {
    root /var/www/$host;
}

另外,nginx速度非常快。但是,如果您希望坚持使用Apache,您应该阅读以下内容:

,因此有一个Apache模块用于此:

sudo a2enmod vhost_alias
请在此处阅读有关该模块的更多信息:

以下是对我有效的配置:

#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>
#定义SNAME 999
服务器管理员webmaster@localhost
ServerName域名.com
ServerAlias*.domainname.com
VirtualDocumentRoot/var/www/domainname.com/%0
#重新启动发动机
#这会将变量设置为env:
#重写规则。*-[E=SNAME:%{SERVER\u NAME}]
ErrorLog${APACHE_LOG_DIR}/domainname.com.error.LOG
#可能的值包括:调试、信息、通知、警告、错误、临界值、,
#警惕,埃默格。
日志级调试
CustomLog${APACHE\u LOG\u DIR}/domainname.com.access.LOG合并

因此,事实证明有一个apache模块用于此:

sudo a2enmod vhost_alias
请在此处阅读有关该模块的更多信息:

以下是对我有效的配置:

#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>
#定义SNAME 999
服务器管理员webmaster@localhost
ServerName域名.com
ServerAlias*.domainname.com
VirtualDocumentRoot/var/www/domainname.com/%0
#重新启动发动机
#这会将变量设置为env:
#重写规则。*-[E=SNAME:%{SERVER\u NAME}]
ErrorLog${APACHE_LOG_DIR}/domainname.com.error.LOG
#可能的值包括:调试、信息、通知、警告、错误、临界值、,
#警惕,埃默格。
日志级调试
CustomLog${APACHE\u LOG\u DIR}/domainname.com.access.LOG合并

是的,存在安全和其他问题。最好每个站点有一个virtualhost,并具有单独的日志记录和单独的SSL证书等

如果它们是不同的站点,最好将它们分开,因为:

  • 为每个日志文件设置日志文件更容易
  • 如果HTTPS使用不同的域,则更容易为其配置SSL证书
  • 请记住,用户可以轻松地修改$host头,这样,如果有一天您创建目录:
    /var/www/site1.domain.com backup
    /var/www/secret logs
    ,就可以访问它们
  • 每个站点的监控
  • 如果有一天你需要一些站点的特殊配置,设置一个基本的身份验证,更改一些参数等等。你可以使用不同的虚拟主机。把它们混在一起会很困难,也很肮脏
最好是自动生成它们。您可以使用许多模板工具,从一个简单的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

是的,还有安全和其他问题。最好每个站点有一个virtualhost,并具有单独的日志记录和单独的SSL证书等

如果它们是不同的站点,最好将它们分开,因为:

  • 为每个日志文件设置日志文件更容易
  • 如果HTTPS使用不同的域,则更容易为其配置SSL证书
  • 请记住,用户可以轻松地修改$host头,这样,如果有一天您创建目录:
    /var/www/site1.domain.com backup
    /var/www/secret logs
    ,就可以访问它们
  • 每个站点的监控
  • 如果有一天你需要一些站点的特殊配置,设置一个基本的身份验证,更改一些参数等等。你可以使用不同的虚拟主机。把它们混在一起会很困难,也很肮脏
最好是自动生成它们。您可以使用许多模板工具,从一个简单的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
也许对你来说很简单?:)我试图创建一个新站点,只需添加一个包含正确文件的新目录(可能对您来说很简单?:)我试图通过添加一个包含正确文件的新目录来创建一个新站点