准备:3台服务器,一台做负载均衡器,另外两台做web服务器,建议编译安装nginx
服务器 | IP |
---|---|
LB | 192.168.232.161 |
web1 | 192.168.232.162 |
web2 | 192.168.232.163 |
1、修改LB的配置文件
用于cpu的核心是两个,所以可以修改配置文件中的进程数为2,并将应该worker的并发数修改为2048
worker_processes 2;
events {
worker_connections 2048;
}
2、负载均衡器的配置
http {
upstream chenapp1 {
server 192.168.232.162;
server 192.168.232.163;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://chenapp1;
}
}
修改web1和web2的页面显示,然后在浏览器中输入LB服务器的网址,反复刷新可以看见不同的页面。
这个时候web服务器的日志access.log中记录的IP就是负载均衡服务器的 IP
upstream chenapp1 {
ip_hash; # 用户访问了某一个服务器的页面,就会一直访问那个页面
least_conn; # 最小链接数(轮询),每次刷新会将web服务器的页面轮流展示
# 加上权重值,权重值大的那个就会访问的更多
server 192.168.232.162 weight=5;
server 192.168.232.163 weight=2;
}
server {
listen 443 ssl;
server_name www.sanchuangedu.com;
ssl_certificate 8905404_sanchuangedu.cn.pem ; # pem文件和key文件都需要下载证书
ssl_certificate_key 8905404_sanchuangedu.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://chenapp1;
}
}
web服务器的日志access.log中记录的IP是负载均衡服务器的 IP,不知道用户的IP地址
解决方法
后端real server不使用realip模块
在负载均衡器上修改http请求报头部字段,添加一个X-Real-IP字段
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://chenapp1;
proxy_set_header X-Real-IP $remote_addr;
}
在后端real server上使用这个X-Real-IP字段
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $http_x_real_ip - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
现在就可以在/usr/local/scnginx99/logs/access.log
文件中看到client的IP了
后端real server使用realip模块
前提条件:在后端backend server上编译安装nginx的时候,--with http_realip_module
开启相关功能
backend server是如何知道前端client的IP地址的
负载均衡器在应用层把要发送给bakend server的http协议添加新的IP存储字段x_real_ip
查看web服务器是否还存活
主动检查。负载均衡服务器主动检查web服务器,需要安装nginx plus
被动检查。当client发请求给LB,然后LB再去转发请求给后端的real server,这个时候如果后端的服务器出现问题,LB就发现了。
upstream backend {
server 192.168.232.162
server 192.168.232.163 max_files=3 fail_timeout=30s
}
fial_timeout
:设置必须多次尝试失败才能将服务器标记为不可用时间,以及将服务器标记为不可用时间(默认10s)
max_fails
:设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认1次)
backup
:备份当其他的服务器都不提供服务的时候,再启用这台服务器提供服务
slow_start
:慢启动
down
:将上游的服务器标识为不可用,不会再发送任何请求给这台服务器
增加服务器数量
参数优化
worker_processes 2;
worker_connections 2048;
在命令行允许一个进程可以打开的连接数量
ulimit -n 1000000
nginx是根据http协议来做负载均衡的,http协议工作在应用层,是web服务的一部分,按照OSI七层网络模型来封装和解封装,属于第七层
在传输层完成所有的工作,根据端口号来区分不同的业务
实现四层负载均衡:
修改LB的nginx.conf
stream {
upstream dns_servers {
least_conn;
server 192.168.136.130:53;
server 192.168.136.131:53;
server 192.168.136.132:53;
}
upstream web_servers {
server 192.168.232.162:80;
server 192.168.232.163:80;
}
server {
listen 53udp;
proxy_pass dns_servers;
}
server {
listen 80;
procy_pass web_servers;
}
}
events {
worker_connections 1024;
}
七层负载均衡:
1、基于应用层
2、支持HTTP协议
3、效率低
4、可以实施应用层安全策略
四层负载均衡:
1、基于传输层,关注IP地址和端口号
2、支持http、MySQL、DNS、ftp等协议
3、效率高
4、无法执行高级内容处理,如HTTP请求的URL路由或请求头修改
原因:所有的backend server都挂掉了