Nginx

反向代理实例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 101 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
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值