一、作用:
反向代理(和tomcat一起用)
动静分离(静态资源)
负载均衡
正向代理:
多台计算机通过一台服务器访问互联网,这台服务器称为正向代理
反向代理:
多台服务器通过一台服务器与互联网连接,这台服务器称为反向代理
负载均衡:
请求分发
动静分离:
将动态请求和静态请求分开
二、安装步骤:
tar -zxvf pcre安装tar包
cd pcre目录
./configure
make
make install
cd ..
tar -zxvf openssl核安装tar包
cd openssl目录
./config
make && make install
cd ..
tar -zxvf zlib安装tar包
cd zlib目录
./configure
make && make install
cd ..
tar -zxvf nginx安装tar包
cd nginx目录
./configure
make && make install
查看防火墙状态
systemctl status firewalld
打开特殊端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
重新加载
firewall-cmd --reload
查看已经打开的防火墙端口
firewall-cmd --list-all
tip:在linux中存在6个常用目录,在这六个常用目录中的命令可以在任何地方启用,这六个常用目录分别是:/bin(/usr/bin,/usr/local/bin),/sbin(/uer/sbin,/usr/local/sbin)
三、nginx基本命令:
进入nginx目录:cd /usr/local/nginx/sbin
在nginx目录中的sbin目录下启动nginx服务:./nginx
查看nginx服务是否启动:ps -ef|grep nginx
关闭nginx服务:./nginx -s stop
重新加载nginx服务:./nginx -s reload
访问nginx服务器:http://ip:80
conf中的nginx.conf内容{
一、全局块{
用于配置全局变量
}
二、事件块{
用于配置事件,如配置最大连接数量
}
三、http块{
http全局块
server块
}
}
四、代理实验
反向代理实验一{
访问www.123.com直接跳转到127.0.0.1:8080
在Windows中配置域名映射:
在C:\Windows\System32\drivers\etc下找到hosts,在里面配置
ip 映射地址(目标linux的ip地址 www.lixxkv.com)
在cat nginx.conf中{
server_name linux自身网址;
location / {
添加
proxy_pass http://目标linux的ip地址:8080;
}
}
修改好后在sbin中执行./nginx -s reload
报错:
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
解决:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
在sbin中执行./nginx -s reload
}
反向代理实验二{
访问http://目标linux的ip地址:9000(自定义nginx服务器的端口)/edu/index.html直接跳转到8080服务器
访问http://目标linux的ip地址:9000(自定义nginx服务器的端口)/vod/index.html直接跳转到8081服务器
在nginx.conf中{
listen 配置监听端口9000;
server_name linux自身网址ip;
location ~ /edu/ {
proxy_pass http://linux自身或其他网址ip:8080;
}
location ~ /vod/ {
proxy_pass http://linux自身或其他网址ip:8081;
}
}
}
location指令说明:
语法{
location [ = , ~ , ~* , ^~ ] uri{}
}
=:严格匹配uri,不含正则表达式,优先级最高
~:区分大小写的匹配含正则表达式的uri,
~*:不区分大小写的匹配正则表达式的uri,优先级高于普通匹配
^~:不含有正则表达式的uri匹配(反正则),优先级高于正则匹配
/:普通匹配,优先级最低
五、负载均衡(load balance):
实例一{
分别在80和81两个端口的tomcat中部署同一个静态资源
在nginx的配置文件中进行负载均衡,在nginx.conf中{
upstream myserver{
server 同一目标linux的ip地址:8080;
server 同一目标linux的ip地址:8081;
}
server{
location{
proxy_pass http://myserver;
}
}
}
}
负载均衡算法:
轮询(默认);
带权重的轮询{
默认权重为1,权重越高得到的负载越大
在nginx中修改权重:在nginx.conf中{
upstream myserver{
server 同一目标linux的ip地址:8080 weight=1;
server 同一目标linux的ip地址:8081 weight=3;
}
}
}
轮询带来的问题:session不一致,解决方法常用redis服务器、ip_hash
ip_hash{
将ip的最后一个字节或url除2取余,同余数请求到同一个服务器
在nginx中修改权重:在nginx.conf中设置ip_hash算法{
upstream myserver{
ip_hash;
server 同一目标linux的ip地址:8080;
server 同一目标linux的ip地址:8081;
}
}
在使用ip_hash算法后,轮询的权重无意义
缺点:缺点在ip集中分布且分布不均情况下可能导致负载不均
}
fair(第三方):
根据服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver中的其他参数:
server ip:port down----此服务器处于宕机状态
server ip:port backup----此服务器是备用服务器,随时接替down机
六、动静分离:
将动态资源和静态资源分开
nginx通过正在匹配不同的后缀名称实现请求的不同转发
动静分离实例一{
将静态资源data放到根目录下
在nginx的配置文件中进行动静分离,在nginx.conf中{
location /image/ {
root /data/;
autoindex on; #以列表形式展示静态资源
}
location /www/ {
root /data/;
index index.html index.html;
}
}
}
动静分离实例二{
将静态资源data放到根目录下
在80和81端口的tomcat的webapps下编写带有静态资源连接的jsp{
直接访问tomcat则无法加载静态资源,通过静态资源服务器可以获取图片
location /image/{ root /data/;}
}
通过宿主机对jsp进行代理访问
}
七、Nginx+Keeplived高可用:
集群的目的之一是为了高可用
单点故障{
起因:没有集群的唯一一台nginx挂了
解决:利用keeplived将nginx做主从备份
解决方式:在主nginx挂之前,监控主nginx的keeplived回想各个带有keeplived的nginx发出通知,然后通过权重机制、ip机制等进行主nginx的选择
}
安装keepalived法一{
tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src
yum install -y gcc openssl-devel popt-devel
cd /usr/local/src/keepalived-1.4.2
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/src/keepalived-1.2.18/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/src/keepalived-1.2.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin
}
安装keepalived法二{
cd /usr
yum install keepalived -y
rpm -q -a keepalived
cd /etc
/etc/keepalived/keepalived.conf
}
在/etc/keepalived/下编写.pl的故障通知脚本(可以上网自己找找),并且通过chmod为脚本添加可执行权限
在/etc/keepalived/下编写nginx_check.sh的shell脚本{
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]
then
#killall keepalived
echo "nginx server is died"
systemctl stop keepalived
#service keepalived stop
fi
}
keepalived配置文件结构{
总体结构:{
全局定义{
邮件通知
}
同步组{
管理服务器虚拟机实例,采用vrrp(虚拟路由冗余协议,监控多个网段的实例)协议
在同步组中会将网段分为内网网段和外网网段
}
心跳检测{
检测nginx主机是否正常工作
做权重修改
}
实例{
定义主从
明确网卡
自定义虚拟路由标识
定义权重区分主从
以秒为单位心跳检测
设置验证类型和密码
设置虚拟ip地址
应用上面的vrrp_scrip定义的脚本名称
}
}
一主一备模式{
#全局配置
global_defs {
router_id lixxkvone
}
#同步组
vrrp_sync_group VG_1{#监听
group {
VI_1 #实例管理
}
notify_master /etc/keepalived/sendmail.pl #发邮件
#notify_backup /etc/keepalived/sendmail.pl
}
vrrp_script chk_nginx { #检测nginx
script /etc/keepalived/nginx_check.sh #调用检测脚本
interval 2 #每隔2秒检测一次
weight 20 #权重,通过权重调整主备关系
}
vrrp_instance VI_1 {
state MASTER 或 BACKUP #区分主从nginx
interface ens33 #个人主机的网卡名称{查网卡名称:ip a}
virtual_router_id 51 #虚拟路由id,在一主多备情况下保持一致,多主多备情况下按一组一个id区分
priority 100 或 90 #设置优先级,以优先级大的作为主机
advert_int 1 #心跳检测,每隔1秒检测一次
#noopreempt #主备争抢模式
authentication { #权限
auth_type PASS
auth_pass 1111
}
track_script { #设置检测脚本
chk_nginx
}
virtual_ipaddress {# 虚拟ip,在一套主备中虚拟ip要求一致
主虚拟目录 或 备虚拟目录
}
}
}
双主模式{
#全局配置
global_defs {
router_id lixxkvone
}
#同步组
vrrp_sync_group VG_1{#监听
group {#实例管理
VI_1 #主备一
}
notify_master /etc/keepalived/sendmail.pl #发邮件
#notify_backup /etc/keepalived/sendmail.pl
}
vrrp_script chk_nginx { #检测nginx
script /etc/keepalived/nginx_check.sh #调用检测脚本
interval 2 #每隔2秒检测一次
weight 20 #权重,通过权重调整主备关系
}
vrrp_instance VI_1 {
state MASTER 或 BACKUP
interface ens33 #个人主机的网卡名称{查网卡名称:ip a}
virtual_router_id 51 #虚拟路由id,在一主多备情况下保持一致,多主多备情况下按一组一个id区分
priority 100 或 90 #设置优先级,以优先级大的作为主机
advert_int 1 #心跳检测,每隔1秒检测一次
#noopreempt #主备争抢模式
authentication { #权限
auth_type PASS
auth_pass 1111
}
track_script { #设置检测脚本
chk_nginx
}
virtual_ipaddress {# 虚拟ip,在一套主备中虚拟ip要求一致
虚拟目录1 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state BACKUP 或 MASTER
interface ens33 #个人主机的网卡名称{查网卡名称:ip a}
virtual_router_id 52 #虚拟路由id,在一主多备情况下保持一致,多主多备情况下按一组一个id区分
priority 90 或 100 #设置优先级,以优先级大的作为主机
advert_int 1 #心跳检测,每隔1秒检测一次
#noopreempt #主备争抢模式
authentication { #权限
auth_type PASS
auth_pass 1111
}
track_script { #设置检测脚本
chk_nginx
}
virtual_ipaddress {# 虚拟ip,在一套主备中虚拟ip要求一致
虚拟目录2 dev ens33 label ens33:2
}
}
}
}
在配置好keepalived配置文件后,分别在两台linux中使用命令
systemctl start keepalived.service
启动keepalived,使用
ps -ef|grep keepalived
查看keepalived进程,在keepalived进程中有
- core:负责主进程的启动,维护和全局配置文件的加载
- check:负责健康检查
- vrrp:用来实现vrrp协议
使用
systemctl stop keepalived
关闭keepalived
八、Nginx原理{
进程:master;worker
master作用:监控客户端,
worker作用:负责对接客户端(竞争形式)
master-worker形式的好处:worker是独立进程,不用加锁;独立进程间互不影响;多个worker间可以相互替补
nginx通redis一样采用了io多路复用机制,每个worker都是一个独立进程,但每个独立进程只有一个主线程,通过异步非阻塞的方式来处理请求。worker数和我放弃的cpu数相等式最为适宜
一个worker对应最大连接数为1024
nginx可以处理的最大请求并发数
nginx的总链接数:worker_连接数*woker_进程
静态请求访问:一个请求占用两个连接,worker_连接数*woker_进程/2
动态请求访问:一个请求占用四个请求,worker_连接数*woker_进程/4
nginx的日志所在位置/usr/local/nginx
关于nginx的事件配置:{
woeker_connection 1024
use epoll;设置
multi_accept on:设置并发量大时缓解客户端等待时间
accept_mutex on;使得master派指worker抢占锁
}
}