Nginx-all

1.路线

image-20221127212439754

2.概述

Nginx338931是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文: PaM6nep)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强。事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nainx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx作用场景

  • 高性能的静态WEB服务器

  • 反向代理服务

  • API服务

Http请求的全流程剖析

image-20221127224609803

Nginx处理请求的过程

image-20221127224743146

优势优点

  • 高并发、高性能

  • 扩展性好

  • 异步非阻塞的事件驱动模型

  • 高可靠性

常用版本

  1. Nginx开源版

  2. Nginx plus商业版

  3. Openresty

  4. Tengine

2.1.I/O

2.1.1.阻塞IO模型

2.1.2.非阻塞模型

2.1.3.IO多路复用模型

2.1.4.信号驱动IO模型

2.1.5.异步IO模型

2.2.IO模型

3.下载nginx

rpm安装Nginx

  1. 使用tar -zxvf +包名:解压源码包

  2. 下载nginx相关依赖:yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

  3. 进入解压后的目录,进行nginx初始化配置:./configure --with-http_ssl_module

  4. make

  5. make install

    --prefix=PATH:指定 nginx 的安装目录(默认/usr/local/nginx) --conf-path=PATH:指定 nginx.conf 配置文件路径 --user=NAME:nginx 工作进程的用户 --with-pcre:开启 PCRE 正则表达式的支持 --with-http_ssl_module:启动 SSL 的支持 --with-http_stub_status_module:用于监控 Nginx 的状态 --with-http-realip_module:允许改变客户端请求头中客户端 IP 地址 --with-file-aio:启用 File AIO --add-module=PATH:添加第三方外部模块

yum安装nginx

  1. yum -y install epel-release:安装epel源

  2. yum list|grep nginx:查看可yum的包

  3. yum install nginx:下载nginx

  4. rpm -ql nginx:列出所有的nginx文件

    /etc/nginx/nginx.conf:nginx配置文件

    /var/log/nginx/access.log:访问记录日志 /var/log/nginx/error.log:错误日志

  • systemctl start nginx:启动nginx服务

这时候在浏览器里输入ip地址就可以访问了,注意关闭防火墙

4.Nginx进程结构

image-20221129202338962

常用Linux信号量管理机制

信号量
作用

SIGCHLD -17

终止子进程后发送信息给父进程

SIGTERM -15

允许进程完成工作后终止,相当于kill

SIGKILL -9

强制退出

SIGHUP -1

重新读取配置文件

SIGUSR1 -10

用户自定义信号量,重读日志,在日志按月/日分割时有用

SIGUSR2 -12

用户自定义信号量,平滑的升级时有用

SIGWINCH

Gracefully shutdown the worker processes 优雅关闭旧的进程(配合USR2来进行升级)

4.1.配置文件重载的原理真相

reload重载配置文件的流程

  1. 向master进程发送HUP信号(reload命令)

  2. master进程检查配置语法是否正确

  3. master进程打开监听端口

  4. master进程使用新的配置文件启动新的worker子进程

  5. master进程向老的worker子进程发送QUIT信号

  6. 旧的worker进程关闭监听句柄,处理完当前连接后关闭进程

image-20221204135142195

4.2.Nginx的热部署

热升级的流程

  1. 将旧的nginx文件替换成新的nginx文件

  2. 向master进程发送USR2信号

  3. master进程修改pid文件,加后缀.oldbin

  4. master进程用新的nginx文件启动新master进程

  5. 向旧的master进程发送WINCH信号,旧的worker子进程退出

  6. 确认上线功能无误后,向旧master进程发送QUIT信号

  7. 回滚情形:向旧master发送HUP,向新的master发送QUIT

image-20221204140159328

4.3.Nginx的模块化管理机制

模块结构图

image-20221204143331974

模块体系结构

image-20221204143855573

4.4.nginx编译安装的配置参数

参数
含义

--prefix

指定安装的目录

--user

运行nginx的worker子进程的属主

--group

运行nginx的worker子进程的属组

--pid-path

存放进程运行pid文件的路径

--conf-path

配置文件nginx.conf的存放路径

--error-log-path

错误日志access.log的存放路径

--http-log-path

访问日志access.log的存放路径

--with-pcre

pcre库的存放路径,正则表达式会用到

--with-zlib

zlib库的存放路径,gzip模块会用到

内置参数默认原则

  1. 显示加上,默认不内置

    • --with

  2. 显示去掉,默认内置

    • --without

4.5.Nginx配置文件结构

配置文件结构

image-20221204152850879

nginx的配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块¹²³。下面是各个块的内容简介:

  • 全局块:位于配置文件的最前面,影响nginx服务器的整体运行。主要设置一些影响nginx服务器整体运行的配置指令,例如worker进程的数量、日志文件的位置、pid文件的位置等。

  • events块:位于全局块之后,主要影响nginx服务器与用户的网络连接。主要设置一些有关网络连接方面的配置指令,例如每个worker进程支持的最大连接数、是否开启多路复用等。

  • http块:位于events块之后,是配置最频繁的部分。主要设置一些影响http协议相关功能和性能的配置指令,例如是否开启gzip压缩、是否开启缓存、是否开启反向代理和负载均衡等。在http块中,又可以包含多个server块和upstream块。

    • server块:表示一个虚拟主机或者一个网站。可以在一个http块中定义多个server块,每个server块都有自己独立的域名、端口号、根目录等属性。在server块中,又可以包含多个location块。

    • location 块:表示一个URL匹配规则或者一个目录路径。可以在一个server 块中定义多个location 块,每个location 块都有自己独立的匹配规则、访问权限、缓存策略等属性。

    • upstream 块:表示一个后端服务器组或者一个负载均衡器。可以在一个http 块中定义多个upstream 块,每个upstream 块都有自己独立的名称、负载算法、后端服务器列表等属性。

4.6.虚拟主机的分类

  • 基于多IP的虚拟主机

  • 基于多端口的虚拟主机

  • 基于域名的虚拟主机

基于多IP的虚拟主机

  1. 为虚拟机添加多张网卡

  2. 配置nginx配置文件的监听端口为不同ip地址

  3. 修改相对于监听端口的响应页面

基于多端口的虚拟主机

  1. 配置nginx配置文件的监听端口

  2. 修改相对于监听端口的响应页面

基于域名的虚拟主机

  1. 配置nginx配置文件的服务域名

  2. 修改相对于域名的响应页面

当响应页面中有中文时,需要设置charset utf-8,设置编码格式

当reload执行后,如果请求页面的数据没有更改,页面请求会读取缓存中的数据,所以要使用crtl F5强制刷新

4.6.1.关于页面缓存问题

当浏览器访问的服务器没有设置缓存时,浏览器先200 OK from memory cache,如果浏览器缓存中没有该文件,那么浏览器会200 OK from disk cache 从磁盘中找改文件,如果还找不到,浏览器会从服务端请求该文件下载使用。

  1. Last-Modified/If-Modified-Since

    • 当浏览器第一次请求一个url时,服务器端的返回状态码为200,同时HTTP响应头会有一个Last-Modified标记着文件在服务器端最后被修改的时间。

    • 浏览器第二次请求上次请求过的url时,浏览器会在HTTP请求头添加一个If-Modified-Since的标记,用来询问服务器该时间之后文件是否被修改过。如果没有被修改过,响应页面会直接从浏览器缓存中拿

  2. Etag/If-None-Match

    • 当浏览器请求一个url时,HTTP响应头会有一个Etag,存放着服务器端生成的一个序列值。

  3. Etag和Last-Modified特点:

    1. 它们都属于协商缓存,对内容的有效性进行验证。

    2. Etag的值通常为文件内容的哈希值;而Last-Modified为最后修改的时间。

    3. Last-Modified只能精确到秒,秒之内的内容更新Etag才能检测。

    4. 文件有时会定时重新生成相同内容,Last-Modified不能很好辨别,某些服务器甚至不能精确的得到文件的最后修改时间。

    5. Etag每次服务端生成都需要进行读写操作,而Last-Modified只需要读取操作,Etag的消耗是更大的。

    6. Etag更像是Last-Modified的一种补充、完善。

5.Nginx基础应用

5.1.配置文件main段核心参数用法

  • 配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  • user username [GROUP]

    • 指定运行nginx和worker子进程的属主和属组(可以不指定)

  • pid DIR

    • 指定运行nginx的master主进程的pid文件存放路径

  • worker_rlimit_nofile number

    • 指定worker子进程可以打开的最大文件句柄数

  • worker_rlimit_core size:指定worker子进程异常终止后的core文件,用于记录分析问题

  • working_directory dir:用于指定core文件写入位置

  • worker_processes number|auto

    • 指定nginx启动的worker子进程数量

  • worker_cpu_affinity cpumask1 cpumask2....

    • 将每个worker子进程与我们的cpu物理核心绑定

  • worker_priority number

    • 指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为负值,以优先调用nginx

  • worker_shutdown_timeout time

    • 指定worker子进程优雅退出时的超时时间

  • timer_resolution time

    • worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,用户态和内核态切换越少,有利于性能提升,反之,系统调用越多,性能下降

    image-20221204211326649
  • daemon on|off

    • 设定nginx的运行方式,前台还是后台,前台用户调式,后台用于生产

  • lock_file

    • 负载均衡互斥锁文件存放路径

    • 推荐logs/nginx.lock

5.2.events核心参数

  • 配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  • use select|poll|kqueue|epoll|/dev/poll|eventport

    • nginx使用何种时间驱动模型

    • 推荐不指定,让nginx自己选择

  • worker_connections number

    • worker子进程能够处理的最大并发连接数

    • 推荐配置:65535/worker_processes|65535

  • accept_mutex on|off

    • 是否打开负载均衡互斥锁

    • 推荐打开

  • accept_mutex_delay time

    • 新链接分配给worker子进程的超时时间

    • 推荐200ms

  • muti_accept on/off

    • worker子进程可以一次性接收多个的新链接个数

    • 推荐打开

5.3.http核心参数

  • 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

5.3.1.server_name

  • server块:配置虚拟主机的相关参数,一个http中可以有多个server。

指令用法

语法:server_name name1 *name2 name3......;

指令用法优先级

  1. 多域名如何匹配

    image-20221204221449535

5.3.2.root与alias用法区别

root

语法:root path

上下文:http server location if

alias

语法:alias path

上下文:location

共同点与区别

  • 相同点:URL到磁盘文件的映射

  • 区别:root会将定义路径与URL叠加;alias则只取定义路径

注意事项

  • 使用alias时,末尾一定要加/

  • alias只能位于location块中

5.3.3.location

  • 配置请求的路由,以及各种页面的处理情况。

基础用法

  • 语法:[=|~|~*|^~] uri {...}

  • 作用:根据请求URI设置配置

  • 上下文:server location

匹配规则
含义
示例

=

精确匹配

location = /images/{...}

~

正则匹配,区分大小写

location ~\ .(jpg|gif)${...}

~*

正则匹配,不区分大小写

location ~*\ .(jpg|gif)${...}

^~

匹配到即停止搜索

location ^~/images/{...}

不带任何符号

location / {...}

location规则的匹配顺序

image-20221204230452032

深入理解location中URL结尾的反斜线

  • location参数中不带index参数

  • 不带/

    • 例如/text

    • 先将text当做文件夹处理,默认找index.html文件。如果文件夹里面没有东西,则在root参数目录里找text文件。如果都没有则返回404

  • 带/

    • 例如/text/

    • 先将text当做文件夹处理,如果文件夹里面没有东西,直接返回404

5.3.4.stub_status模块

用法

  • 指令:stub_status;

  • 上下文:server location

  • 默认是不带这个模块的,要在编译时带上

  • 若要加装模块,只要重新配置编译安装就行

状态项

状态项
含义

Active Connections

活跃的连接数量

accepts

接受的客户端连接总数量

handled

处理的客户端连接总数量

requests

客户端总的请求数量

Reading

读取客户端的连接数

Writing

响应数据到客户端的连接数

Waiting

空闲客户端请求连接数量

5.3.5.压缩和第三方模块

6.HTTP核心模块-Nginx应用进阶

connection和request

  • connection是连接,即常说的tcp连接,三次握手,状态机

  • request是请求,例如http请求

  • request是必须建立在connection之上

image-20221207132510020

6.1.对连接数做限制的limit_conn模块

  • 用于限制客户端并发连接数

  • 默认编译进nginx,通过--without-http_limit_conn_module禁用

  • 使用共享内存,对所有worker子进程生效

常用指令

  • limit_conn_zone

  • limit_conn_status

  • limit_conn_log_level

  • limit_conn

6.2.对request处理速率做限制的limit_req模块

  • 用于限制客户端处理请求的平均速率

  • 默认编译进nginx,通过--without-http_limit_req_module禁用

  • 使用共享内存,对所有worker子进程生效

  • 限流算法:leaky_bucket

image-20221207214927100

常用指令

  • limit_req_zone

  • limit_req_status

  • limit_req_log_level

  • limit_req

6.3.限制特定IP或网段访问的access模块

  • 默认编译进nginx

常用指令

  • allow

  • deny

  • 示例

6.4.限制特定用户访问的auth_basic模块

  • 基于HTTP Basic Authentication协议进行用户名密码认证

  • 默认编译进nginx

  • 该模块允许通过使用HTTP 基本身份验证协议验证用户名和密码来限制对资源的访问。

常用指令

  • auth_basic

  • auth_basic_user_file

  • 生成密码文件工具

    • 可执行程序:htpasswd

    • 所属软件包:httpd-tools

    • 安装:yum install -y httpd-tools

    • 生成新的密码文件:htpasswd -bc encrypt_pass jack 123456

    • 添加新用户密码:htpasswd -b encrypt_pass mike 123456

  • 默认秘钥文件在conf目录下,如果想放在其他路径需要写绝对路径

6.5.auth_request模块

  • 不是默认编译的,需要--with-http_auth_request_module

  • 基于子请求收到的HTTP响应码做访问控制

image-20221208112531939

常用指令

  • auth_request

  • auth_request_set

  • 示例

6.6.rewrite模块

return指令

  • 停止处理请求,直接返回响应码或重定向到其他URL

  • 执行return指令后,location中后续指令将不会被执行

HTTP状态码

1xx

消息类

2xx

成功

3xx

重定向

4xx

客户端错误

5xx

服务器错误

重定向状态码

  • HTTP 1.0

    • 301:永久重定向

    • 302:临时重定向,禁止被缓存

  • HTTP 1.1:

    • 303:临时重定向,禁止缓存,允许改变方法

    • 307:临时重定向,禁止缓存,不允许改变方法

    • 308:永久重定向,不允许改变方法

rewrite指令

  • 根据指定正则表达式匹配规则,重写URL

rewrite指令加了flag参数则不执行rewrite指令后面的参数直接跳转,如不加则顺序执行完后跳转

if指令

condition

$variable

进位变量时,值为空或以0开头字符串都会被当做false处理

=或!=

相等或不相等

~或~

正则匹配或非正则

~*

正则匹配,不区分大小写

-f或!-f

检查文件存在或不存在

-d或!-d

检查目录存在或不存在

-e或!-e

检查文件、目录、符号链接等存在或不存在

-x或!-x

检查文件夹可执行或不可执行

6.7.autoindex模块

  • 用户请求以/结尾时,列出目录结构

  • autoindex

  • autoindex_exact_size

  • autoindex_format

  • autoindex_localtime

6.8.Nginx变量分类

image-20230307215718404
  1. TCP连接变量

  2. HTTP请求变量

  3. Nginx处理HTTP请求产生的变量

  4. Nginx返回响应变量

  5. Nginx内部变量

6.8.1.TCP连接变量

变量名
含义

remote_addr

客户端IP地址

remote_port

客户端端口

server_addr

服务端IP地址

server_port

服务端端口

server_protocol

服务端协议

binary_remote_addr

二进制格式的客户端IP地址,四个字节

connection

TCP连接的序号,递增

connection_request

TCP连接当前的请求数量

proxy_protocol_addr

若使用了proxy_protocol协议,则返回协议中地址,否则返回空

proxy_protocol_port

若使用了proxy_protocol协议,则返回协议中端口,否则为空

6.8.2.HTTP请求过程相关变量

变量名
含义

uri

请求的URL,不包含参数

request_uri

请求的URl,包含参数

scheme

协议名,http或https

request_method

请求方法

request_length

全部请求的长度,包括请求行、请求头、请求体

args

全部参数字符串

arg_参数名

特定参数值

is_args

URL中有参数,则返回?;否则返回空

query_string

与args相同

remote_user

由HTTP Basic Authentication协议传入的用户名

特殊变量

host

先看请求行,再看请求头,最后找server_name

http_user_agent

用户浏览器

http_referer

从那些链接过来的请求

http_via

经过一层代理服务器,添加对应代理服务器的信息

http_x_forwarded_for

获取用户真实IP

http_cookie

用户cookie

6.8.3.处理HTTP请求变量

变量名
含义

request_time

处理请求已耗费的时间

request_completion

请求处理完成返回OK,否则返回空

server_name

匹配上请求的server_name值

https

若开启https则返回on,否则返回空

request_filename

磁盘文件系统待访问文件的完整路径

document_root

由URI和root/alias规则生成的文件夹路径

realpath_root

将document_root中的软链接换成真实路径

limit_rate

返回响应时的速度上限值

7.反向代理

7.1.反向代理基础原理

  • 反向代理服务器介于用户和真实服务器之间,提供请求和响应的中转服务

  • 对于用户而言,访问反向代理服务器就是访问真实服务器

  • 反向代理可以有效减低服务器的负载消耗,提升效率

image-20221208123909132

反向代理优势

  • 隐藏真实服务器

  • 便于横向扩充后端动态服务

  • 静态分离,提升系统健壮性

7.2.动静分离

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

image-20221208124400268
image-20221208124555601
image-20230307215848953

7.3.使用nginx作为反向代理时支持的协议

image-20230307215917789

7.4.用于定义上游服务的upstream模块

  • 默认被编译进nginx

  • 用于定义上游服务的相关信息

    image-20230307220001836

常用指令

  • upstream

  • server

  • zone

  • keepalive

  • keepalive_requests

  • keepalive_timeout

  • queue

  • hash

  • ip_hash

  • least_conn

  • least_time

  • random

7.5.proxy_pass指令

  • 由http_proxy模块提供

  • 默认被编译进nginx

proxy_pass用法常见误区

  1. proxy_pass http://localhost:8080

    • 结尾不带/意味着nginx不会修改用户URL,而是直接传给上游的应用服务器

  2. proxy_pass http://localhost:8080/

    • 带/意味着nginx会修改用户URL,修改方法:将location后的URL从用户URL中删除

7.6.Nginx接受用户请求包体的处理方式

相关指令

  • proxy_request_buffering

  • client_max_body_size

  • client_body_buffer_size

  • client_body_in_single_buffer、

  • client_body_temp_path

  • client_body_in_file_only

  • client_body_timeout

7.7.代理场景下Nginx如何更改发往上游的请求

修改指令

  • proxy_method

  • proxy_http_version

  • proxy_set_header

  • proxy_pass_request_header

  • proxy_set_body

  • proxy_pass_request_body

7.8.Nginx与上游服务器建立连接细节

常用指令

  • proxy_connect_timeout

  • proxy_socket_keepalive

  • proxy_send_timeout

  • proxy_ignore_client_bort

7.9.四层反向代理

8.负载均衡

概念

  • 将请求代理到多台服务器去执行,就称之为负载均衡

  • 这里的多台服务器通常承担一样的功能任务

image-20230307220051966

8.1.负载均衡算法

哈希算法

  • 哈希算法时将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值我们称之为哈希值

  • 散落明文到哈希值的映射是不可逆的

image-20230307220232016

哈希指令

  • hash

ip_hash算法

  • ip_hash

最少连接数算法

  • 前几种算法都没有考虑过服务器的负载能力

  • 最少连接算法:从上游服务器,挑选一台当前已建立连接数最少的分配请求

  • 极端情形下退化为rr(轮询)算法

最少连接数算法

  • least_conn

  • zone

8.2.nginx针对上游服务器返回异常时的容错机制

  • proxy_next_upstream

    可选参数
    含义

    error

    向上游服务器传输请求或读取响应头发生错误

    timeout

    向上游服务器传输请求或读取响应头发生超时

    invalid_header

    上游服务器返回无效的响应

    http_500

    HTTP响应状态码为500

    http_502

    HTTP响应状态码为502

    http_503

    HTTP响应状态码为503

    non_idempotent

    非幂等请求(HTTP请求方法)失败时是否需要转发下一台上游服务器

    off

    禁用请求失败转发功能

  • proxy_next_upstream_timeout

  • proxy_next_upstream_triesnumber

  • proxy_intercept_error

8.3.fastcgi

9.缓存及HTTPS

9.0.文件缓存

9.1.缓存基础

image-20230307220319621
  • 客户端缓存

    • 优势:直接在本地获取内容,没有网络消耗,响应最快

    • 缺点:仅对单一用户生效

  • 服务端缓存

    • 优势:对所有用户生效;有效降低上游应用服务器压力

    • 缺点:用户仍然有网络消耗

相关指令

  • proxy_cache

  • proxy_cache_path

    参数
    含义

    path

    缓存文件的存放路径

    levels

    path的目录层级

    use_temp_path

    off直接使用path路径;on使用proxy_temp_path路径

    keys_zone

    name时共享内存名称;size是共享内存大小

    inactive

    在指定时间内没有被访问缓存会被清理;默认10分钟

    max_size

    设定最大的缓存文件大小,超过将由CM清理

    manager_files

    CM清理一次缓存文件最大清理文件数;默认100

    manager_sleep

    CM清理一次后进程休眠时间;默认200ms

    manager_threshold

    CM清理一次最长耗时;默认50ms

    loader_files

    CL载入文件到共享内存,每批最多文件数;默认100

    loader_sleep

    Cl加载缓存文件到内存后,进程休眠时间;默认200ms

    loader_threshold

    CL每次载入文件到共享内存的最大耗时;默认50ms

  • proxy_cache_key

  • proxy_cache_valid

  • upstream_cache_status变量:上游缓存状态

    • MISS:未命中缓存

    • HIT:命中缓存

    • EXPIRED:缓存过期

    • STALE:命中了陈旧缓存

    • REVALIDDATED:Nginx验证陈旧缓存依旧有效

    • UPDATING:内存陈旧,正在更新

    • BYPASS:响应从原始服务器获取

缓存示例

9.2.配置Nginx不缓存特定内容

  • proxy_no_cache

  • proxy_cache_bypass指令与上面一致

  • 示例

9.3.缓存失效减低上游压力机制---合并源请求

  • proxy_cache_lock

  • proxy_cache_lock_timeout

  • proxy_cache_lock_age

9.3.缓存失效减低上游压力机制---启用陈旧缓存

  • proxy_cache_use_stale

    image-20221228160521932
  • proxy_cache_background_update

9.4.第三方清除模块ngx_cache_purge

  • 功能:根据接收的HTTP请求立即清除缓存

  • 使用-add-module指令添加到nginx中

  • proxy_cache_purge

    image-20221228163755190

9.5.https

http协议存在的问题

  • 数据使用明文传输,可能被黑客窃取

  • 报文的完整性无法验证,可能被黑客篡改

  • 无法验证通信双方的身份,可能被黑客伪装

https

  • 所谓https,其实只是身披TLS/SSL协议外壳的http

  • https并非一个应用层协议

image-20221228164558477

https如何解决信息被窃听问题---加密

  • 加密算法

    • 对称加密,常见算法:DES、AES、3DES

    • 非对称加密,常见算法:RSA、DSA、ECC

对称加密算法

  • 客户端服务器端使用同一把秘钥

image-20221228165107909
  • 优势:

    • 解密效率高

  • 劣势

    • 秘钥无法实现安全传输

    • 秘钥的数目难于管理

    • 无法提供信息完整性校验

非对称加密算法

image-20221228165701304
  • 优势:

    • 服务器仅维持一个私钥即可

  • 劣势:

    • 公钥时公开的

    • 非对称加密算法加解密过程中会耗费一定时间

    • 公钥并不包含服务器信息,存在中间人攻击的可能性

https加密原理

  • https混合使用对称加密非对称加密

  • 在连接建立阶段使用非对称加密算法

  • 内容传输阶段使用对称加密算法

image-20221228170203985

https如何解决报文被篡改问题---数字签名

image-20221228171113072
image-20221228171211846
  • 认证身份会以CA证书认证

10.深入Nginx架构

服务可用三要素

  1. IP地址

  2. 监听端口(软件程序启动)

  3. 数据文件

10.1.虚拟路由冗余协议VRRP原理

核心概括

image-20221229160835796
  • 虚拟网关:有一个Master网关和多个Backup组成

  • Master网关:实际承载报文转发的结点,主节点

  • Backup网关:主节点故障后转移结点,备用节点

  • 虚拟IP地址:虚拟网关对外提供服务的IP地址

  • Ip地址拥有者:真实提供服务的节点,通常为主节点

  • 虚拟MAC地址:回应ARP请求时使用的虚拟MAC地址

  • 优先级:设备的优先级,优先级高的为Master

  • 非抢占式:Master在重新恢复后,不重新启用

  • 抢占式:Master在重新恢复后,重新启用

10.2.KeepAlived软件架构

image-20221229161414521
  • 服务器服务的故障转移

  • 通常用于对负载均衡器做高可用

高可用LVS
高可用其他服务

虚拟IP的转移

虚拟IP的转移

生成ipvs规则

编写脚本实现服务启动/停止

RS健康状态检测

核心组件

  • vrrp stack:vrrp协议的实现

  • ipvs wrapper:为集群内的结点生成ipvs规则

  • checkers:对集群内所有的RS做健康状态检测

  • 控制组件:配置文件解析和加载

10.3.使用KeepAlved配置实现虚IP在多服务器节点漂移

实验规划

  • 实验开始之前先关闭selinux与防火墙

  • 节点1

    • 192.168.19.135 CentOS7 Master

  • 节点2

    • 192.168.19.136 CentOS7 Master

  • VIP

    • 192.168.1.50

  • 两节点都安装软件:yum install -y keepalived、

  • 查看软件有哪些目录:rpm -ql keepalived

  • 常用目录

    • 主配置文件:/etc/keepalived/keepalived.conf

    • 属性文件:/etc/sysconfig/keepalived

  • 配置日志

配置信息

  • 配置启动keepalived后,主节点网卡会多出一个虚拟IP,备份节点则不会;只有在主节点宕机后才回出现

10.4.KeepAlived+Nginx可高用原理

11.Nginx性能优化

11.1.提升Nginx利用CPU效率

优化Nginx使用CPU遵循原则

  • 尽可能占用全部的CPU资源

  • 尽可能占用更大的CPU时间片、减少进程间切换

  • 优化策略一

    • 指定worker子进程个数

    • worker_processes auto;

  • 优化策略二

    • 将worker子进程与每个CPU绑定

    • worker_cpu_affinity 01 10 01 10;

  • 优化策略三

    • 提高worker子进程的进程优先级

    • worker_priority -20;

  • 优化策略四

    • 延迟处理新连接

    • listen 80 deferred;

11.2.TCP建立连接优化

image-20221230103640243
image-20221230104349143

相关TCP内核参数

  • net.ipv4.tcp_syn_retries = 6

    • 表示应用程序进行connect()系统调用时,在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包;并且决定了等待时间.

    • 默认为6,也就是127s

    • 优化时把次数调小

  • net.ipv4.tcp_synack_retries = 5

    • 当服务器接收到客户端发送的SYNCarrow-up-right连接请求报文后,回应SYNC+ACK报文,并等待客户端的ACK确认,如果超时会进行重传,重传次数由下列参数设置,默认为5

  • net.ipv4.tcp_syncookies = 0

    image-20221230104830960
  • net.core.netdev_max_backlog

    • 网卡上的没有发送到SYN队列的请求

    • 临时文件:/proc/sys/net/core/netdev_max_backlog

  • net.ipv4.tcp_max_syn_backlog

    • 指定所能接受SYN同步包的最大客户端数量,即半连接上限,默认值是128

    • 临时文件:/proc/sys/net/ipv4/tcp_max_syn_backlog

  • net.core.somaxconn

    • 系统级ACCEPT队列长度。指的是服务端所能accept即处理数据的最大客户端数量,即完成连接上限,默认值是128

    • 临时文件:/proc/sys/net/core/somaxconn

若想永久更改,可以在/etc/sysctl.conf中添加对应参数,并执行sysctl -p

TCP的Fast Open功能

  • TCP Fast Open(TFO)是用来加速连续TCP连接的数据交互的TCP协议扩展

  • 由Google于2011年的论文提出

  • net.ipv4.tcp_fastopen = 0

image-20221230110322273

11.3.高并发优化

最后更新于