Nginx+DNS负载均衡实现

时间:2023-03-08 20:04:13

负载均衡有多种实现方法,nginx、apache、LVS、F5硬件、DNS等。

DNS的负载均衡就是一个域名指向多个ip地址,客户访问的时候进行轮询解析

操作方法,在域名服务商解析的DNS也可以是第三方DNS提供商 上添加多条A记录

qq.com DNS解析

Nginx+DNS负载均衡实现

参考:

http://blog.****.net/cywosp/article/details/38017027

http://www.cnblogs.com/cuihongyu3503319/archive/2012/07/09/2583129.html

dns解析的弊端:

1:无法获取解析的主机状态

2:dns一般三大运行商做了N多节点解析,修改dns后会有一定时间的延迟

Nginx的负载均衡

Nginx的负载就是多个主机之间进行负载解析

分配方式:

nginx 的 upstream目前支持 4 种方式的分配 
1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
2)、ip_hash 
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  
3)、fair(第三方) 
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。  
4)、url_hash(第三方)

配置:

在http节点里添加:

#定义负载均衡设备的 Ip及设备状态

upstream myServer {

server 127.0.0.1:9090 down; 
    server 127.0.0.1:8080 weight=2; 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; 
}

在需要使用负载的Server节点下添加

proxy_pass http://myServer;

upstream 每个设备的状态:

down 表示单前的server暂时不参与负载 
weight  默认为1.weight越大,负载的权重就越大。 
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
fail_timeout:max_fails 次失败后,暂停的时间。 
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

操作


这里我们设置的是dns解析和一台nginx的负载均衡(非两台nginx互做解析),在A主机nginx.conf之前设置不变的情况下,新增多个端口对应之前域名

我们非两台nginx互做解析是因为A配置强劲,且已经上线运行。不影响A的情况下,用B做一个当A不工作时的负载。

################  A主机原域名设置 #########################################

server {
listen ;
server_name yiiui.com;
root "E:/www/yiiui/backend/web"; location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
} server {
listen ;
server_name m.yiiui.com ;
root "E:/www/yiiui/myweb/web";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
} location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
} ################ 新增 nginx负载均衡端口域名 81 82 .... ######################################### server {
listen ;
server_name yiiui.com;
root "E:/www/yiiui/backend/web"; location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
} server {
listen ;
server_name m.yiiui.com ;
root "E:/www/yiiui/myweb/web";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
} location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}

B主机的nginx.conf中新增同A主机一样的带端口设置 (如果为内网局域网先设置hosts)

server {
listen ;
server_name yiiui.com;
root "C:/www/yiiui/backend/web"; location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
} server {
listen ;
server_name m.yiiui.com;
root "C:/www/yiiui/myweb/web"; location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?r=$ last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}

设置B主机的负载域名:

upstream yiiui.com{
server 127.0.0.1:; #这里是你自己要做负载均衡的服务器地址1 # 本地windows可以,外网linux 要用局域网的IP
server 192.168.2.101:; #这里是要参与负载均衡的地址2
} upstream m.yiiui.com{
server 127.0.0.1: weight=; #这里是你自己要做负载均衡的服务器地址1
server 192.168.2.101: weight=; #这里是要参与负载均衡的地址2
} server {
listen ;
server_name yiiui.com; #设置所有web服务器负载的共同域名
location / {
proxy_pass http://yiiui.com; #确定需要代理的URL,端口或socket。
proxy_set_header Host $host;
}
} server {
listen ;
server_name m.yiiui.com; #设置所有web服务器负载的共同域名
location / {
proxy_pass http://m.yiiui.com; #确定需要代理的URL,端口或socket。
proxy_set_header Host $host;
}
}

Nginx+DNS负载均衡实现

参考:

http://www.cnblogs.com/xiaogangqq123/archive/2011/03/04/1971002.html

http://825536458.blog.51cto.com/4417836/1784794

http://baidutech.blog.51cto.com/4114344/1033718/

设置nginx的负载均衡后的session同步登录状态问题

必须要将A、B主机的session指向一个地方才能使访问的域名当前登录的状态一致。可以使用mysql、memcache进行会话存储

windows的memcached 同时运行局域网ip访问

Nginx+DNS负载均衡实现

Yii2 的设置:

# 设置session保存在mysql中
'session' => [
'class' => 'yii\web\DbSession',
// Set the following if you want to use DB component other than
// default 'db'.
// 'db' => 'mydb',
// To override default session table, set the following
// 'sessionTable' => 'my_session',
],

参考:

http://wiki.jikexueyuan.com/project/yii-2.0-guide/tutorial-performance-tuning.html

http://blog.sina.com.cn/s/blog_8a18c33d01013rp9.html

注:memcache存储会话时,重启、重启操作系统会导致全部数据消失。内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。