March 2, 2023

Nginx

正向代理和反向代理介绍

正向代理

在客户端配置代理服务器,通过代理服务器进行互联网访问,就像我们用的VPN梯子,当我们想要去访问一个国外网站,用国内的ip是访问不到的,这时候就需要一个代理服务器牵线搭桥
图解:
image.png

反向代理

上面的是给客户端用代理服务器,达到访问记录不是客户端的真实ip,反向代理指的是给服务端配置代理服务器,让客户端不知道服务器的真实ip地址
图解:image.png
这边反向代理服务器和我们的服务端tomcat可以视为一个整体,因为客户端对代理无感知,客户端不需要任何配置就可以访问,只需要将请求发送到反向代理服务器去选择目标服务器的数据,然后返还给客户端

举个例子,反向代理服务器就是服务员,服务端就是厨师,你要什么服务员就给你拿什么

负载均衡和动静分离介绍

image.png
这种架构方式对于早期的系统相对单一,并发请求数量较少的时候是比较适合的,但现在科技飞速发展,并发数越来越高,用这样的系统可能会导致服务器瘫痪,这时候我们可以提高CPU的性能,但这个不能起太大的作用,不是根本性的。

负载均衡

image.png
客户端向服务端发送15个请求,负载均衡模式就不会集中发送往一个服务端,先通过反向代理服务器,然后分配到不同的服务端

动静分离

image.png
首先我们的服务端要先设置几台服务器,一些只存放静态资源,如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虚拟机系统不能这样安装,不能的不能的

正确方法:

在ubuntu软件源里zlib和zlib-devel叫做zlib1g zlib1g.dev名字和错误提示中的名字不一致
sudo apt-get install zlib1g.dev

sudo apt-get install openssl
sudo apt-get install libssl-dev

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
image.png
可以看到已经成功运行

查看我们的端口设置

先进入cd /usr/local/nginx/conf
image.png
里面有一个nginx.conf文件,我们查看一下:
vim nginx.conf
image.png
有一个listen,就是我们的默认端口80
image.png
主机访问成功

防火墙的有关指令

查看开放的端口号firewall-cmd --list-all
设置开放的端口号:
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent 新增一个端口

检查防火墙状态systemctl status firewalld
如果我们的结果如下:
image.png
active=dead说明是关闭状态

开启防火墙:systemctl start firewalld
image.png状态变为runnning,说明成功开启

关闭防火墙:systemctl stop firewalld

重新加载防火墙:firewall-cmd --reload

开启防火墙之后输入sudo firewall-cmd --add-port=80/tcp --permanent新增一个80端口,检查一下image.png这里我是开放了80和8001端口

Nginx常用的命令

首先要进入nginx目录才能执行命令
cd /usr/local/nginx/sbin/

./nginx -v
image.png

image.png

./nginx -s stop
image.png

Nginx的配置文件

首先进入文件夹cd /usr/local/nginx/conf
image.png
其中nginx.conf是配置文件
nginx配置文件有三部分组成:

第一部分:全局快

从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括运行nginx服务器的用户(组),允许生成的worker process数目,进程pid存放路径,日志存放路径和类型以及配置文件的引入等。
image.png
到events结束就是整个全局块,worker_processes就表示nginx并发处理的值

第二部分:events块

events涉及的指令主要影响nginx服务器和用户的网络连接
比如:
image.png
表示nginx支持的最大连接数是1024

第三部分:http块

这是nginx服务器配置最频繁的部分,代理,缓存和日志文件等绝大多数功能和第三方模块都在这

http也可以包括http全局块和server块

http全局块

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server块

和虚拟主机有密切关系
server也分2个部分

全局server

image.png

location块

image.png

反向代理

准备工作

软件下载地址:

软件安装:
tar -xvf tar -xvf apache-tomcat-8.5.82.tar.gz
cd apache-tomcat-8.5.82
./startup.sh运行
image.png
配置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
image.png

再重启防火墙:
firewalld-cmd --reload

查看已开放端口:
firewall-cmd --list-all
image.png
可以看到有3个端口
最后在主机访问我们的虚拟机端口:(默认8080)
image.png

反向代理实例一

这边第一步是做一个dns修改,感觉没什么必要。。假域名

nginx进行请求转发配置

进入/usr/local/nginx/conf/nginx.conf中
去编辑nginx.conf文件
按照如下操作修改:
image.png

结尾有个;

测试

先去/usr/local/nginx/sbin去运行nginx:
image.png
最后访问192.168.200.130:80就可以进入tomcat
image.png

反向代理实例二

实现效果:使用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 掉
image.png
另一种是进入tomcat的bin文件夹中,然后./shutdown.sh
image.png
最后把apache-tomcat的文件夹复制2份到tomcat8080和tomcat8081
再和之前一样重新安装一遍,别忘了配置环境变量。。。
image.png
image.png
image.png
以上是8080的
现在我们要改一下8081的:

image.png
这里要进入conf/server.xml去修改文件:
image.png
8005改成8015
image.png
8080改成8081
保存即可,这都是为了防止冲突

然后重启一下tomcat8081,再访问:(别忘了防火墙新增端口)
image.png

在8080的apache-tomcat中的webapps目录下新建一个文件夹叫做edu:
image.png
在8081的apache-tomcat中的webapps目录下新建一个文件夹叫做vod:
image.png
由于我们访问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

然后分别访问可以看到:
image.png
image.png
完成简单的部署

之后在nginx的conf文件夹下的nginx.conf中添加这几段:
image.png

1
2
3
4
5
6
7
8
9
10
11
server {
listen 9001;
server_name 192.168.200.130;

location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}

image.png
image.png

负载均衡

前提准备:
在8080和8081端口下的tomcat都创建edu,里面随便放2个用来识别的文件
我里面放了一个hello.html,8080里的内容是输出8080,8081的内容是输出8081

修改nginx.conf:
image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream myserver{
server 192.168.200.130:8080;
server 192.168.200.130:8081;
}
server {
listen 80;
server_name 192.168.200.130;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}

重启nginx,访问一下192.168.200.130/edu/hello.html
注意事项:这里面的**myserver**要和下面的proxy_pass对应起来,不一定取myserver,随便都可以,只要对应即可!
image.png
image.png
可以看到结果一个是8080一个是8081,这就是负载均衡,去两个端口的判断依据就是轮询,如下

负载均衡的几种策略

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:
image.png
也就是去8081的比率比去8080的多一倍

每个请求按照ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:
image.png

按照后端服务器的响应时间来分配请求,响应时间短的优先分配
image.png

动静分离

动静分离是把动态请求和静态请求分开

如向数据库中请求数据

如访问一张图片,一个html页面
image.png

准备工作

  1. 在linux系统中准备一个静态的资源

创建一个data文件夹,里面放创建2个文件夹,www和img分别存放不同静态文件
image.png

进行配置

把nginx.conf为以下:
image.png
解释一下:

1
2
3
4
5
6
7
8
9
10
11
location /www {

root /data/;
index index.html index.htm;
}

location /img {

root /data/;
autoindex on;
}

其中location /wwwroot /data/代表着什么?
实际上就是当你如果你URL上的请求是URL+/www,nginx就会帮你跳转到
/data/www
普遍一点的模式就是:

1
2
3
location ^~ /t/ {
root /www/root/html/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。

其中root可以换成alias:

1
2
3
location ^~ /t/ {
alias /www/root/html/new_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和上面的有一点不同
下面演示一下:
image.png
image.png
符合我们的解释

以上就是动静分离的简单演示拉,还是很实用的感觉!
这里不得不说一下视频里的弹幕都是一些没脑子的人真的我草,我一开始不知道root和alias的区别,看弹幕一堆nt说什么root是根目录,我开弹幕的原因是觉得会有人给出解释,而不是看到一群傻子在这里乱说话。实践是检验真理唯一标准

高可用模式

image.png
(1):需要2台nginx服务器
(2):需要keepalive
(3):需要虚拟ip

先开两个虚拟机吧,克隆一个

https://blog.csdn.net/weixin_43938497/article/details/109227139

更改配置文件

配置文件的位置在/usr/local/keepalived-2.0.20/keepalived/etc/keepalived/keepalived.conf

首先先把keepalived.conf文件拷贝一分下来放到windows操作,配置更改为:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

! Configuration File for keepalived

global_defs {
notification_email {
#[email protected] # 此处填写你的邮箱
}
#notification_email_from [email protected]
#smtp_server 127.0.0.1
#smtp_connect_timeout 30
router_id LVS_DEVEL # 这里有些说两台机器要一致,有些说不能一样,我是保持一样,也成功了,后面可以详细了解,有了解的也可以说一下
}

vrrp_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 "" #当前节点出现故障时,执行脚本
}

我草给我整吐了,全是centos演示不照顾一下debian的我搞你妈,下面是一些坑:

然后在/etc/keepalived/目录下创建一个check_nginx.sh文件

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 该脚本为检查NGINX服务的脚本,也可以根据自己的需求修改
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then

/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi

接下来运行一下keepalive和nginx
由于我们是源码安装keepalived的不能用systemctl去启动,只能手动去/usr/local/sbin/keepalived去开启
接着在主机去访问虚拟ip:
image.png
成功访问了
接着我们停掉主机的nginx和keepalived,再访问一下看看:
image.png
仍然可以,高可用模式成功

配置文件讲解

vim/etc/host可以更改服务器名字
image.png

nginx的原理解析

  1. master和workder

image.png
master相当于管理员,worker相当于普通用户
image.png

  1. worker是如何工作的

image.png
不同的worker通过争抢的方式来处理

  1. 一个master多个worker的好处

(1) 可以使用./nginx -s reload 热部署
(2) 每个worker是独立进程,如果其中一个worker倒了,其他继续争抢,不造成中断

  1. 设置多少个worker合适

nginx同redis类似,采用io多线路复用机制,使得性能最佳
当worker数和cpu数相同是最合适的

结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束结束

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#开发