企业高性能web服务器——Nginx

一.nginx的发展史

Nginx是由 1994 年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯 rambler.ru 公司开发的,开发 。工作最早从2002 年开始,第一次公开发布时间是 2004 年 10 月 4 日,版本号是 0.1.0。

         2019年 3 月 11 日 F5 与 NGINX 达成协议 ,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。6.7亿美金约合 44.97 亿人民币 ,nginx 核心模块代码长度 198430(包括空格、注释),所以一行代码约为 2.2万人民币;

        Nginx历经十几年的迭代更新,目前功能已经非常完善且运行稳 定,另 支 FastCGI/SSL/Virtual Host/URL Rwrite /Gzip / HTTP Basic Auth/http 或者 TCP的负载均衡 (1.9 版本以 上且开启stream 模块 ) 等功能,并且支持第三方的功能扩展。 外Nginx的版本分为开发版、稳定版和过期版, nginx 以功能丰富著称,它即可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器能够快速的响应静态网页的请求、

1.2 IO调用以及优化原理

多进程的master-workerIO复用方式

  1. 1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程

  2. 在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行 数据处理和组织;

  3. Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问
  1. master进程主要用来管理 worker 进程,具体包括以下主要功能:

  2. (1)接收来自外界的信号。

  3. (2)处理配置文件读取。

  4. (3)创建,绑定和关闭套接字

  5. (4)启动,终止和维护配置的工作(worker)进程数

  6. (5)当woker进程退出后(异常情况下),会自动重新启动新的woker进程

worker 进程的主要任务是完成具体的任务逻辑。其主要关注点是与客户端或后端真实服务器(此时 worker 作为中间代理)之间的数据可读/可写等I/O交互事 件。
 
(1)接收客户端请求;
(2)将请求一次送入各个功能模块进行过滤处理;
(3)与后端服务器通信,接收后端服务器处理结果;
(4)数据缓存
(5)响应客户端请求

1.3 IO复用

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程,目前支持I/O多路复用的系统调用有 select , poll , epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读 写操作。

1.3.2、select跟poll

Select介绍:

监视并等待多个文件描述符的属性变化(可读、可写或错误异常)。 select 函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds。调用 后 select 会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回。当 select ()函数返回 后,可以通过遍历 fdset,来找到就绪的描述符,并且描述符最大不能超过1024

Poll 介绍:

poll 的机制与 select 类似,与 select 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描 述符数量的限制。 poll 和 select 同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是 否就绪,它的开销随着文件描述符数量的增加而线性增大。

问题:

select/poll 问题很明显,它们需要循环检测连接是否有事件。如果服务器有上百万个连接,在某一时间只有一个连接向服务器发送了数据,

select/poll 需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU资源。

epoll:

epoll 是在2.6内核中提出的,是之前的和 poll 的增强版本。相对来说, epoll 更加灵活,没有描述符限制,无需轮询。epoll 使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中。 简单点来说就是当连接有I/O流事件产生的时候, epoll 就会去告诉进程哪个连接有I/O流事件产生,然后进程就去处理这个进程。

1.4 Nginx的编译安装

环境:

  • 一台NGINX主机ip为172.25.254.100,关闭selinux,关闭防火墙!!!!(否则会在测试的时候出现很多问题)  
  • 去nginx官网下载软件
  • 先安装其依赖软件,最后安装nginx。
  • 依赖工具:pcre-8.3.7.tar.gz, openssl-1.0.1t.tar.gz, zlib-1.2.8.tar.gz, nginx1.11.1.tar.gz。 
  1. nginx的http模块使用pcre来解析正则表达式,需要在linux上安装pcre库
  2. nginx使用zlib对http包的内容进行gzip,需要在linux上安装安装zlib库
  3. 安装openssl库,让 nginx 支持 https(即在ssl协议上传输http)
  • 这里下载nginx-1.24.0.tar.gz和nginx-1.26.1.tar.gz

[root@nginx ~]# tar zxf nginx-1.24.0.tar.gz

[root@nginx ~]# cd nginx-1.24.0/

[root@nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

#关闭debug功能

[root@nginx nginx-1.24.0]# vim auto/cc/gcc

# debug

#CFLAGS="$CFLAGS -g"

[root@nginx nginx-1.24.0]# ls

auto CHANGES.ru configure html Makefile objs src CHANGES conf contrib LICENSE man README

#编译安装,这里可以使用./configure --help查看

[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \

--user=nginx \ # 指定nginx运行用户

--group=nginx \ # 指定nginx运行组

--with-http_ssl_module \ # 支持https://

--with-http_v2_module \ # 支持http版本2

--with-http_realip_module \ # 支持ip透传

--with-http_stub_status_module \ # 支持状态页面

--with-http_gzip_static_module \ # 支持压缩

--with-pcre \ # 支持正则

--with-stream \ # 支持tcp反向代理

--with-stream_ssl_module \ # 支持tcp的ssl加密

--with-stream_realip_module # 支持tcp的透传ip

#make完成后再看objs目录,又有新文件

[root@nginx nginx-1.24.0]# make && make install

1.5平滑回滚和升级

平滑升级:让客户感受不到任何的使用影响
  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • 向master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主
  • 进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz 

  导入 echo-nginx-module-0.63.tar.gz 并且tar zxf echo-nginx-module-0.63.tar.gz

[root@Nginx nginx]# cd nginx-1.26.1/                     #开始编译新版本

[root@Nginx nginx-1.26.1]# ./configure

--with-http_ssl_module

--with-http_v2_module

--with-http_realip_module

--with-http_stub_status_module

--with-http_gzip_static_module

--with-pcre --with-stream

--with-stream_ssl_module

-- with-stream_realip_module

 #只要make无需要make install

查看版本信息:

ll objs/nginx /usr/local/nginx/sbin/nginx

把之前版本作为一个备份

  1. cd /usr/local/nginx/sbin/

  2. cp nginx nginx.24

把新版本复制过去

\cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin

nginx -t检测有没有问题

ps aux | grep nginx查看版本进程kill -UER2 13116平滑升级  kill -WINCH 48732回收旧版本

 curl -I nginx 查看是否升级成功

回滚:

  1. cd /usr/local/nginx/sbin/

  2. cp nginx nginx.26

  3. mv nginx.24 nginx

  4. mv: overwrite 'nginx'? y

  5. ps aux | grep nginx

  6. kill -HUP 13116

  7. kill -WINCH 167455

  8. curl -I localhost

1.6 nginx参数命令

-?,-h         : this help
-v            : show version and exit
-V            : show version and configure options then exit #显示版本和编译参数
-t            : test configuration and exit #测试配置文件是否异
-T            : test configuration, dump it and exit #测试并打印
-q            : suppress non-error messages during configuration testing #静默模式
-s signal     : send signal to a master process: stop, quit, reopen, reload #发送信号,reload信号 会生成新的worker,但master不会重新生成
-p prefix     : set prefix path (default: /etc/nginx/) #指定Nginx 目录
-c filename   : set configuration file (default: /etc/nginx/nginx.conf) #配置文件路径
-g directives : set global directives out of configuration file #设置全局指令,注意和配置文件不要同时配置,否则冲突

nginx -s stop            #关闭nginx
nginx -s reload          #刷新
nginx -g "worker_processes 6;"        #文件中一定要没有此参数
 在vim /usr/local/nginx/conf/nginx.conf中 注释掉

1.7nginx自动运行脚本

首先关掉nginx然后再进行编写

vim /lib/systemd/system/nginx.service

systemctl daemon-reload
systemctl start nginx

1.8nginx全局参数优化

Nginx的配置文件的组成部分:

  • 主配置文件:nginx.conf
  • 子配置文件: include conf.d/*.conf
  • fastcgi, uwsgi,scgi 等协议相关的配置文件
  • mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮
  • 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某
  • 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动
  • 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

worker的进程数量和绑定的核的个数都是auto 自动识别

并发连接数量

核心配置:基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现

新建一个pc站点:

配置子配置文件(可选),在主配置文件添加一行 vim /usr/local/nginx/conf/nginx.conf

防止主配置文件内容过多 可读性变差 所以写子配置文件

mkdir -p /usr/local/nginx/conf.d

vim /usr/local/nginx/conf.d/vhost.conf

 server {

listen 80;

server_name

 www.du.org;

root /data/web/html;

index index.html;

}

mkdir -p /data/web/html

echo www.du.org > /data/web/html/index.html

nginx -t

修改C:\Windows\System32\drivers\etc\hosts    添加以下解析 
192.168.1.100 www.du.org    然后测试访问

1.9location的用法

  • 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
  • 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最 高的一个uri
  • uri是用户请求的字符串,即域名后面的web文件路径
  • 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理 此请求。
1.9.1用户认证
  • 创建用户以及密码
  • 建立相应目录,写入网页内容
  • 写入网页配置文件内容
  • 测试访问网页

由 ngx_http_auth_basic_module 模块提供此功能

htpasswd -cm /usr/local/nginx/.htpassword du

 vim /usr/local/nginx/conf.d/vhost.conf

 nginx -s reload

在windows系统的hosts文件中写入IP对应域名

浏览器中访问

 1.9.2自定义错误界面

 vim /usr/local/nginx/conf.d/vhost.conf 

nginx -s reload

 mkdir -p /data/web/errorpage 

echo this is errorpage > /data/web/errorpage/40x.html

测试:

1.9.3 日志重定向

mkdir "/var/log/nginx" -p

vim /usr/local/nginx/conf.d/vhosts.conf

重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件

1.9.4 nginx中的文件检测

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。

vim /usr/local/nginx/conf.d/vhost.conf

如果不存在页面, 就转到default.html页面

1.9.5长连接配置

dnf install telnet -y 下载测试工具

vim /usr/local/nginx/conf/nginx.conf

会话保持次数和会话请求次数

telnet www.du.org80

2.0 nginx高级配置

mkdir /data/web/download

dd if=/dev/zero of=/data/web/download/wfile bs=1M count=100

vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

Active connections:  #当前处于活动状态的客户端连接数
                                 #包括连接等待空闲连接数=reading+writing+waiting
accepts: #统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
               #通常等于accepts,除非有因worker_connections限制等被拒绝的连接 
requests: #统计总值,Nginx自启动后客户端发来的总的请求数

2.1数据压缩功能

vim /usr/local/nginx/conf/nginx.conf

nginx -s reload

echo this is small file > /data/web/html/small.html

du -sh /var/log/du.org/access.log

4.0K    /var/log/du.org/access.log

curl --head --compressed 172.25.254.10/data/test.html

curl --head --compressed 172.25.254.20/data/data.txt

2.2nginx变量

变量可以分为内置变量和自定义变量,内置变量是由nginx模块自带

内置变量

$remote_addr;         #存放了客户端的地址,注意是客户端的公网IP
$args;         #变量中存放了URL中的所有参数
        #例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
        #返回结果为: keyword=手机&enc=utf-8
$is_args        #如果有参数为? 否则为空
$document_root;         #保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。
$document_uri;        #保存了当前请求中不包含参数的URI,注意是不包含请求的指令
        #比如:http://lee.timinglee.org/var?\id=11111会被定义为/var 
        #返回结果为:/var
$host;         #存放了请求的host名称
        limit_rate 10240;
        echo $limit_rate;
        #如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port;        #客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
$remote_user;        #已经经过Auth Basic Module验证的用户名
$request_body_file;        #做反向代理时发给后端服务器的本地资源的名称
$request_method;        #请求资源的方式,GET/PUT/DELETE等
$request_filename;        #当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
        #如:webdata/nginx/timinglee.org/lee/var/index.html
$request_uri;        #包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
        #例如:/main/index.do?id=20190221&partner=search 
$scheme;        #请求的协议,例如:http,https,ftp等
$server_protocol;        #保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr;        #保存了服务器的IP地址
$server_name;        #虚拟主机的主机名
$server_port;        #虚拟主机的端口号
$http_user_agent;        #客户端浏览器的详细信息
$http_cookie;        #客户端的所有cookie信息
$cookie_<name>        #name为任意请求报文首部字部cookie的key名
$http_<name>        #name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有横线需要替换为下划线
#示例: 
        echo $http_user_agent; 
        echo $http_host;
$sent_http_<name>        #name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
        echo $sent_http_server;
$arg_<name>        #此变量存放了URL中的指定参数,name为请求url中指定的参数
        echo $arg_id;

自定义变量名称和值,使用指令set $variable value;
语法格式:

Syntax: set $variable value;
Default: —
Context: server, location, if

curl -b "key1=du1,key2=du2" -u du:du www.du.org/var?name=du&&id=6666

2.3nginx rewrite相关命令

if

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

 vim /usr/local/nginx/conf.d/vhost.conf

测试

set

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
另外set定义格式为set $key value,value可以是text, variables和两者的组合。

vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

测试:curl www.du.org/test3

break

用于中断当前相同作用域(location)中的其他Nginx配置
与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行ngx_http_rewrite_module 模块的指令,其它指令还会执行

 vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

curl www.du.org/break

return

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置
return code;         #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容
                             #可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

 nginx -s reload

curl -I www.du.org/return

HTTP/1.1 301 Moved Permanently
Server: nginx/1.26.1
Date: Mon, 19 Aug 2024 16:28:34 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Keep-Alive: timeout=5
Location: http://www.baidu.com

rewrite:

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

rewrite regex replacement [flag];

.         #匹配除换行符以外的任意字符
\w         #匹配字母或数字或下划线或汉字
\s         #匹配任意的空白符
\d         #匹配数字
\b         #匹配单词的开始或结束
^         #匹配字付串的开始
$         #匹配字符串的结束
*         #匹配重复零次或更多次
+         #匹配重复一次或更多次
?         #匹配重复零次或一次
(n)         #匹配重复n次
{n,}         #匹配重复n次或更多次
{n,m}         #匹配重复n到m次
*?         #匹配重复任意次,但尽可能少重复
+?         #匹配重复1次或更多次,但尽可能少重复
??         #匹配重复0次或1次,但尽可能少重复
{n,m}?         #匹配重复n到m次,但尽可能少重复
{n,}?         #匹配重复n次以上,但尽可能少重复
\W           #匹配任意不是字母,数字,下划线,汉字的字符
\S         #匹配任意不是空白符的字符
\D         #匹配任意非数字的字符
\B         #匹配不是单词开头或结束的位置
[^x]         #匹配除了x以外的任意字符
[^lee]         #匹配除了magedu 这几个字母以外的任意字符

ewrite flag 使用介绍 
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型

        跳转型指由客户端浏览器重新对新地址进行请求

        代理型是在WEB服务器内部实现跳转
flag 说明

redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

 rewrite案例: 域名永久与临时重定向 
域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。

临时重定向:vim /usr/local/nginx/conf.d/vhost.conf

 nginx -s reload

mkdir -p /data/web/var

echo this is var > /data/web/var/index.htm

永久重定向:vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

测试

判断文件是否存在:

mkdir /data/web/html/{test1,test2,break,last} -p

echo test1 > /data/web/html/test1/index.html

echo test2 > /data/web/html/test2/index.html

echo break > /data/web/html/break/index.html

echo last > /data/web/html/last/index.html

vim /usr/local/nginx/conf.d/vars.conf

nginx -s reload

测试:curl www.timinglee.org/break/index.html

timinglee  hhhhhhhhhha

nginx防盗链:

先进行全栈加密:cd /usr/local/nginx/

mkdir certs

 openssl req  -newkey  rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/du.org.key \
-x509  -days 365 -out /usr/local/nginx/certs/du.org.crt

 vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

测试

2.4nginx反向功能代理:

实验环境准备 

172.25.254.100中:

vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

172.25.254.10中:

yum install httpd php -y

systemctl enable --now httpd

systemctl restart httpd

vim /var/www/html/index.php

172.25.254.20中:

yum install httpd -y

systemctl enable --now httpd

mkdir /var/www/html/static

echo static 172.25.254.20 > /var/www/html/static/index.html

vim /etc/httpd/conf/httpd.conf

2.4.1缓存配置:

缓存前进行一个压测ab -n1000 -c100 http://www.timinglee.org/static/index.html

vim /usr/local/nginx/conf/nginx.conf配置缓存

vim /usr/local/nginx/conf.d/vhost.conf

2.4.2七层负载

在http中定义缓存信息

proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次
   #1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m     #指内存中缓存的大小,主要用于存放key和metadata
(如:使用次数)
   #一般1M可存放8000个左右的key
   
   inactive=120s       #缓存有效时间
   max_size=10g;     #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存

#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup   #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down     #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算
hash $request_uri consistent;         #基于用户请求的uri做hash
hash $cookie_sessionid         #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
ip_hash;        #源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持
least_conn;        #最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

实验:echo "web 172.25.254.110" > /var/www/html/index.html
web1

 echo "web1 172.25.254.120" > /var/www/html/index.html
nginx1

 vim /usr/local/nginx/conf.d/vhost.conf

nginx -s reload

2.4.2FastCGI

实现了 OpenResty 这个高性能服务端解决方案

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。

OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的选择

dnf -yq install gcc pcre-devel openssl-devel perl

useradd -r -s /sbin/nologin nginx

cd /usr/local/src

wget https://openresty.org/download/openresty-1.17.8.2.tar.gz

tar xf openresty-1.17.8.2.tar.gz

cd openresty-1.17.8.2/

./configure \

  1. --prefix=/apps/openresty \

  2. --user=nginx --group=nginx \

  3. --with-http_ssl_module \

  4. --with-http_v2_module \

  5. --with_http_realip_module \

  6. --with-http_stub_status_module \

  7. --with-http_gzip_static_module

  8. --with-pcre --with-stream \

  9. --with-stream_ssl_module \

  10. --with-stream_realip_module

make && make install

ln -s /apps/openresty/bin/* /usr/bin/

openresty -v     nginx version: openresty/1.17.8.2

openresty

ps -ef |grep nginx

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值