我们目前将所有内容托管在 Windows IIS 7 服务器上。我们刚刚迁移到 Azure,与许多云一样,托管 Windows 比托管 Linux 更昂贵。Azure 对虚拟机有自己的限制(与 AWS 相比),因为您实际上只能将一个公共 IP 地址绑定到 Web 服务。为了克服这一限制,并构建一些故障转移和缓存功能,我们正在将 NginX 视为负载平衡器、反向代理,将其放在我们的 IIS 服务器前面。
最近我们了解到,Apache 版 Google-Pagspeed 也可用于 NginX。根据在线教程和我们的一点经验,我们认为,通过使用 3 个独立的 NginX 服务器层(见下文),我们可以获得 NginX 的所有优势。我的问题是,如何在一个虚拟主机中做到这一点?
下面是我们现在可以设置的一个示例:
Nginx1- 该服务器位于 Nginx2 前面,执行 SSL 卸载并将静态内容缓存到其运行的 Linux 服务器上。它会将静态资源缓存到磁盘和内存中。
NginX2- 此 NginX 服务器位于 Nginx3 前面,包含适用于 NginX 的 Google Mod Pagespeed。此服务器的目标是压缩和合并脚本以及优化图像。由于这些操作可能很昂贵,因此我们将 NginX1 放在此服务器前面。
NginX3-(如果我们同时运行 3 个 NginX 实例,HA Proxy 也能正常工作)。这是在 Linux 机器上运行的最后一个 NginX 服务器。它的工作只是充当我们 IIS 场的反向代理。我们的想法是,如果我们启动另一个 IIS 服务器(目前我们只有两个),那么我们只需将其添加到此 NginX 的配置中,Nginx 就会进行负载平衡。我们仍然使用粘性会话(因为一些草率的 asp / asp.net 代码),但至少我们可以在不同的虚拟机之间划分工作负载,并通过在我们的“IIS 场”中添加一台机器(不使用 IIS 场功能)进行扩展。
- 2X IIS 服务器- 这些只是 iis 服务器(全部相同),配置了多个站点并通过 FTP 或 Git 将站点加载到它们。
问题:
- 我们是否可以放弃 3 个单独的 NginX 配置(虚拟主机),而将所有内容合并为一个?如果可以的话,任何关于如何在单个配置中为此配置 NginX 的示例都将非常棒!
- 我们如何才能实现上述目标并将 X 转发的 IP 地址传递到后端 iis 机器?
- 如果我们的 NginX 服务器发生故障,有什么建议作为后备方案吗?上面的设置是我们的单点故障。使用上述设置的两个 Linux 服务器,结合 DNS 故障转移或仅使用双 DNS 记录是否可以解决我们的 NginX 服务器发生故障的问题?
- NginX 占用多少资源?是否可以安全地假设,仅具有 768MB RAM 的 Azure 超小型“微型”实例可以处理 50-100 个并发访问者?
提前致谢!!!!!
参考:
NginX 页面速度: http://ngxpagespeed.com/ngx_pagespeed_example/
NginX 反向代理: http://www.andrewparisio.com/2011/02/how-to-create-reverse-https-failover.html
答案1
- 是的,完全可以将这些 nginx 服务器合并为一个。只需使用 proxy_pass。
- 参见 http 块中的代理设置标头
- 双 NGINX 机器(相同配置)与 DNS 循环相结合(或者在前面放置类似 AWS 负载均衡器的东西,不知道您在 Azure 上是否有类似的东西)
- 至少。您应该考虑使用 NGINX 的数千个连接。您的 IIS 可能是瓶颈。(我没有考虑 Pagespeed 处理会给此设置带来的额外负载,您必须尝试一下才能知道)
首先在你的 http 块中输入:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
upstream pagespeed {
server 127.0.0.1:8081; # weight=10 max_fails=3 fail_timeout=30s;
}
upstream iis {
server 192.168.0.100:80; weight=10 max_fails=3 fail_timeout=10s;
server 192.168.0.101:80; weight=10 max_fails=3 fail_timeout=10s;
}
然后你只需要以下服务器块(精简)
server {
listen 443; #SSL offloader
server_name example.com;
#do some ssl things here
location / {
proxy_pass http://pagespeed; #proxy to pagespeed on same nginx
}
}
server {
listen 8081;
server_name example.com;
#do some pagespeed things here
#pagespeed on
location / {
proxy_pass http://iis; # proxy to 2 backend IIS servers
}
}
在您的上游配置中使用 unix 套接字可获得更好的性能。您还可以将 pagespeed 缓存放在 Memcached 中。