一、准备内容
在本实例中,需要准备三台电脑,并且为每一台电脑分配相应的IP地址,由于IP地址在实验环境中存在差异,所以在以下的操作中,使用机器名称来确定操作的机器。
lb01: Nginx 主负载均衡器
web01: web服务器1
web02: web服务器2
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
/data/nginx/sbin/nginx -t # /data/nginx/sbin/nginx
1)将web01及web02服务器的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; } } |
mkdir /data/nginx/html/{www,bbs} echo "web01 www" >> /data/nginx/html/www/index.html echo "web01 bbs" >> /data/nginx/html/bbs/index.html
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
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服务器池,包括两个节点。
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; } } } |
/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的地址)。
问题可以通过在web01及web02中查看问题(我们需要使用第三方机器去访问lb01才行),你可以在你的第三方主机上加入lb01的域名映射,修改本机的hosts文件即可,如下列出来常用系统的hosts文件位置:
Mac os hosts位置:/private/etc/hosts
Linux hosts位置:/etc/hosts
Windows hosts位置:c:/Windows/System32/drivers/etc/hosts
# tail -f /data/nginx/logs/access_www.log
在所有准备事宜完成后,就可以进行第三方机器访问,请多刷新几次(本次刷新了6次):
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字段信息。 # 解决不记真实记录客户端的真实访问IP proxy_set_header X-Forwarded-For $remote_addr; } } } |
在lb01服务器上进行平滑重启。
# /data/nginx/sbin/nginx -s reload
web01服务器反馈的结果:
web02服务器反馈的结果: