我在创建子域后使用 cron 作业重新加载 httpd 服务。我遇到的问题是,当重新加载时,注册用户的页面会抛出服务器错误。
我想知道是否可以通过另一个 cron 任务来解决这个问题。
所以我的逻辑是:
创建 .conf 文件后,httpd 重新加载,然后将用户带回到主页的 DocumentRoot。
因此在使用中它将是:
用户注册后,会自动返回domain.com
答案1
做一个优美在 apache 上重新启动,这将允许子进程在重新加载配置之前完成当前请求。
答案2
“加载一个 php 页面...”
这是否意味着您正在尝试通过 HTTP 调用它?
从一开始这就不是一个好主意——这意味着你可能会暴露一些功能,而这些功能可能会被那些不打算访问它的人访问。
重新加载我的 httpd 服务
那么它是以 root 权限运行的?这真是个坏主意。
从您的描述来看,您似乎试图为用户提供创建自己的域的功能。更好的方法是使用通配符 vhost 定义,然后使用 mod_rewrite 将动态映射路径映射到新目录。
但如果失败,最好的方法是将其作为服务器上的 setuid root 脚本实现(内置身份验证以及网页上的身份验证)并从网页调用它。
....如果该过程是由 Web 请求启动的,那么为什么中间要使用 cron?当然,如果 cron 作业不通过 HTTP 访问 php 脚本,您将获得权限分离,但这样会使事情变得比需要的更困难,并在服务器上引入了不必要的延迟/负载。
答案3
这是解决这个问题的错误方法。
正确的方法是使用某种软件“路由器”。我实际上不是指 IP 路由器,而是指 URL 重写类型的路由器。
因此,您的应用程序会监听任何内容*.domain.com
,然后将其交给正确的用户应用程序,而不是进行那些繁琐的 apache 重新加载废话。
我最近在 Nginx 上做了类似的事情。
server_name *.domain.com
if ($host ~* "(.*)?\.?domain\.com"){
set $a $1;
rewrite ^/?$ /sites/$a/index.html last;
}
基本上,对于 domain.com 下的任何子域名,它都会映射到$DOCROOT/sites/$subdomain/index.html
因此,要添加新的子域,我所需要做的就是在 sites/“subdomain”下创建一个目录,然后就可以立即访问它。