Nginx+负载均衡-2
rewrite重写
规则
语法: location 配置 (注: 需要pcre才能开启此模块)
前缀含义
location = /uri 精确匹配(必须全部相等)
location ^~ /uri 匹配指定字符开头
location ~ pattern 区分大小写
location ~* pattern 不区分大小写
location / 通用匹配,任何请求都会匹配到
例如
#精确匹配,网址:http://www.example.com/
location = / {}
#区分大小写
location ~ /Example/ {}
http://www.example.com/Example/ [成功]
http://www.example.com/example/ [失败]
#不区分大小写
location ~* /Example/ {}
#匹配指定字符开头
location ^~ /img/ {}
#http://www.example.com/img/a.jpg [成功]
#http://www.example.com/img/b.mp4 [成功]
#http://www.example.com/video/b.mp4 [失败]
动静分离
准备两台服务器,分别为apache和nginx
修改nginx 配置文件 apache处理php nginx 处理图片
server {
#监听端口
listen 80;
#请求php文件则交给大括号处理
location ~ \.php$ {
#重写交给指定服务器的指定端口处理
proxy_pass http://192.168.159.131:8082;
}
#请求图片则交给大括号处理
location ~ \.(gif|jpg|jpeg|png)${
#重写交给指定服务器指定端口处理
proxy_pass http://192.168.159.131:8081;
}
}
server{
#监听端口
listen 8081;
location / {
项目跟目录
root /php/wwwroot/wev2;
location / {
#项目根目录
root /php/wwwroot/web2;
#默认首页
index index.html index.htm;
}
}
修改配置文件后需要重启服务
vi /php/server/nginx/sbin/nginx -s reload
修改apache配置文件启动服务
vi /php/server/apache/conf/httpd.conf
#apache 服务端口修改为8082
Listen 8082;
重启apache服务
/php/server/apache/bin/Apachectl start
关闭防火墙/将端口8081/8082添加到防火墙例外
service iptable stop #关闭防火墙
vi /etc/sysconfig/iptables #添加防火墙例外
运维架构设计方案
架构设计(使用冗余策略,增加备用服务器监控活动服务器)
高可用服务器搭建
什么是HA
HA是英文High Available的缩写,指高可用服务器
当活动服务器出现故障,导致用户无法访问,则使用备用服务器
如何使用高可用服务器(HA)
冷备
活动服务器出现故障,收到阿里云短信报警,需要运营人员手动备用服务器
热备
通过第三方软件( keepalived ),监控活动服务器,当出现故障自动切换到备用服务器
介绍keepalived
什么是keepalived : 就是一个高可用软件
用来检测服务器状态,用来防止单点故障的发生,保证业务的正常运行
原理:
->主服务器
用户->VIP(虚拟IP)
->备用服务器
安装keepalived
安装: yum -y install keepalived
管理: service keepalived start/stop/restart #启动/关闭/重启
配置文件: /etc/keepalived
日志文件: /var/log/messages
配置部署keepalived
至少准备两台服务器(查看ip信息)
分别在两台服务器上安装nginx并访问测试 (安装具体见上一将)
分别在两台服务器上安装keepalived
yum -y install keepalived
分别查看两台服务器网卡 ip a
配置活动服务器
vi /etc/keepalived/keepalived.conf
留下配置文件第一行 并将其与代码替换以下代码
#健康检查配置
vrrp_script check_web {
#监控本机80端口
script "</dev/tcp/127.0.0.1/80"
interval 2 #每隔2秒中检测一次
fall 2 #检查2次异常则切换备用服务器
rise 1 #检查正常次数
}
#虚拟路由
vrrp_instance VI_1 {
state MASTER #活动服务器(MASTER) 备用服务(BACKUP)
interface eth0 #绑定的网卡
virtual_router_id 51 #虚拟路由器的ID,有效范围为0-255
priority 100 #优先级
advert_int 1 #健康检查时间
authentication { #身份认证
auth_type PASS
auth_pass 1111
}
track_script { #健康检查脚本
check_web
}
virtual_ipaddress { #VIP(虚拟IP地址)
192.168.159.200
}
}
#注:修改VIP 和绑定网卡
启用/重启活动服务器/备份服务器
访问测试....
负载均衡
负载均衡架构图
负载均衡.png负载均衡策略
轮询: 将请求依次轮询发给每个服务器
权重: 服务器的权重越高,处理请求的概率越大
ip哈希: 通过哈希函数决定请求发送给哪个服务器
最少连接: 将请求发给持有活动连接的服务器.
语法(修改nginx配置文件)
http {
#设定负载均衡的服务器列表 phpServers 可以写网址或ip或其他英文
upstream phpServers {
#默认轮询
#权重 server 服务器IP:端口 weight=3;
#ip哈希 ip_hash;
#最少连接 least_conn;
server 服务器IP:端口;
server 服务器IP:端口;
server 服务器IP:端口;
}
server {
listen 80;
location / {
# 当80端口有请求的时候交给上面定义的负载均衡器处理(phpServers)
proxy_pass http://phpServers;
}
}
}
SESSION共享
明确: session存储在服务端(打开php配置文件可以查看存储路径)
发现: 由于实现了复制均衡的轮询策略导致session丢失
解决
使用ip哈希负载均衡策略
session入库(将session保存的数据库中)
实现
准备主服务器(注: 实现轮询结果)
server {
Listen 80;
server_name localhost;
#charset koi8-r;
$access_log logs/host.access.log main;
location / {
#现在: 所有请求交给负载均衡器处理
#解释: 当80端口有请求的时候交给上面定义的负载均衡器处理(phpServer)
proxy_pass http://phpServers;
#之前: 所有的请求访问html目录下的文件
#root html;
#index index.html index.htm
}
#error_page 404 /404.html
#redirect server error pages to the static page /50x.html
}
打开从服务器的nginx配置文件
在server{
location ~ \.php$ {
root 站点目录(比如 /php/wwwroot/web1);
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php
fastcgi_param SCRIPT_FILENAME 站点目录/$fastcgi_script_name;
include fastcgi_params;
}
.....
}
重启服务..
/php/server/nginx/sbin/nginx -s reload
在从A服务器站点目录中创建test.php文件并写入session代码打印
<?php
session_start();
$_SESSION['TEST'] = 'xxsdxas';
print_r($_SESSION)'
在从B服务器创建..
<?php
session_start();
print_r($_session);
session负载均衡丢失.png
修改配置文件
vi /phpserver/nginx/conf/nginx/conf
upstream phpServers {
ip_hash;
server 192.168.80.88;
server 192.168.80.89;
}
重启服务...
发现只能查看到一台服务器(hash原因) 每次就只能访问一个服务器读取session 并在B服务器上设置session即可;
网友评论