Skip to content

一,相关命令

cmd命令框重启nginx:nginx -s reload

二,代理:

  1. ,代理的概念:

举例:win+r进入cmd进入命令框当输入 ping baidu.com时(如下图)

此时,可以理解为39.156.70.37就是百度的ip地址吗???

答案:NONONO!!!!!!这是百度他的代理地址(不会傻乎乎的把地址给别人)

  1. ,nginx正向代理:

正向代理就是位于客户端与原始服务器之前的服务器,为了从原始服务器取得内容,客户端向代理对象发送一个请求并指定目标(原始服务器)然后代理对象向原始服务器提交请求并获取内容返回客户端,此时成为正向代理

速记:正向代理主要是由客户端配置的代理,侧重的是客户端通过代理对象解决问题:例如:缓存,隐藏客户端id

  1. ,nginx反向代理:

反向代理就是:反向代理服务器位于用户一目标用户之间,但是对于用户而言反向代理就相当于目标服务器,即用户直接访问反向代理服务器就可获得目标服务器资源,同时用户不知道目标服务器地址,也无需在用户端作任何设定,反向代理服务器通常可用来作为web服务器加速,及使用反向代理作为web服务器的前置来降低网络和服务器的负载,

速记:反向代理通常主要是服务器配置的代理,侧重点是通过反向代理实现负载均衡和隐藏服务端真实访问地址

  1. ,nginx负载均衡

负载均衡( Load Balance )其意思就是分摊到多个操作单元上进⾏执⾏,例如 Web 服务器、 FTP 服务器、企业关键 应⽤服务器和其它关键任务服务器等,从⽽共同完成⼯作任务。 客⼾端发送多个请求到服务器,服务器处理请求,有⼀些可能要与数据库进⾏交互,服务器处理完毕后,再将结果返 回给客⼾端。 这种架构模式对于早期的系统相对单⼀,并发请求相对较少的情况下是⽐较适合的,成本也低。但是随着信息数量的 不断增⻓,访问量和数据量的⻜速增⻓,以及系统业务的复杂度增加,这种架构会造成服务器相应客⼾端的请求⽇益 缓慢,并发量特别⼤的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何 解决这种情况呢? 我们⾸先想到的可能是升级服务器的配置,⽐如提⾼ CPU 执⾏频率,加⼤内存等提⾼机器的物理性能来解决此问题, 但是我们知道摩尔定律的⽇益失效,硬件的性能提升已经不能满⾜⽇益提升的需求了。最明显的⼀个例⼦,天猫双⼗ ⼀当天,某个热销商品的瞬时访问量是极其庞⼤的,那么类似上⾯的系统架构,将机器都增加到现有的顶级物理配 置,都是不能够满⾜需求的。那么怎么办呢? 上⾯的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法⾏不通了,那么横向增 加服务器的数量呢?这时候集群的概念产⽣了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各 个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器, 也就是我们所说的负载均衡

  1. ,nginx动静分离

动静分离是指在 web 服务器架构中,将静态⻚⾯与动态⻚⾯或者静态内容接⼝和动态内容接⼝分开不同系统访问的架 构设计⽅法,进⽽提升整个服务访问性能和可维护性。

  1. ,nginx安装:

(1), 在linux中安装nginx :目前不安装,在linux中有Docker所以使用nginx 的话直接使用镜像安装即可

(2),在windows中安装nginx:暂时先不安装,之前有解压包,直接再次解压一份即可

  1. ,nginx相关命令

(1),在Linux下

(2),在windows下

  1. ,配置文件(以windows为例)

(1)第一部分:全局块

在nginx中打开conf文件夹中的nginx.conf文件

** user nobody **

主模块命令, 指定 Nginx 的 worker 进程运⾏⽤⼾以及⽤⼾组,默认由 nobody 账号运⾏。 ** worker_processes **

指定 nginx 要开启的进程数,单个节点的 nginx 启动有 1 个 master 进程和 n 个 worker 进程。 这⾥我们先查看 nginx 进程情况 ps -ef|grep nginx 可以尝试多配置⼏个进程,然后我们再次通过进程查看。

操作:

当是默认时:

A:配置文件信息为上图

B:从任务资源管理器产看worker进程数如下图( 1 个 master 进程和 1个 worker 进程):

当修改worker_processes的值为10时

A:配置文件信息如下图:

B:从任务资源管理器产看worker进程数如下图( 1 个 master 进程和 1个 worker 进程):

**master进程介绍 **

( 1 )读取并验正配置信息;

( 2 )创建、绑定及关闭套接字( Socket )连接; 协议 地址 端⼝号

( 3 )启动、终⽌及维护 worker 进程的个数;

**worker进程介绍 10 **

( 1 )接收、传⼊并处理来⾃客⼾端的连接;

( 2 )提供反向代理及过滤功能;

( 3 ) nginx 任何能完成的其它任务;

** pid**

⽤来指定进程 id 的存储⽂件位置,注释的就是 pid 默认存储的位置。

pid可以指定(一般为master的线程PID)

默认在\nginx-1.22.0\logs文件夹下面的nginx.pid文件显示

可以在conf的文件夹中的nginx.conf文件中的pid设置

产看linux下的线程

log

⽇志存放路径和和⽇志级别的设定,这部分没有特殊情况默认也够⽤。

**(2) 第⼆部分:events块 **

events 块涉及的指令主要影响 Nginx 服务器与⽤⼾的⽹络连接,常⽤的设置包括是否开启对多 work process 下的⽹络连接进⾏序列化,是否 允许同时接收多个⽹络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时⽀持的最⼤连接数等。 ⽐如 worker_connections 1024; ⽀持的最⼤连接数为 1024

(3)http内容快

由上图可知: http 块⼜包括 http 全局块、 server 块。 http 全局块配置的指令包括⽂件引⼊、 MIME-TYPE 定义、⽇志⾃定 义、连接超时时间、单连接请求数上限等。

  1. , include

设置 nginx ⽀持的多媒体⽂件类型, mime.types 是引⽤ nginx 下的媒体类型⽂件。 路径在 config ⽬录下,可⾃⾏ 查看。 default_type 默认值为 application/octet-stream; 表⽰为⼆进制流传输(如果有别的类型在conf文件夹下的mime.types文件中添加就好)

  1. , default_type (默认)

默认值为 application/octet-stream; 表⽰为⼆进制流传输。

  1. , log_fomat 设置 log ⽇志格式 (默认就行)

  2. ,sendfile 发送⽂件 ( 默认开启 ) 简单来说就是启⽤ sendfile() 系统调⽤来替换 read() 和 write() 调⽤,减少系统上下⽂切换从⽽提⾼性能,当 nginx 是静态⽂件服务器时,能极⼤提⾼ nginx 的性能表现,⽽当 nginx 是反向代理服务器时,则没什么⽤了。 下⾯我们来分析⼀下这个 sendfile 的⼯作原理:

⼯作原理描述: sendfile = off 时,应⽤程序读取磁盘中的⽂件以字节流的形式从磁盘中加载⽂件,然后再将⽂件以字节流的形 式复制到内核中。内核在把⽂件推送到 NC 。

sendfile = on 时,应⽤程序直接向内核发送指令,让内核去读⽂件。读完⽂件内核直接推送给 NC 。只有⼀次复 制操作,实现异步⽹络 IO 形式。因此,性能会有很⼤的提升。 具体还要根据实际使⽤情况来配置 sendfile 。当读取服务不能解析⼤量的⽂件时。还是建议将 sendfile 配置为

**off tcp_nopush(默认on) **

tcp_nopush 只有在 sendfile 指令开启时才会⽣效, sendfile 允许 Nginx 直接在内核空间中从⼀个⽂件描 述符(⽂件)将数据复制到另⼀个⽂件描述符(⽹络套接字),避免了在⽤⼾空间的来回拷⻉,效率极⾼。 当 tcp_nopush on 开启时, Nginx 会尝试将响应头和起始数据(⽐如⽂件的开头部分)整合在⼀个 TCP 数据包中 ⼀起发送。

它会等待,直到数据积累到⼀个 Maximum Segment Size (MSS) 的⼤⼩后,再发送⼀个数据包。 MSS 通常是⽹ 络路径的 MTU (最⼤传输单元)减去 TCP/IP 头部信息后的⼤⼩(⼤约 1460 字节)。⽬的是尽可能填满每个⽹络 数据包,减少发送⼤量⼩数据包(例如只有 HTTP 头的数据包,或者只有⼏字节⽂件数据的数据包)的情况,从⽽减 少⽹络拥堵。

⼀个⽣动的⽐喻:寄信

没有 tcp_nopush :你有⼀封信( HTTP 头)和⼀本⼿册(⽂件数据)。你先⽤⼀个信封只寄那封信,然后⼜⽤⼀⼤堆 信封分很多次寄那本⼿册的每⼀⻚。邮费(⽹络开销)很⾼,邮局(⽹络)也很忙。

有 tcp_nopush :你试图把信和⼿册的前⼏⻚塞进第⼀个信封,直到塞满。后⾯的信封也尽量塞满⼿册的⻚数。这 样使⽤的信封总数更少,效率更⾼,邮局的负担也更⼩。

**tcp_nodelay **

tcp_nopush 和另⼀个指令 tcp_nodelay ⼀起出现。它们看似⽭盾,但实际上可以完美协作,通常⽤于以下配 置:

keepalive_timeout (默认 65 )

keepalive 是⻓连接的意思。客⼾端发起 http 请求前需要先与服务端建⽴ TCP 连接,每次 TCP 连接都需要三次握⼿来 确定,三次交互不仅会增加消费时间,还会增加⽹络流量。 http 请求是请求应答式,如果能知道每个请求头与响应体 的⻓度,就可以在⼀个连接上执⾏多个请求,这个就是所谓的⻓连接。

注意: keepalive 是 tcp 层⻓连接探活机制; keep-alive 是应⽤层 http 协议使⽤,在其头部 Connection 字段中 的⼀个值,只是代表客⼾端与服务之间需要保持⻓连接,可以理解为通过此字段来告诉 nginx 此连接需要维持⻓连 接,处理完别直接关闭连接。

**gzip [on | off( 默认 ) ] **

启⽤ Gzip 压缩功能, 可以使⽹站的 css 、 js 、 xml 、 html 等静态资源在传输时进⾏压缩,经过 Gzip 压缩后资源 可以变为原来的 30% 甚⾄更⼩,尽管这样会消耗⼀定的 cpu 资源,但是会节约⼤量的出⼝带宽来提⾼访问速度

Gzip 的压缩⻚⾯需要浏览器和服务器双⽅都⽀持,实际上就是服务器端压缩,传到浏览器后解压并解析。浏览器那 ⾥不需要我们担⼼,因为⽬前的⼤多数浏览器都⽀持解析 Gzip 。

注意:不建议压缩图⽚和⼤⽂件:图⽚如 jpg 、 png ⽂件本⾝就会有压缩,所以就算开启 gzip 后,压缩前和压缩后⼤ ⼩没有多⼤区别,所以开启了反⽽会⽩⽩的浪费 CPU 资源。(如果优化可以可以图⽚的⽣命周期设置⻓⼀点,让客⼾端 来缓存) ⽽⼤⽂件资源会消耗⼤量的 cpu 资源,且不⼀定有明显的效果。

配置后可以通过浏览器 ResposeHeader 中查看是否启⽤压缩。

**server内容块 **

每个 http 块可以包括多个 server 块,⽽每个 server 块就相当于⼀个虚拟主机。⽽每个 server 块也分为 全局 server 块,以及可以同时包含多个 locaton 块 , 具体结构信息反向代理中在学习。

** listen **

表⽰监听的端⼝号,这个端⼝就是访问 nginx 时候使⽤的, 80 是默认端⼝,访问时候可以省略。也可以配置其他端 ⼝

**server_name **

Nginx 中的 server_name 指令主要⽤于配置基于名称的虚拟主机,如果没有多配置的情况下,名称可以随意指定⼀ 个就⾏

location

这⾥主要配置需要访问的资源地址, root 表⽰哪个⽂件夹。 index 表⽰访问的缺省⽹⻚是哪⼀个。如果⾛代理,则配 置修改为 proxy_pass ⽅式 error_page 配置异常信息访问地址

正向代理

在前⾯的案例中, 我们了解了 nginx 作为静态服务器时的应⽤,如果作为静态服务器,则 nginx 也只是起到了运⾏ 静态资源的⽤。如何通过 nginx 实现正向代理呢?

⽐如:我想百度点隐私问题- !,想通过 nginx 正向代理实现对百度的访问,这样百度向上记录 ip 的时候就只能记 录 nginx 服务器的 ip 地址,⽽不能知道真实访问的 ip 地址了。

⽬前访问 nginx 是这样的,如果访问这个地址直接显⽰的是百度搜索,那就证明成功了

添加正向代理配置文件(如下)

启动nginx在浏览器访问http://localhost/ 就会出现代理访问百度

反向代理:

我们通过反向代理让 nginx 代理 tomcat 服务器,如果 tomcat 已经有运⾏的项⽬,那么我们也可以通过 ip+ 端⼝直接 访问,也可以通过 nginx 访问,如果通过 nginx 我们就能隐藏掉真实的项⽬ ip ,还可以实现负载均衡。

首先配置跟上述正向代理一样的配置

就是思想不一样:

例如:给傲哥的项目做反向代理(地址:http://201.201.201.15:8080/abc/)如下图

那么在配置文件中配置如下:

再次访问我本机http://localhost/abc/ 或者127.0.0.1/abc/时候如下

代理多个地址时

那么在配置文件中配置如下:

负载均衡实现

在配置文件中修改

负载均衡策略

(1)加权

加权轮询策略weight 通过加⼊ weight 的值进⾏加权处理,权重值越⼤,服务器越容易被访问,因此,性能好的服务器应适当加⼤权重值

(2)哈希

哈希策略 ip_hash 策略能够将某个客⼾端 IP 的请求固定到同⼀台服务器上,例如 A ⽤⼾访问服务器,通过固定算法后,被固 定到 192.168.136.136 的 web 服务器上,那么,⽤⼾ A 下次访问时,依旧会到访问 192.168.136.136 服务 器。因此,该策略解决了多台服务器 Session 不共享的问题【因为不同的客⼾端会被分到不同的服务器,且之后这种 对应关系是不变的】

该算法不能保证服务器的负载均衡,可能存在个别服务器访问量很⼤,很⼩的情况 .

(3) least_conn 策略

最少连接,把请求转发给连接数最少的服务器。 轮询算法 / 轮询加权算法会把请求按照⼀定⽐例分发请求到各服务器上,但是,有些请求占⽤时间⻓,如果把这些响应 占⽤时间⻓的请求⼤⽐例发送到了某⼀台服务器,那么这台服务器随着时间的增加会负载⽐较⾼【因为响应较⻓的请 求还没处理完,新的请求⼜来了,在这种情况下,采⽤ least_conn 的⽅式是最适合的,它能达到更好的负载均衡

此负载策略适合⽤于,请求处理时间⻓短不⼀造成服务器过载的情

(4) 智能的fair 策略

fair nginx 默认不⽀持,需下载第三⽅模块采⽤的不是固定的轮询算法进⾏负载均衡,⽽是智能的根据⻚⾯⼤⼩、 加载时间⻓短进⾏负载计算 .

** 动静分离配置 **** **

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态⻚⾯和 静态⻚⾯物理分离。严 格意义上说应该是动态请求跟静态请求分开,可以理解成使⽤ Nginx 处理静态⻚⾯, Tomcat 处理动态⻚⾯。动静 分离从⽬前实现⻆度来讲⼤致分为两种: ⼀种是纯粹把静态⽂件独⽴成单独的域名,放在独⽴的服务器上,也是⽬前主流推崇的⽅案; 前后端分离。 另外⼀种⽅法就是动态跟静态⽂件混合在⼀起发布,通过 nginx 来分开

在nginx中的conf文件夹中的nginx.html文件中配置

** nginx⾼可⽤集群 :**

** 集群原理 :**为了防⽌当 Nginx 代理服务器挂掉了后⾯的服务就都没有办法访问了。所有就引出了⾼可⽤集群。下⾯的实例将配置 ⼀主⼀从的⾼可⽤集群


认识 Keepalived :

Keepalived 是⼀个免费开源的,⽤ C 编写的类似于 layer3, 4 & 7 交换机制软件,具备我们平时说的第 3 层、第 4 层和第 7 层交换机的功能。主要提供 loadbalancing (负载均衡)和 high-availability (⾼可⽤)功能,负载 均衡实现需要依赖 Linux 的虚拟服务内核模块( ipvs ),⽽⾼可⽤是通过 VRRP 协议实现多台机器之间的故障转移服 务。

Keepalived 是⼀款服务器状态检测和故障切换的⼯具,起初是专为 LVS 负载均衡软件设计的,⽤来管理并监控 LVS 集群系统中各个服务节点的状态,后来⼜加⼊了可以实现⾼可⽤的 VRRP (Virtual Router Redundancy Protocol , 虚拟路由器冗余协议)功能。

因此, Keepalived 除了能够管理 LVS 软件外,还可以作为其他服务(例如: Nginx 、 Haproxy 、 MySQL 等)的⾼可 ⽤解决⽅案软件在其配置⽂件中,可以配置主备服务器和该服务器的状态检测请求。也就是说 keepalived 可以根据 配置的请求,在提供服务期间不断向指定服务器发送请求,如果该请求返回的状态码是 200 ,则表⽰该服务器状态是 正常的,如果不正常,那么 Keepalived 就会将该服务器给下线掉,然后将备⽤服务器设置为上线状态,⽽当主服务 器节点恢复时,备服务器节点会释放主节点故障时⾃⾝接管的 IP 资源及服务,恢复到原来的备⽤⻆⾊。

**服务器安装 keepalived **

yum install keepalived -y 、

# 查看版本:

rpm -q -a keepalived

如下图表示安装完成:

搭建集群:

(1)原理:首先需要在vm虚拟机中克隆一下虚拟(要求ip地址不一样即可)

VM 系统-> 右键-> 管理-> 克隆-> 完全克隆

(2)配置ip:原始 OS ip 地址为 192.168.25.3 克隆新配置 ip 为 192.168.25.4

输⼊ cd /etc/sysconfig/network-scripts/ 进⼊到此⽬录下,可以看到 ifcfg-ens33 ⽂件

重启⽹卡 service network restart

两个 os 全部启动,并通过⼯具连接,因为是克隆的,所以默认 nginx 是安装好的。

** 配置keepalived ** :

修改 /etc/keepalived/keepalivec.conf 配置⽂件,主从模式主要在这个⽂件⾥配置。

(命令: cd /etc/keepalived/)

如果有两个 nginx ,⼀个作为主机,⼀个作为备机,如果备机故障,主机可以提供服务,如果主机故障,备机⼀样可 以提供服务。

** ****主机配置 **

plain
vrrp_script chk_nginx_up_down {
 script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自
动开启服务
 interval 2 #检测时间间隔
 weight 2 #如果条件成立的话,则权重 +2
 }
 # 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
 state MASTER #来决定主从BACKUP
 interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
 virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样
 mcast_src_ip 192.168.25.3 #填写本机ip
 priority 100 # 节点优先级,主要比从节点优先级高
 #nopreempt # kl有两种模式-抢占模式和非抢占模式 - nopreempt表示不抢占,50在哪谁就是master节点
 advert_int 1 # 心跳监测间隔,两个节点设置必须一样,默认 1s
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 # 将 track_script 块加入 instance 配置块
 track_script {
 chk_nginx_up_down #执行 Nginx 监控的服务
 }

 virtual_ipaddress {
 192.168.25.50 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
 }
}

如下图:

备机配置:

plain
vrrp_script chk_nginx_up_down {
 script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
 interval 2 #检测时间间隔
 weight 2 #如果条件成立的话,则权重 +2
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
 state BACKUP #来决定主从BACKUP
 interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
 virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样
 mcast_src_ip 192.168.25.4 #填写本机ip
 priority 90 # 节点优先级,主要比从节点优先级高
 #nopreempt # kl有两种模式-抢占模式和非抢占模式 - nopreempt表示不抢占,50在哪谁就是master节点
 advert_int 1 # 心跳监测间隔,两个节点设置必须一样,默认 1s
 authentication {
 auth_type PASS
 auth_pass 1111
 }

 # 将 track_script 块加入 instance 配置块
 track_script {
 chk_nginx_up_down #执行 Nginx 监控的服务
 }

 virtual_ipaddress {
 192.168.25.50 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
 }
}

如下图:

在两个系统 /etc/keepalived/ 添加检测脚本 nginx_check.sh

备机配置:

plain
 #!/bin/bash
 A=`ps -C nginx --no-header |wc -l`
 #判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
 # nginx的启动目录
/usr/local/nginx/sbin/nginx
 # 等待3秒再次检查nginx,如果没有重启成功,则停止keepalived,使其启动备用机
sleep 3
 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
 kill keepalived
 fi
 fi

给分别给两台 nginx_check.sh 这个脚本指定权限

(指定权限命令: chmod +x /etc/keepalived/nginx_check.sh )

启动观测:(主机与备机都输入启动)

systemctl start keepalived.service

访问http://192.168.25.3/ 以及http://192.168.25.4/ 以及 http://192.168.25.50/ 如下图

宕机测试:

(1)测试主机 KAL 关闭后是够能否故障转移 ( 启⽤备机 )

systemctl stop keepalived.service

再次访问:http://192.168.25.50/ (转移至备用机)

(2)启用主机(命令:systemctl restate keepalived.service)

访问:http://192.168.25.50/ (转移至子主机)

设置keepalived开机自启动(systemctl enable keepalived.service )

验证石否开机自动启动: (systemctl is-enabled keepalived.service )会显示如下图