5

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

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

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

我的想法:

  • 每台服务器都有一个新的顶级域。user.s1.mydomain.com、user.s2.mydomain.com 等(不雅且泄露信息)
  • 运行我自己的 DNS 服务器在服务器之间路由用户(额外的故障点,不熟悉的技术)
  • 一个中央前端控制器/平衡器,将每个请求反向代理到适当的服务器(额外的故障点,潜在的有限连接)
4

1 回答 1

4

在应用程序的横向扩展时,我会使用中央前端负载均衡器。Nginx 应该处理由单个服务器动态提供的任何负载。我们有 nginx 作为 6 个动态服务器和一个静态内容服务器的前端,并且在 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;
    }
}

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

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;
    }
}

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

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

我们的设置更进一步。我们有 nginx 负载平衡器代理清漆缓存,而后者又代理动态内容服务器。

如果您担心 nginx 会出现单点故障,请设置一个辅助服务器以准备好假设前端的 IP,以防万一它发生故障。

于 2012-04-24T17:03:33.557 回答