正向代理和反向代理介绍
正向代理
在客户端配置代理服务器,通过代理服务器进行互联网访问,就像我们用的VPN梯子,当我们想要去访问一个国外网站,用国内的ip是访问不到的,这时候就需要一个代理服务器牵线搭桥
图解:
反向代理
上面的是给客户端用代理服务器,达到访问记录不是客户端的真实ip,反向代理指的是给服务端配置代理服务器,让客户端不知道服务器的真实ip地址
图解:
这边反向代理服务器和我们的服务端tomcat可以视为一个整体,因为客户端对代理无感知,客户端不需要任何配置就可以访问,只需要将请求发送到反向代理服务器去选择目标服务器的数据,然后返还给客户端
举个例子,反向代理服务器就是服务员,服务端就是厨师,你要什么服务员就给你拿什么
负载均衡和动静分离介绍
- 基本的发送请求和响应方式:
这种架构方式对于早期的系统相对单一,并发请求数量较少的时候是比较适合的,但现在科技飞速发展,并发数越来越高,用这样的系统可能会导致服务器瘫痪,这时候我们可以提高CPU的性能,但这个不能起太大的作用,不是根本性的。
负载均衡
- 图解:
客户端向服务端发送15个请求,负载均衡模式就不会集中发送往一个服务端,先通过反向代理服务器,然后分配到不同的服务端
动静分离
- 图解:
首先我们的服务端要先设置几台服务器,一些只存放静态资源,如js,html,css,一些服务器存放动态资源,如jsp,servlet
当客户端发送静态请求时,反向代理服务器就把请求送到静态服务器,发送动态请求就送到动态服务器,达到动静分离
Linux下Nginx安装
step1.安装pcre依赖
按顺序输入一下指令:
- 下载安装包
wget [https://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.gz](https://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.gz)
- 解压
tar -xvf pcre-8.37.tar.gz
- 安装
首先进入文件夹cd pcre-8.37
再运行./configure
进行安装
最后运行make && make install
编译
- 验证
输入pcre-config --version
查看版本,若出现8.37说明安装成功
step2.安装其他的依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
你以为以上的指令有用吗,不屁用没有,真的,别踩坑,kali虚拟机系统不能这样安装,不能的不能的
正确方法:
- 安装zlib-devel依赖:
在ubuntu软件源里zlib和zlib-devel叫做zlib1g zlib1g.dev名字和错误提示中的名字不一致sudo apt-get install zlib1g.dev
- 安装openssl-devel依赖:
sudo apt-get install openssl
sudo apt-get install libssl-dev
- 安装gcc和g++依赖:
sudo apt-get install gcc
sudo apt-get install g++
step3.安装nginx
下载官网:http://nginx.org/en/download.html
我下载的是nginx-1.20.2.tar.gz
先压缩: tar -xvf nginx-1.20.2.tar.gz
再进入解压目录执行:./configure
再进行编译:make && make install
nginx的位置
安装完成后,我们可以cd /usr/local/nginx/sbi/
找到nginx的可执行文件
启动nginx
在上面说的目录下./nginx
然后ps -ef|grep nginx
可以看到已经成功运行
查看我们的端口设置
先进入cd /usr/local/nginx/conf
里面有一个nginx.conf文件,我们查看一下:vim nginx.conf
有一个listen,就是我们的默认端口80
主机访问成功
防火墙的有关指令
查看开放的端口号firewall-cmd --list-all
设置开放的端口号:firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent
新增一个端口
检查防火墙状态systemctl status firewalld
如果我们的结果如下:
active=dead说明是关闭状态
开启防火墙:systemctl start firewalld
状态变为runnning,说明成功开启
关闭防火墙:systemctl stop firewalld
重新加载防火墙:firewall-cmd --reload
开启防火墙之后输入sudo firewall-cmd --add-port=80/tcp --permanent
新增一个80端口,检查一下这里我是开放了80和8001端口
Nginx常用的命令
首先要进入nginx目录才能执行命令cd /usr/local/nginx/sbin/
- 列出版本号
./nginx -v
启动nginx
./nginx
- 关闭nginx
./nginx -s stop
- 重新加载nginx
./ nginx -s reload
Nginx的配置文件
首先进入文件夹cd /usr/local/nginx/conf
其中nginx.conf是配置文件
nginx配置文件有三部分组成:
第一部分:全局快
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括运行nginx服务器的用户(组),允许生成的worker process数目,进程pid存放路径,日志存放路径和类型以及配置文件的引入等。
到events结束就是整个全局块,worker_processes就表示nginx并发处理的值
第二部分:events块
events涉及的指令主要影响nginx服务器和用户的网络连接
比如:
表示nginx支持的最大连接数是1024
第三部分:http块
这是nginx服务器配置最频繁的部分,代理,缓存和日志文件等绝大多数功能和第三方模块都在这
http也可以包括http全局块和server块
http全局块
1 | http { |
server块
和虚拟主机有密切关系
server也分2个部分
全局server
location块
反向代理
准备工作
- 安装tomcat,使用默认端口8080
软件下载地址:
软件安装:tar -xvf tar -xvf apache-tomcat-8.5.82.tar.gz
cd apache-tomcat-8.5.82
./startup.sh
运行
配置java环境变量:
首先vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
配置tomcat环境变量:vim /etc/profile
export CATALINA_HOME=/opt/apache-tomcat-8.5.82
创建对外访问端口:firewall-cmd --add-port=8080/tcp --permanent
再重启防火墙:firewalld-cmd --reload
查看已开放端口:firewall-cmd --list-all
可以看到有3个端口
最后在主机访问我们的虚拟机端口:(默认8080)
- **访问过程的分析:
**
反向代理实例一
这边第一步是做一个dns修改,感觉没什么必要。。假域名
nginx进行请求转发配置
进入/usr/local/nginx/conf/nginx.conf中
去编辑nginx.conf文件
按照如下操作修改:
结尾有个;
测试
先去/usr/local/nginx/sbin去运行nginx:
最后访问192.168.200.130:80就可以进入tomcat
反向代理实例二
实现效果:使用nginx反向代理,根据访问的路径不同跳转到不同端口的服务中
nginx监听端口为9001
访问http://127.0.0.1:9001/edu跳转到127.0.0.1:8080
访问http://127.0.0.1:9001/vod跳转到127.0.0.1:8081
- 第一步
准备2个tomcat的服务器,一个是8080端口,一个是8081端口
在/opt内新建2个文件夹一个tomcat8080,一个8081
先关闭原有的tomcat,有两种方法
一种是直接ps -ef |grep tomcat,找到PID,最后kill 掉
另一种是进入tomcat的bin文件夹中,然后./shutdown.sh
最后把apache-tomcat的文件夹复制2份到tomcat8080和tomcat8081
再和之前一样重新安装一遍,别忘了配置环境变量。。。
以上是8080的
现在我们要改一下8081的:
这里要进入conf/server.xml去修改文件:
8005改成8015
8080改成8081
保存即可,这都是为了防止冲突
然后重启一下tomcat8081,再访问:(别忘了防火墙新增端口)
- 第二步
在8080的apache-tomcat中的webapps目录下新建一个文件夹叫做edu:
在8081的apache-tomcat中的webapps目录下新建一个文件夹叫做vod:
由于我们访问192.168.200.130,当前页面的路劲就是webapps下,我们向vod和edu文件夹下分别防止2个相同的txt文件,里面分别写8080和8081
这里还会出现404问题,向content.xml文件中content下面加上一段话:<Loader delegate="true"/>
参考:https://blog.csdn.net/weixin_40496191/article/details/107812969?ops_request_misc=&request_id=&biz_id=102&utm_term=linux%E4%B8%8B%E9%83%A8%E7%BD%B2tomcat&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-107812969.142^v47^pc_rank_34_default_2,201^v3^control_1
然后分别访问可以看到:
完成简单的部署
之后在nginx的conf文件夹下的nginx.conf中添加这几段:
1 | server { |
- location指令讲解:
1
2
3
4
5
6
7location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
负载均衡
前提准备:
在8080和8081端口下的tomcat都创建edu,里面随便放2个用来识别的文件
我里面放了一个hello.html,8080里的内容是输出8080,8081的内容是输出8081
修改nginx.conf:
1 | upstream myserver{ |
重启nginx,访问一下192.168.200.130/edu/hello.html
注意事项:这里面的**myserver**
要和下面的proxy_pass对应起来,不一定取myserver,随便都可以,只要对应即可!
可以看到结果一个是8080一个是8081,这就是负载均衡,去两个端口的判断依据就是轮询,如下
负载均衡的几种策略
轮询:
每个请求按**时间顺序逐一**
分配到不同的后端服务器,如果后端服务器down掉,能自动剔除weight(权重):
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:
也就是去8081的比率比去8080的多一倍
- session:
每个请求按照ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:
- fair(第三方):
按照后端服务器的响应时间来分配请求,响应时间短的优先分配
动静分离
动静分离是把动态请求和静态请求分开
- 动态请求
如向数据库中请求数据
- 静态请求
如访问一张图片,一个html页面
准备工作
- 在linux系统中准备一个静态的资源
创建一个data文件夹,里面放创建2个文件夹,www和img分别存放不同静态文件
进行配置
把nginx.conf为以下:
解释一下:
1 | location /www { |
其中location /www
和root /data/
代表着什么?
实际上就是当你如果你URL上的请求是URL+/www,nginx就会帮你跳转到/data/www
普遍一点的模式就是:
1 | location ^~ /t/ { |
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
其中root可以换成alias:
1 | location ^~ /t/ { |
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。
举个例子,以上例子alias的内容是/data/html/img/;
location后的内容是 ^~ /a/
那么假如URL+/a/1.png
web服务器会跳转到/data/html/img/1.png
和上面的有一点不同
下面演示一下:
符合我们的解释
以上就是动静分离的简单演示拉,还是很实用的感觉!
这里不得不说一下视频里的弹幕都是一些没脑子的人真的我草,我一开始不知道root和alias的区别,看弹幕一堆nt说什么root是根目录,我开弹幕的原因是觉得会有人给出解释,而不是看到一群傻子在这里乱说话。实践是检验真理唯一标准
高可用模式
(1):需要2台nginx服务器
(2):需要keepalive
(3):需要虚拟ip
先开两个虚拟机吧,克隆一个
- 如何安装keepalived
https://blog.csdn.net/weixin_43938497/article/details/109227139
更改配置文件
配置文件的位置在/usr/local/keepalived-2.0.20/keepalived/etc/keepalived/keepalived.conf
首先先把keepalived.conf文件拷贝一分下来放到windows操作,配置更改为:
1 |
|
我草给我整吐了,全是centos演示不照顾一下debian的我搞你妈,下面是一些坑:
xshell和XFTP不能连接问题
Debian默认不让root连接问题
然后在/etc/keepalived/目录下创建一个check_nginx.sh文件
1 | #!/bin/bash |
接下来运行一下keepalive和nginx
由于我们是源码安装keepalived的不能用systemctl去启动,只能手动去/usr/local/sbin/keepalived去开启
接着在主机去访问虚拟ip:
成功访问了
接着我们停掉主机的nginx和keepalived,再访问一下看看:
仍然可以,高可用模式成功
配置文件讲解
- router_id:服务器的名字
vim/etc/host可以更改服务器名字
- 检测脚本配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 此处是keepalived检查服务时要执行的脚本
interval 2 #这里是间隔执行脚本的时间,间隔两秒执行一次
weight -20 # 权重,健康检查脚本执行后如果返回非0则会在priority上减去20
}
vrrp_instance VI_1 {
state BACKUP # 设置主备MASTER为主,BACKUP为备
interface eth0 #VIP要挂的网卡
virtual_router_id 51 #虚拟路由标识,主备服务器上这里必须保持一致
priority 100 #定义优先级,数字越大优先级越高,主服务器上的值应该为最大,当改值小于备服务器时,备服务器将抢占VIP
advert_int 1 #主备服务器之间检查的时间间隔,1秒;主备必须一致
authentication { #设置验证类型和密码,主备必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.50 #设置虚拟IP地址,可以设置多个IP地址每行一个
}
track_script {
chk_nginx #检查脚本,就是我们上边定义的vrrp_script
}
#notify_master "/etc/keepalived/master.sh" #当前节点成为master时,执行脚本
#notify_backup "" #当前节点成为backup时,执行脚本
#notify_fault "" #当前节点出现故障时,执行脚本
}
nginx的原理解析
- master和workder
master相当于管理员,worker相当于普通用户
- worker是如何工作的
不同的worker通过争抢的方式来处理
- 一个master多个worker的好处
(1) 可以使用./nginx -s reload 热部署
(2) 每个worker是独立进程,如果其中一个worker倒了,其他继续争抢,不造成中断
- 设置多少个worker合适
nginx同redis类似,采用io多线路复用机制,使得性能最佳
当worker数和cpu数相同是最合适的
结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.