nginx负载均衡部署

nginx负载均衡部署

测试使用5台
cat /etc/hosts
192.168.40.20 ? lb01 ?# 主
192.168.40.21 ? lb02 ?# 从
192.168.40.22 ? web01
192.168.40.23 ? web02
192.168.40.24 ? web03

1 修改ip 主机名
# 其他主机设置相同略
hostnamectl set-hostname lb01
nmcli c mod eth1 ipv4.addr "192.168.40.20/24"
nmcli d reapply eth1
ifconfig

# 系统优化,请参考:https://blog.51cto.com/lehappy/2781516
# nginx部署,请参考: https://blog.51cto.com/lehappy/2908335

2 安装 nginx 并配置开机运行
cat >/etc/yum.repos.d/nginx.repo<<‘END‘
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
END

yum -y install nginx
systemctl start nginx
systemctl enable nginx

3 创建负载均衡配置文件
# http://nginx.org/en/docs/http/ngx_http_upstream_module.html ? 负载均衡
# http://nginx.org/en/docs/http/ngx_http_proxy_module.html ? ? ?反向代理

3.1 修改主配置文件
[root@lb01 ~]#cd /etc/nginx/
[root@lb01 /etc/nginx]#mv nginx.conf nginx.conf.bak
[root@lb01 /etc/nginx]#egrep -v "^$|#" nginx.conf.bak >nginx.conf

#################### lb01 web01 web02 web03 配置相同 ?################
[root@lb01 /etc/nginx]#cat nginx.conf
user ?nginx;
worker_processes ?auto;
error_log ?/var/log/nginx/error.log notice;
pid ? ? ? ?/var/run/nginx.pid;
events {
? ? worker_connections ?1024;
}
http {
? ? include ? ? ? /etc/nginx/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"‘;
? ? access_log ?/var/log/nginx/access.log ?main;
? ? sendfile ? ? ? ?on;
? ? #tcp_nopush ? ? on;
? ? keepalive_timeout ?65;
? ? #gzip ?on;
? ? include /etc/nginx/conf.d/*.conf;
}

3.2 创建单独的负载均衡配置文件
[root@lb01 /etc/nginx]#cd conf.d/
[root@lb01 /etc/nginx/conf.d]#vi lb.conf
upstream jjyy {
? ? ? ? server 192.168.40.22:80;
? ? ? ? server 192.168.40.23:80;
? ? ? ? server 192.168.40.24:80;
}
server {
? ? server_name ?www.jjyy.com jjyy.com;
? ? location / {
? ? ? ? proxy_pass ? ? ? http://jjyy;
? ? }
}

#################### web01 web02 web03 配置相同 ?################
[root@web01 /etc/nginx/conf.d]#vi www.conf?
server {
? ? listen ? ? ? 80;
? ? server_name ?www.jjyy.com jjyy.com;
? ? access_log ?/var/log/nginx/www_access.log ?main;
? ? ? ? location / {
? ? ? ? ?root ? /html/www;
? ? ? ? ?index ?index.html index.htm;
? ? }
}

## 为了访问能显示出负载均衡的效果需要对web01 web02 web03 的index.html文件做修改
[root@web01 /etc/nginx]#cat /html/www/index.html?
web01

[root@web02 /etc/nginx]#cat /html/www/index.html?
web02

[root@web03 /etc/nginx]#cat /html/www/index.html?
web03
??
[root@lb01 /etc/nginx/conf.d]#nginx -t ? ? ? ?# 检查 lb01 web01 web02 web03 操作略
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 /etc/nginx/conf.d]#systemctl restart nginx ? ?# 重启 lb01 web01 web02 web03 操作略

# 修改/etc/hosts文件
[root@lb01 /etc/nginx]#cat /etc/hosts
192.168.40.20 ? lb01 www.jjyy.com jjyy.com

# 测试
[root@lb01 /etc/nginx]#curl jjyy.com
web02
[root@lb01 /etc/nginx]#curl jjyy.com
web03
[root@lb01 /etc/nginx]#curl jjyy.com
web01

[root@web01 /html/www]#curl -H host:www.jjyy.com 192.168.40.22/index.html ?# 单独测试命令

3.3 负载均衡配置详细说明
3.3.1 轮询(每台web主机平均分配,默认选项)
upstream jjyy {
? ? ? ? server 192.168.40.22:80;
? ? ? ? server 192.168.40.23:80;
? ? ? ? server 192.168.40.24:80;
}

3.3.2 权重分配(如果web主机配置不一样,配置好就多处理)
upstream jjyy {
? ? ? ? server 192.168.40.22:80 weight=1;
? ? ? ? server 192.168.40.23:80 weight=2;
? ? ? ? server 192.168.40.24:80 weight=3;
}

3.3.3 热备功能(如果web主机太多,留做备用当所有节点都出现故障才启用热备)
upstream jjyy {
? ? ? ? server 192.168.40.22:80;
? ? ? ? server 192.168.40.23:80;
? ? ? ? server 192.168.40.24:80 backup;
}

3.3.4 定义最大失败次数与间隔时间(web主机有时会出现停顿可以尝试几次间隔时间后切换为其他web主机)
upstream jjyy {
? ? ? ? server 192.168.40.22:80;
? ? ? ? server 192.168.40.23:80;
? ? ? ? server 192.168.40.24:80 max_fails=3 fail_timeout=5;
}

3.4 调度算法
rr 轮询 ?wrr 权重 ip_hash哈希(反复登录) least_conn最少连接数(根据服务器连接分配)

3.5 反向代理配置详细说明

3.5.1 访问不同网站地址,不能显示不同网站页面(有多个网站但只能看到一个)
location / {
? ? ? ? proxy_pass ? ? ? http://jjyy;
? ? ? ? proxy_set_header Host $host; ? # 增加携带主机头信息
? ? }

3.5.2 ?访问网站时无法获取用户真实ip(访问分析统计不了)
location / {
? ? ? ? proxy_pass ? ? ? http://jjyy;
? ? ? ? proxy_set_header Host $host; ? # 增加携带主机头信息
? ? ? ? proxy_set_header X-Forwarded-For $remote_addr; ? # 获取用户真实ip
? ? }

3.5.2 访问网站时出现错误页面,体验不好
# http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
location / {
? ? ? ? proxy_pass ? ? ? http://jjyy;
? ? ? ? proxy_set_header Host $host; ? # 增加携带主机头信息
? ? ? ? proxy_set_header X-Forwarded-For $remote_addr; ? # 获取用户真实ip
? ? ? ? proxy_next_upstream error timeout http_500 http_403; ?# 可以写多个错误,只要匹配就跳过
? ? }

4 针对用户不同浏览器对页面访问进行处理(如:手机与电脑)
# http://nginx.org/en/docs/http/ngx_http_core_module.html#http
Embedded Variables
The ngx_http_core_module module supports embedded variables with names matching the Apache Server variables.?
First of all, these are variables representing client request header fields,?
such as $http_user_agent, $http_cookie, and so on. Also there are other variables:
# 使用负载均衡对不同浏览器进行处理,需要获取客户端请求头字段的变量 $http_user_agent
[root@lb01 /etc/nginx/conf.d]#vi lb.conf
upstream android { ? ?# 安卓
? ? ? ? server 192.168.40.22:80;
}
upstream iphone { ? ? # 苹果
? ? ? ? server 192.168.40.23:80;
}
upstream default { ? ?# 默认为电脑
? ? ? ? server 192.168.40.24:80;
}
server {
? ? server_name ?www.jjyy.com jjyy.com;
? ? location / {
? ? ? ? if ($http_user_agent ~* "android") {
? ? ? ? ? ?proxy_pass ? ? ? http://android;
? ? ? ? }
? ? ? ? if ($http_user_agent ~* "iphone") {
? ? ? ? ? ?proxy_pass ? ? ? http://phone;
? ? ? ? }
? ? ? ? proxy_pass ? ? ? http://default;
? ? ? ? proxy_set_header Host $host;
? ? ? ? proxy_set_header X-Forwarded-For $remote_addr;
? ? ? ? proxy_next_upstream error timeout http_500 http_403; ?
? ? } ? ?
}

?

参考文献:
http://nginx.org/ ?官网
跟老男孩学Linux运维 Web集群实战

nginx负载均衡部署

上一篇:服务调用OpenFeign


下一篇:mbcs、unicode,UTF-8、UTF-16等的转换