水平扩展:在服务器之间路由用户生成的子域

map*_*ppu 5 php subdomain dns model-view-controller scalability

我维护的Web应用程序超出了单个VPS.该体系结构由大量小用户组成,每个用户都有自己的子域.用户不进行交互.加载意味着我必须将一些用户和所有新用户移动到另一台服务器上的Web应用程序的另一个安装.

目前,每个用户子域都属于同一个虚拟主机,其中单个PHP前端控制器根据主机名显示相应的内容.*.mydomain.com的单个通配符DNS记录指向当前服务器.

将不同用户子域路由到不同服务器的最佳选择是什么?

我的想法:

  • 每个服务器的新顶级域名.user.s1.mydomain.com,user.s2.mydomain.com等等(不优雅和漏洞信息)
  • 运行我自己的DNS服务器在服务器之间路由用户(额外的故障点,不熟悉的技术)
  • 中央前端控制器/平衡器,它将每个请求反向代理到适当的服务器(额外的故障点,可能是有限的连接)

Sér*_*lho 4

在扩展应用程序时,我会使用中央前端负载平衡器。Nginx 应该处理由一台服务器动态提供的任何负载。我们使用 nginx 作为六台动态服务器和一台静态内容服务器的前端,并且 nginx 不存在任何瓶颈。

在您的规模点,设置 nginx 来处理所有静态内容本身,并将动态内容反向代理到所需数量的盒子。简单代理传递的设置接近于:

upstream upstream_regular_backend {
    fair;
    server 10.0.0.1:80;
    server 10.0.0.2:80;
}

server {
    listen 0.0.0.0:80;
    server_name  example.com;
    proxy_set_header Host $host;
    proxy_set_header  X-Real-IP  $remote_addr;
    location / {
        proxy_pass http://upstream_regular_backend;
    }
}
Run Code Online (Sandbox Code Playgroud)

用于提供静态内容并传回所有其余内容,例如:

server {
    listen 0.0.0.0:80;
    server_name  example.com;
    proxy_set_header Host $host;
    proxy_set_header  X-Real-IP  $remote_addr;
    index index.php;
    root /some/dir/:
    location ~ \.php {
        proxy_pass http://upstream_regular_backend;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您不使用 PHP,请相应地调整配置。

关于上游的定义,“公平;” 将根据响应时间对后端进行负载平衡。出于缓存动机,您可能需要使用“ip_hash;” 相反,因为它将始终将来自客户端的请求发送到同一服务器上。

我们的设置有点远。我们有 nginx 负载均衡器代理清漆缓存,而清漆缓存又代理动态内容服务器。

如果您担心 nginx 会出现单点故障,请设置一个辅助服务器,准备好在前端发生故障时采用其 IP。