反向代理实例1
配置java环境
下载java安装包解压到/usr/java目录下
配置环境变量
[root@redis-master logs]# cp jdk-8u301-linux-x64.tar.gz /usr/java/
[root@redis-master logs]# cd /usr/java/
[root@redis-master java]# tar -zxf jdk-8u301-linux-x64.tar.gz
[root@redis-master java]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_301
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#添加这三行
[root@redis-master java]# source /etc/profile
[root@redis-master java]# java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
下载tomcat安装包并启动
[root@redis-master ~]# tar -zxf apache-tomcat-9.0.52.tar.gz -C /usr/local/
[root@redis-master ~]# cd /usr/local/apache-tomcat-9.0.52/
[root@redis-master apache-tomcat-9.0.52]# cd bin/
#这里面有个startup.sh文件是启动tomcat用的
[root@redis-master bin]# ./startup.sh
nginx配置
nginx安装参考 https://blog.csdn.net/qq_44792624/article/details/119809475
这里稍微修改下配置
- server_name写服务器IP
- 添加一条proxy_pass 通过location转发路径
- 转发到8080端口去
[root@redis-master bin]# vim /usr/local/nginx/conf/nginx.conf
35 server {
36 listen 80;
37 server_name 192.168.100.10;
38
39 #charset koi8-r;
40
41 #access_log logs/host.access.log main;
42
43 location / {
44 root html;
45 proxy_pass http://127.0.0.1:8080; #转发路径到8080端口去
46 index index.html index.htm index.php;
47 }
[root@redis-master bin]# /usr/local/nginx/sbin/nginx -s reload
电脑hosts配置
C:\Windows\System32\drivers\etc\hosts
需要先修改一下权限
添加一行这个
192.168.100.10 www.123.com
最后访问域名 www.123.com
反向代理实例2
1、实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx的监听端口为9001
准备两个tomcat服务,一个端口8080,一个端口8081
创建两个目录,tomcat8080和tomcat8081,把tar包解压到两个目录中
#需要先把之前的8080tomcat服务给kill掉
ps -ef |grep tomcat
kill -9 进程号
#然后再进入到之前的tomcat目录中shutdown确保这个服务关闭掉了
[root@redis-master ~]# cd tomcat8080/apache-tomcat-9.0.52/bin/
[root@redis-master bin]# ./startup.sh
#第一个8080不需要修改直接启动即可
[root@redis-master ~]# cd tomcat8080/apache-tomcat-9.0.52/bin/
[root@redis-master bin]# ./startup.sh
#8081需要更改端口
[root@redis-master ~]# cd tomcat8081/apache-tomcat-9.0.52/conf/
[root@redis-master conf]# vim server.xml
修改下面三个地方
#修改完成以后再进入bin目录启动即可
启动完了进入网页测试一下两个端口看看能不能正常访问tomcat
然后配置nginx做反向代理配置
~ 是正则表达式的意思
当你有edu就转发到8080中
当你有vod就转发到8081中
另起一个server
记得把前面的星号注释掉
如果没有关闭防火墙的话记得开放9001 8080 8081端口
#写2个HTML页面用于区分
[root@redis-master ~]# mkdir tomcat8080/apache-tomcat-9.0.52/webapps/edu
[root@redis-master ~]# vim tomcat8080/apache-tomcat-9.0.52/webapps/edu/a.html
<h2>8080tomcat!!!</h2>
[root@redis-master ~]# mkdir tomcat8081/apache-tomcat-9.0.52/webapps/vod
[root@redis-master ~]# vim tomcat8081/apache-tomcat-9.0.52/webapps/vod/a.html
<h1>8081********8</h1>
访问两个页面
location指令说明
负载均衡
1、实现效果
浏览器地址输入http://192.168.100.10/edu/a.html,负载均衡效果平均到8080和8081端口中
2、准备工作
(1)准备两台tomcat服务器 8080和8081
(2)在两台tomcat里面webapps目录中创建名称为edu,在目录中创建a.html测试
之前在8080tomcat创建了edu目录,所以只在8081创建edu目录写一个不一样html页面就可以了
修改nginx配置文件
upstream 进行负载均衡服务器的列表
server里面加上映射的规则
然后重新加载nginx配置文件
[root@redis-master webapps]# /usr/local/nginx/sbin/nginx -s reload
访问http://192.168.100.10/edu/a.html一直刷新页面可以看到不一样的页面
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
2、weight
weight代表权重,默认为1,权重预告被分配的客户越多
upstream myserver {
36 server 192.168.100.10:8080 weight=5;
37 server 192.168.100.10:8081 weight=10;
3、ip_hash
每个请求按访问的ip 的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session(共享)的问题。这个ip访问以后只能访问同一个后端服务器不会变
upstream myserver {
ip_hash
server 192.168.100.10:8080;
server 192.168.100.10:8081;
4、fair(第三方)
按后端服务器的响应时间来分配,响应时间短的优先分配
upstream myserver {
server 192.168.100.10:8080;
server 192.168.100.10:8081;
fair
动静分离
1、实验准备
创建两个目录准备静态资源用于访问,image从电脑往上传一个图片就可以了
[root@redis-master ~]# mkdir /data/www
[root@redis-master ~]# mkdir /data/image
[root@redis-master image]# cd /data/www/
[root@redis-master www]# vim a.html
<h1>test 11</h1>
2、修改nginx配置
把之前配置清一下修改成下面这样
添加两个location访问路径
autoindex on 列出当前文件夹的内容
[root@redis-master image]# vim /usr/local/nginx/conf/nginx.conf
36 server {
37 listen 80;
38 server_name 192.168.100.10;
39
40 #charset koi8-r;
41
42 #access_log logs/host.access.log main;
43
44 location /www {
45 root /data/;
46 index index.html index.htm index.php;
47 }
48
49 location /image {
50 root /data/;
51 autoindex on;
52 }
[root@redis-master image]# /usr/local/nginx/sbin/nginx -s reload
访问一下image目录可以发现列出了之前上传的图片,这就是autoindex on
直接输入路径访问图片
访问a.html网页试一下
NGINX的高可用
1、实验准备
- 需要两台nginx服务器
- 需要keepalived服务
- 需要虚拟IP
2、环境准备
- 克隆之前的虚拟机并修改IP避免冲突
- 两台用yum安装keepalived
IP设置
master:192.168.100.10
ha:192.168.100.20
2个服务器都安装
[root@redis-master ~]# yum install keepalived -y
[root@redis-master ~]# rpm -q -a keepalived
keepalived-1.3.5-19.el7.x86_64
[root@ha ~]# yum install keepalived -y
[root@ha ~]# rpm -q -a keepalived
keepalived-1.3.5-19.el7.x86_64
#安装完成之后会在/etc/keepalived/keepalived.conf 有这个配置文件
[root@redis-master ~]# cd /etc/keepalived/
[root@redis-master keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3598 10月 1 2020 keepalived.conf
编写keepalived.conf配置文件
[root@redis-master sbin]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局定义
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人,定义利用什么邮箱发送邮件
smtp_server smtp.163.com #指定smtp服务器地址,定义邮件服务器信息
smtp_connect_timeout 30 #指定smto连接超时时间,定义邮件发送超时时间
router_id 192.168.100.10 #(重点参数)局域网keppalived主机身份标识信息(每台唯一)
script_user root #添加运行健康检查脚本的用户
enable_script_security #添加运行健康检查脚本的组
}
###虚拟IP 配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #表示将一个脚本信息赋值给变量check_web,检测脚本所在的路径
interval 2 #(检测脚本执行的间隔 )
weight -20 # 监测失败,则相应的vrrp_instance的优先级会减少20个点
}
vrrp_instance VI_1 {
state MASTER #keepalived角色描述信息,主服务器写MASTER,备份服务器写BACKUP
interface eno16777736 #要在那块网卡绑定你的虚拟IP
virtual_router_id 51 #主备机的Id必须一样
priority 100 #主备取不同的优先值,主服务器值大,备份服务器值小
advert_int 1 #主服务器组播包发送间隔时间,单位是秒
authentication { # 设置认证,主备主机之间的认证表示信息
auth_type PASS #采用明文认证机制
auth_pass 1111 #编写明文密码
}
virtual_ipaddress {
192.168.100.100 #设置虚拟ip地址信息,此参数备节点设置和主节点相同,可以多个虚拟IP,换行即可
}
track_script {
chk_http_port #调用执行脚本
}
}
编写检测脚本
脚本说明:当nginx进程不存在时,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。
[root@redis-master sbin]# vim /usr/local/src/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #查看是否有进程,把值赋给变量A
if [ $A -eq 0 ];then #如果没有进程值则为0
/usr/local/nginx/sbin/nginx #nginx的启动路径
sleep 2 #尝试启动nginx等待两秒
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #在查看一下是否有进程,没有则结束,杀掉keepalived
systemctm stop keepalived
fi
fi
##这里有点问题,vim编辑的时候显示dos,sh -x执行脚本报错语法错误,未预期的文件结尾,由于我是从windows到linux的所以需要下载个软件转换一下格式在执行就好了
[root@redis-master src]# yum install dos2unix -y
[root@redis-master src]# dos2unix nginx_check.sh
dos2unix: converting file nginx_check.sh to Unix format ...
[root@redis-master src]# sh -x nginx_check.sh
++ ps -C nginx --no-header
++ wc -l
+ A=0
+ '[' 0 -eq 0 ']'
+ /usr/local/nginx/sbin/nginx
+ sleep 2
++ ps -C nginx --no-header
++ wc -l
+ '[' 2 -eq 0 ']'
简易版
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl stop keepalived
fi
脚本解读
ps -C nginx --no-header |wc -l
-c 可执行地简单名称
-C 完整命令行
--no-headers 不打印开头(或者是头文件也可以说是表头)
[root@ha sbin]# ps -C nginx |wc -l
3
[root@ha sbin]# ps -C nginx --no-header
5002 ? 00:00:00 nginx
5003 ? 00:00:00 nginx
[root@ha sbin]# ps -C nginx #这里pid tty这些就是头文件,统计行数的话不加--no-header就会以为默认有一个进程运行因为不会关闭掉keepalived
PID TTY TIME CMD
5002 ? 00:00:00 nginx
5003 ? 00:00:00 nginx
wc -l 统计行数
注意:一定要给这个脚本文件可执行权限(看到变成可执行的颜色),执行命令:chmod u+x /usr/local/src/nginx_check.sh
#写完脚本以后用sh -x 加脚本名称执行一下看下哪一步有问题,这个可以一步一步排查问题
[root@redis-master src]# sh -x test_nginx_check.sh
++ ps -C nginx --no-header
++ wc -l
+ A=0
+ '[' 0 -eq 0 ']'
+ systemctl stop keepalived
接下来两台服务器都重启nginx和keepalived
重启nginx
重启nginx报错
cd nginx安装目录下/conf/nginx.conf 查看pid文件存放路径 (如果自己知道就不用执行上面这一步)
然后删除这个nginx.pid文件 然后再次杀掉nginx进程 搞定
这个服务器重启完了master的服务器重启也是这个问题,删除以后也不行,执行下面这条命令即可
[root@redis-master ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@redis-master ~]# /usr/local/nginx/sbin/nginx -s reload
启动keepalived
[root@ha sbin]# systemctl start keepalived
[root@ha sbin]# ps -ef |grep keepalived
root 4987 1 0 01:47 ? 00:00:00 /usr/sbin/keepalived -D
root 4988 4987 0 01:47 ? 00:00:00 /usr/sbin/keepalived -D
root 4989 4987 0 01:47 ? 00:00:00 /usr/sbin/keepalived -D
root 4998 3422 0 01:48 pts/0 00:00:00 grep --color=auto keepalived
- 观察keepalived日志: tail -f /var/log/keepalived.log
- 查看keepalived进程已经不存在。
- 查看eth0已经没有绑定vip。
这里先看一下master主服务器的IP
#看一下绑定网卡的虚拟ip
[root@redis-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5a:a8:52 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 scope global eno16777736 #这里就是绑定成功了
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5a:a852/64 scope link
valid_lft forever preferred_lft forever
#然后把主服务器的nginx给停止,模拟宕机
[root@redis-master src]# /usr/local/nginx/sbin/nginx -s stop
这个时候再试一下浏览器访问虚拟ip也是可以的,再看一下主服务器的ip
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5a:a8:52 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5a:a852/64 scope link
valid_lft forever preferred_lft forever
#绑定的虚拟ip没有了
#看一下备服务器的ip
[root@ha keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:6b:5f:1f brd ff:ff:ff:ff:ff:ff
inet 192.168.100.20/24 brd 192.168.100.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 scope global ens33 #这里成功显示了
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6b:5f1f/64 scope link
valid_lft forever preferred_lft forever
nginx原理解析
1、master和woker
2、woker如何进行工作的
3、一个 master 和多个 woker 有好处
(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,
继续进行争抢,实现请求过程,不会造成服务中断
4、woker数量和cpu核数相等最为适宜,4核就是4个woker
连接数worker connection
第一个:发送请求,占用了woker的几个连接数?
答案:2个或者4个,如果只访问静态资源的话,woker通过nginx指向静态资源服务器,把请求返回就是两个,如果查数据库的信息就要通过woker请求tomcat或者PHP,然后tomcat或者php返回给woker,总结就是静态资源的话就是2个连接数,用tomcat访问数据库的话就是4个连接数
第二个:nginx有一个master,四个woker,每个woker支持最大的连接数是1024,支持的最大并发数是多少?
答案:普通的静态访问最大并发数是:woker connections(woker最大连接数)*woker processes(woker数量) 除以2,而如果http作为反向代理来说,最大并发数应该是woker conections * woker processes除以4,就是静态除以2,动态除以4