轮询负载实战

轮询负载实战

  • 最近更新2023年06月12日

一、准备内容

在本实例中,需要准备三台电脑,并且为每一台电脑分配相应的IP地址,由于IP地址在实验环境中存在差异,所以在以下的操作中,使用机器名称来确定操作的机器。

lb01: Nginx 主负载均衡器

web01: web服务器1

web02: web服务器2

二、编译安装Nginx

1)安装必要的工具集

yum install wget vim gcc –y

2)安装依赖包集合

yum install openssl openssl-devel pcre pcre-devel -y

3)下载nginx

mkdir /home/tools
cd /home/tools
wget http://nginx.org/download/nginx-1.6.3.tar.gz

4)创建管理用户

useradd nginx -s /sbin/nologin -M

5)解压并安装

tar -zxvf nginx-1.6.3.tar.gz
cd nginx-1.6.3
./configure --user=nginx --group=nginx --prefix=/data/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /data/nginx-1.6.3/ /data/nginx

6)测试Nginx是否安装成功

/data/nginx/sbin/nginx -t
# /data/nginx/sbin/nginx

三、Web端Nginx配置管理

1)将web01web02服务器的Nginx的配置文件进行如下修改。

vi /data/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}

http {

include mime.types;

default_type application/octet-stream;

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” “$http_x_forwarded_for”‘;

sendfile on;

keepalive_timeout 65;

server {

listen 80;

server_name bbs.ls.com; # 此处为自定义的域名

location / {

root html/bbs;

index index.html index.htm;

}

    access_log logs/access_bbs.log main;

}

server {

listen 80;

server_name www.ls.com; # 此处为自定义的域名

location / {

root html/www;

index index.html index.htm;

}

    access_log logs/access_www.log main;

}

}

2)在web01服务器上建立测试目录及文件

mkdir /data/nginx/html/{www,bbs}
echo "web01 www" >> /data/nginx/html/www/index.html
echo "web01 bbs" >> /data/nginx/html/bbs/index.html

# curl 127.0.0.1

3)在web02服务器上建立测试目录及文件

mkdir /data/nginx/html/{www,bbs}
echo "web02 www" >> /data/nginx/html/www/index.html
echo "web02 bbs" >> /data/nginx/html/bbs/index.html
curl 127.0.0.1

四、负载端Nginx配置管理

1)将lb01服务器的Nginx的配置文件进行如下修改。

vi /data/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# WEB服务器池,包括两个节点。


upstream www_server_pools {

    server 10.70.21.87:80 weight=1; # 此处为web01的IP地址

    server 10.70.21.60:80 weight=1; # 此处为web02的IP地址

}

# 定义负载虚拟主机

server {

listen 80;

server_name www.ls.com;

location / {

# 代理请求发送到服务器池中

proxy_pass http://www_server_pools;

    }

}

}

2)将lb01服务器上进行平滑重启。

/data/nginx/sbin/nginx -s reload

3)将lb01服务器上测试负载(10.70.21.101为lb01服务器的地址)

echo "10.70.21.101 www.ls.com" >> /etc/hosts
echo "10.70.21.101 bbs.ls.com" >> /etc/hosts
curl www.ls.com
curl bbs.ls.com

五、负载端Nginx问题处理

1)不管访问”www.ls.com”还是”bbs.ls.com”,服务器返回的都是web01或web02的bbs站点信息,我们所需要的是通过域名,访问到指定网站目录下。

我们需要做的是在发送的http请求中,加入host主机信息,只要更改Nginx的配置文件即可(在”localtion /”中加入”proxy_set_header Host $host”即可)。

# vi /data/nginx/conf/nginx.conf

worker_processes 1;
events {
worker_connections 1024;
}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# WEB服务器池,包括两个节点。

upstream www_server_pools {

    server 10.70.21.87:80 weight=1; # 此处为web01的IP地址

    server 10.70.21.60:80 weight=1; # 此处为web02的IP地址

}

# 定义负载虚拟主机

server {

listen 80;

server_name www.ls.com;

location / {

# 代理请求发送到服务器池中

proxy_pass http://www_server_pools;

     # 解决访问时,不能返回指定的虚拟主机。

     # 在代理向后端发送数据时,带上host字段信息。

     proxy_set_header Host $host;

    }

}

}

lb01服务器上进行平滑重启。

# /data/nginx/sbin/nginx -s reload

2)web端不能获得终端用户的IP地址,只能获得反向代理服务器的IP地址(即可能获得lb01的地址)。

问题可以通过在web01web02中查看问题(我们需要使用第三方机器去访问lb01才行),你可以在你的第三方主机上加入lb01的域名映射,修改本机的hosts文件即可,如下列出来常用系统的hosts文件位置:

Mac os hosts位置:/private/etc/hosts

Linux hosts位置:/etc/hosts

Windows hosts位置:c:/Windows/System32/drivers/etc/hosts

web01web02服务器中同时执行如下命令进行查看:

# tail -f /data/nginx/logs/access_www.log

在所有准备事宜完成后,就可以进行第三方机器访问,请多刷新几次(本次刷新了6次):

web01服务器反馈的结果:

web02服务器反馈结果:

我们需要做的是在反向代理请求头中,增加获取客户端的IP字段信息,并显示在”-“处。

# vi /data/nginx/conf/nginx.conf

worker_processes 1;
events {
worker_connections 1024;
}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# WEB服务器池,包括两个节点。

upstream www_server_pools {

    server 10.70.21.87:80 weight=1; # 此处为web01的IP地址

    server 10.70.21.60:80 weight=1; # 此处为web02的IP地址

}

# 定义负载虚拟主机

server {

listen 80;

server_name www.ls.com;

location / {

# 代理请求发送到服务器池中

proxy_pass http://www_server_pools;

     # 解决访问时,不能返回指定的虚拟主机。

     # 在代理向后端发送数据时,带上host字段信息。

    
proxy_set_header Host $host;

     # 解决不记真实记录客户端的真实访问IP

     proxy_set_header X-Forwarded-For $remote_addr;

    }

}

}

lb01服务器上进行平滑重启。

# /data/nginx/sbin/nginx -s reload

web01服务器反馈的结果:

web02服务器反馈的结果:


分享到 :
相关推荐

发表回复

登录... 后才能评论