我在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等。任何帮助都非常感谢如你所见,我不是专家!谢谢:))
答案 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)。