具有多个域的服务器上的Nginx负载平衡

时间:2014-06-10 14:58:26

标签: apache nginx load-balancing

我在Google上没有看到任何与此主题相关的内容,因为我是Nginx的新手,我想问一个关于负载平衡的问题:我有一个专用服务器,目前运行Apache有多个帐户和域。我想切换到Nginx并仅为其中一个域(mydomain1.com)设置负载平衡,以便在此专用服务器和另外3个服务器之间进行负载均衡。我的专用服务器上有以下Nginx配置(/etc/nginx/conf.d/default.conf):

upstream mywebsite1  {
  ip_hash;
  server xxx.xxx.xxx.196 weight=1 max_fails=3 fail_timeout=15s;
  server xxx.xxx.xxx.67 weight=1 max_fails=3 fail_timeout=15s;
  server xxx.xxx.xxx.201 weight=1 max_fails=3 fail_timeout=15s;
}

server {
    listen       80;
    server_name  mywebsite1.com;

    access_log /var/log/nginx/proxy.log;

    location / {
        proxy_pass http://mywebsite1;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

}

但是这不起作用,当我读到proxy.log时,不仅可以平衡来自mywebsite1.com的流量,还可以平衡我的其他域名:mywebsite2.com,mywebsite3.com等。任何帮助都非常感谢如你所见,我不是专家!谢谢:))

2 个答案:

答案 0 :(得分:1)

我知道这是一个古老的问题,但这仍然可以帮助某个人。

要使其按需运行,必须至少定义两个虚拟主机(服务器块)。

第一个即所谓的“默认”-即它可以提供任何其他虚拟主机中未定义的内容。 nginx上下文中的默认值意味着定义:

server_name _;

您可以将index.html添加到该虚拟主机,以告诉访问者转到正确的位置。显示某种错误消息。或在没有任何消息的情况下将访问者重定向到正确的位置-满足您的目的。 但是,如果您希望其他虚拟主机块仅服务特定域而不提供其他服务,则需要某种默认设置。

第二个是“ mywebsite1.com”-仅服务于该特定域。您对该域的配置是正确的。您可以为不同的域添加更多的虚拟主机块。

如果您只有一个虚拟主机(即使它不是“默认”类型),那么无论域名是否匹配,每个HTTP请求都将转到该虚拟主机。

请记住,除非要让每个虚拟主机都提供相同的内容,否则应为每个虚拟主机定义不同的根路径。

root /some/path;

通过 server_name 指令定义了虚拟主机的域。 “ _”表示默认值,并提供与其他虚拟主机不匹配的任何内容。

如果要让virtualhost块提供多个域,则可以定义多个域(如果要使两个域都起作用,请不要忘记添加带有和不带有www的域):

server_name www.example.com example.com some.other.domain.com;

您还可以使用通配符:

server_name *.example.com;

因此正确的配置文件应如下所示:

# default virtualhost to serve everything that does not match other virtualhosts
server {
    listen       80;
    server_name  _;

    root /some/path/default_site;

    # add other rules for default site
}

# virtualhost to server only (www.)mywebsite1.com
server {
    listen       80;

    # please note that you need to add both with and without "www." if you want both to work.
    server_name  mywebsite1.com www.mywebsite1.com;

    root /some/path/mywebsite1.com;

    # add other rules for mywebsite1.com

}

# virtualhost for example.com (without www)
server {
    listen       80;

    server_name  example.com;

    root /some/path/example.com;

    # add other rules for example.com

}

答案 1 :(得分:0)

如果您将所有流量发送到Nginx服务器,则必须对其执行某些操作。由于您只有一个服务器块,因此无论服务器名称配置为什么,都将占用所有主机名的流量。

如果您不希望Nginx处理您所有域的流量,只需不要指向您的所有域(使用DNS)。