Centos7+Nginx负载均衡(Load Balance)配置详情介绍
Centos7+Nginx负载均衡(Load Balance)配置详情介绍
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,Nginx就是其中的一个,在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略),当然现在主流的公有云(Windows Azure)提供的服务在均衡分配方式基本上都类似于Nginx的轮询(round robin)分配方式和加权轮询(Weight round robin)分配方式,对于其他公有云产品没有具体试验过,所以我们今天主要介绍一下Nginx下的几种分配方式,具体见下:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstreamserver_pool{ serverweight=10; serverweight=10; }
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:
upstreamserver_pool{ ip_hash; server:80; server:80; }
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstreamserver_pool{ server:80; server:80; fair; }
注意:整个分配方式是通过修改定义负载均衡的server配置中添加的。
我们今天主要介绍我个人认为使用最多的几种方式吧;前面四种。
我们后端使用两台Apache服务作为WEB服务,具体安装就不多介绍了。
Yuminstallhttpd
查看httpd 版本
rpm-qa|grephttpd
接下来我们首先要为apache定义一个 默认的页面,方便区分;我们为了后面的数据统计所以页面内容显示的比较少
Vim/var/www/httml/ </html> <!DOCTYPEhtml> <html> <head> <title>WelcometoApache</title> <style> body{ 35em; margin:0auto; font-family:Tahoma,Verdana,Arial,sans-serif; } </style> <styletype="text/css"> h1{color:red} h2{color:blue} h3{color:green} h4{color:yellow} } </style> </head><bodybgcolor='7D7DFF'> <h2>HostName:A-S----->IP:</h2> </body> </html>
保存退出,启动服务
Systemctlstarthttpd
然后添加默认的防火墙端口8o
Firewall-cmd--zone=public--add-port='80/tcp'--permanent 或者vim/etc/firewalld/zone/ 添加一下格式 <portportocal='tcp'port='80'>
我们测试访问
我们准备第二台WEB服务()我们按照第一台的方式进行配置,再次就跳过了。
第二台主机的配置: 主机名 B-S
安装好httpd后,我们将a-s上的index拷贝到b-s服务器上
scproot@:/var/www/html/
我们为了后面的测试,我们将两台服务器的显示内容修改一下,为了通过服务进行批量测试。
将两台Apache WEB服务的文件只显示服务器的名称及IP地址。
接下来我们就部署Nginx,在Centos7上yum安装需要定义yum源
cd/etc/ vim 添加以下内容 [epel] name=aliyunepel baseurl=/epel/7Server/x86_64/ gpgcheck=0
YuminstallNginx Nginx
启动服务
systemctlstartNginx
我们首先查看默认的配置文件
#usernobody; worker_processes1; #error_loglogs/; #error_loglogs/notice; #error_loglogs/info; #pidlogs/; events{ worker_connections1024; } http{ include; default_typeapplication/octet-stream; #log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' #'$status$body_bytes_sent"$http_referer"' #'"$http_user_agent""$http_x_forwarded_for"'; #access_loglogs/main; sendfileon; #tcp_nopushon; #keepalive_timeout0; keepalive_timeout65; #gzipon; server{ listen80; server_namelocalhost; #charsetkoi8-r; #access_loglogs/main; location/{ roothtml; index; } #error_page404/; #redirectservererrorpagestothestaticpage/ # error_page500502503504/; location=/{ roothtml; } #proxythePHPscriptstoApachelisteningon:80 # #location~\.PHP${ #proxy_pass; #} #passthePHPscriptstoFastCGIserverlisteningon:9000 # #location~\.PHP${ #roothtml; #fastcgi_pass:9000; #fastcgi_index; #fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name; #includefastcgi_params; #} #denyaccessto.htaccessfiles,ifApache'sdocumentroot #concurswithNginx'sone # #location~/\.ht{ #denyall; #} } #anothervirtualhostusingmixofIP-,name-,andport-basedconfiguration # #server{ #listen8000; #listensomename:8080; #server_namesomenamealias; #location/{ #roothtml; #index; #} #} #HTTPSserver # #server{ #listen443ssl; #server_namelocalhost; #ssl_certificate; #ssl_certificate_key; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout5m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; #location/{ #roothtml; #index; #} #} }
然后我们需要修改默认配置
upstream{ server:80; server:80; }
我们首先配置轮询的方式
#Formoreinformationonconfiguration,see: #*OfficialEnglishDocumentation:/en/docs/ #*OfficialRussianDocumentation:/ru/docs/ userNginx; worker_processesauto; error_log/var/log/Nginx/; pid/run/; #Loaddynamicmodules.See/usr/share/Nginx/. include/usr/share/Nginx/modules/*.conf; events{ worker_connections1024; } http{ log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/Nginx/main; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout65; types_hash_max_size2048; include/etc/Nginx/; default_typeapplication/octet-stream; #增加后端服务器的负载方式,我们默认使用轮询 upstream{ server:80; server:80; } #Loadmodularconfigurationfilesfromthe/etc/Nginx/directory. #See/en/docs/ngx_core_#include #formoreinformation. include/etc/Nginx//*.conf; server{ #listen80default_server; #listen[::]:80default_server; #server_name_; listen80; server_name; root/usr/share/Nginx/html; #Loadconfigurationfilesforthedefaultserverblock. include/etc/Nginx//*.conf; #增加的服务器配置 location/{ proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_pass; } error_page404/; location=/{ } error_page500502503504/; location=/{ } } #SettingsforaTLSenabledserver. # #server{ #listen443sslhttp2default_server; #listen[::]:443sslhttp2default_server; #server_name_; #root/usr/share/Nginx/html; # #ssl_certificate"/etc/pki/Nginx/"; #ssl_certificate_key"/etc/pki/Nginx/private/"; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout10m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; # ##Loadconfigurationfilesforthedefaultserverblock. #include/etc/Nginx//*.conf; # #location/{ #} # #error_page404/; #location=/{ #} # #error_page500502503504/; #location=/{ #} #} }
保存会重启服务
SystemcrestartNginx
然后测试访问,访问结果基本上都是一个后端服务器分配一次
我们使用以下命令执行十次
foriin$(seq10);docurl;done [root@bogonNginx]#foriin$(seq10);docurl;done HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP:
接下来我们配置加权轮询分配方式
我们只修改一下部分
upstream{ server:80weight=10max_fails=2fail_timeout=30s; server:80weight=5max_fails=2fail_timeout=30s; } #供proxy_pass和fastcgi_pass指令中使用的代理服务器 #后台如果有动态应用的时候,ip_hash指令可以通过hash算法 #将客户端请求定位到同一台后端服务器上,解决session共享,#但建议用动态应用做session共享 #server用于指定一个后端服务器的名称和参数 #weight代表权,重默认为1,权重越高被分配的客户端越多 #max_fails指定时间内对后端请求失败的次数 #fail_timeout达到max_fails指定的失败次数后暂停的时间 #down参数用来标记为离线,不参与负载均衡.在ip_hash下使用 #backup仅仅在非backup服务器宕机或繁忙的时候使用
#Formoreinformationonconfiguration,see: #*OfficialEnglishDocumentation:/en/docs/ #*OfficialRussianDocumentation:/ru/docs/ userNginx; worker_processesauto; error_log/var/log/Nginx/; pid/run/; #Loaddynamicmodules.See/usr/share/Nginx/. include/usr/share/Nginx/modules/*.conf; events{ worker_connections1024; } http{ log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/Nginx/main; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout65; types_hash_max_size2048; include/etc/Nginx/; default_typeapplication/octet-stream; #增加后端服务器的负载方式,我们默认使用轮询 upstream{ server:80weight=10max_fails=2fail_timeout=30s; server:80weight=5max_fails=2fail_timeout=30s; } #供proxy_pass和fastcgi_pass指令中使用的代理服务器 #后台如果有动态应用的时候,不参与负载均衡.在ip_hash下使用 #backup仅仅在非backup服务器宕机或繁忙的时候使用 #Loadmodularconfigurationfilesfromthe/etc/Nginx/directory. #See/en/docs/ngx_core_#include #formoreinformation. include/etc/Nginx//*.conf; server{ #listen80default_server; #listen[::]:80default_server; #server_name_; listen80; server_name; root/usr/share/Nginx/html; #Loadconfigurationfilesforthedefaultserverblock. include/etc/Nginx//*.conf; location/{ proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_pass; } error_page404/; location=/{ } error_page500502503504/; location=/{ } } #SettingsforaTLSenabledserver. # #server{ #listen443sslhttp2default_server; #listen[::]:443sslhttp2default_server; #server_name_; #root/usr/share/Nginx/html; # #ssl_certificate"/etc/pki/Nginx/"; #ssl_certificate_key"/etc/pki/Nginx/private/"; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout10m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; # ##Loadconfigurationfilesforthedefaultserverblock. #include/etc/Nginx//*.conf; # #location/{ #} # #error_page404/; #location=/{ #} # #error_page500502503504/; #location=/{ #} #} }
我们重启进行测试
[root@bogonNginx]#foriin$(seq10);docurl;done HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:B-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP:
接下来我们测试第三种,ip_hash;每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决的问题。
我们只修改server部分
upstream{ ip_hash; server:80; server:80; }
#Formoreinformationonconfiguration,see: #*OfficialEnglishDocumentation:/en/docs/ #*OfficialRussianDocumentation:/ru/docs/ userNginx; worker_processesauto; error_log/var/log/Nginx/; pid/run/; #Loaddynamicmodules.See/usr/share/Nginx/. include/usr/share/Nginx/modules/*.conf; events{ worker_connections1024; } http{ log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/Nginx/main; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout65; types_hash_max_size2048; include/etc/Nginx/; default_typeapplication/octet-stream; #增加后端服务器的负载方式,我们默认使用轮询 upstream{ ip_hash; server:80; server:80; } #供proxy_pass和fastcgi_pass指令中使用的代理服务器 #后台如果有动态应用的时候,不参与负载均衡.在ip_hash下使用 #backup仅仅在非backup服务器宕机或繁忙的时候使用 #Loadmodularconfigurationfilesfromthe/etc/Nginx/directory. #See/en/docs/ngx_core_#include #formoreinformation. include/etc/Nginx//*.conf; server{ #listen80default_server; #listen[::]:80default_server; #server_name_; listen80; server_name; root/usr/share/Nginx/html; #Loadconfigurationfilesforthedefaultserverblock. include/etc/Nginx//*.conf; location/{ proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_pass; } error_page404/; location=/{ } error_page500502503504/; location=/{ } } #SettingsforaTLSenabledserver. # #server{ #listen443sslhttp2default_server; #listen[::]:443sslhttp2default_server; #server_name_; #root/usr/share/Nginx/html; # #ssl_certificate"/etc/pki/Nginx/"; #ssl_certificate_key"/etc/pki/Nginx/private/"; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout10m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; # ##Loadconfigurationfilesforthedefaultserverblock. #include/etc/Nginx//*.conf; # #location/{ #} # #error_page404/; #location=/{ #} # #error_page500502503504/; #location=/{ #} #} }
保存退出后,我们测试
[root@bogonNginx]#foriin$(seq10);docurl;done HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP: HostName:A-S----->IP:
最后我们介绍一下fairl
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream{ server:80; server:80; fair; }
#Formoreinformationonconfiguration,see: #*OfficialEnglishDocumentation:/en/docs/ #*OfficialRussianDocumentation:/ru/docs/ userNginx; worker_processesauto; error_log/var/log/Nginx/; pid/run/; #Loaddynamicmodules.See/usr/share/Nginx/. include/usr/share/Nginx/modules/*.conf; events{ worker_connections1024; } http{ log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/Nginx/main; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout65; types_hash_max_size2048; include/etc/Nginx/; default_typeapplication/octet-stream; #增加后端服务器的负载方式,我们默认使用轮询 upstream{ server:80; server:80; fair; } #供proxy_pass和fastcgi_pass指令中使用的代理服务器 #后台如果有动态应用的时候,不参与负载均衡.在ip_hash下使用 #backup仅仅在非backup服务器宕机或繁忙的时候使用 #Loadmodularconfigurationfilesfromthe/etc/Nginx/directory. #See/en/docs/ngx_core_#include #formoreinformation. include/etc/Nginx//*.conf; server{ #listen80default_server; #listen[::]:80default_server; #server_name_; listen80; server_name; root/usr/share/Nginx/html; #Loadconfigurationfilesforthedefaultserverblock. include/etc/Nginx//*.conf; location/{ proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_pass; } error_page404/; location=/{ } error_page500502503504/; location=/{ } } #SettingsforaTLSenabledserver. # #server{ #listen443sslhttp2default_server; #listen[::]:443sslhttp2default_server; #server_name_; #root/usr/share/Nginx/html; # #ssl_certificate"/etc/pki/Nginx/"; #ssl_certificate_key"/etc/pki/Nginx/private/"; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout10m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; # ##Loadconfigurationfilesforthedefaultserverblock. #include/etc/Nginx//*.conf; # #location/{ #} # #error_page404/; #location=/{ #} # #error_page500502503504/; #location=/{ #} #} }