nginx的全局配置和HTTP相关配置

目录

资源类型:

 网站访问量

网站访问量统计的重要指标

HTTP1.0和1.1的问题

HTTP2协议 

HTTP 请求访问的完整过程

HTTP 请求报文 

 http协议状态码分类

http协议常用的!!状态码!! 

 I/O 的具体实现方式 

 通过官方 yum 源安装nginx

Nginx 核心模块 

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

systemctl start nginx:       (组装启动,退出 )systemctl stop nginx.

默认的nginx.conf 配置文件格式说明                                         绿色自己加的

location 的详细使用 

 #语法规则:                                                         

Location @重定向         

 Nginx 四层访问控制

 Nginx 账户认证功能

 自定义错误页面(跳转)

 检测文件是否存在 (可自行创建)

长连接配置 

作为下载服务器配置

范例: 实现下载站点 

限流限速   规则必须写入http语句块里

限制并发连接数     规则必须写入http语句块里

实现百度云盘非会员限度限流功能: 

Nginx 状态页 

echo 模块实现信息显示 

自定义变量

常用内置变量       server {    都在里面

自定义默认格式日志 

自定义json格式日志   支持多个

json 格式的日志访问统计 

 关于 favicon.ico

Nginx 压缩功能

https 加密 

平滑升级和回滚


早期HTTP传输协议就是为了传输HTML(超文本协议)后来有了MIME(支持图片视频之类的)

在页面按F12可以查看那个最慢 

传输过程

1域名解析ip

DS解析

ip解析完之后就是三次握手 之后渲染,最后四次挥手

HTTP协议分层 

资源类型:

  • 静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同
  • 常见文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi
  • 动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同
  • 常见文件后缀:.php, .jsp ,.asp

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

 URL组成

 参考链接

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web 

  scheme:方案,访问服务器以获取资源时要使用哪种协议\

user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

 网站访问量

网站访问量统计的重要指标

  • IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的

HTTP1.0和1.1的问题

HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端
更为突出
HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无
法保证数据的安全性

HTTP2协议 

HTTP2协议抄的SPDY协议(谷歌发明) 解决了HTTP1的问题 还快自性选择是否加密

HTTP 请求访问的完整过程

HTTP 请求报文 

 http协议状态码分类

xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误

http协议常用的!!状态码!! 

00: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 响应报文Location指明资源临时新位置 Moved Temporarily 

304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;
Not Modified
307: 浏览器内部重定向
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden,一般是因为权限错误或主页文件不存在
404: 服务器无法找到客户端请求的资源;Not Found
413: 上传的资源超过了最大限制值
499: 客户端主动断开连接。然而在实际业务开发中,当出现 HTTP 499 状态码时,大部分都是由于服务端
请求时间过长,导致客户端等的“不耐烦”了,因此断开了连接。比如:慢SQL问题,499是客户端读超时关闭
连接造成的,推荐从超时时间或者优化响应速度入手,web服务器发现客户端主动关闭连接后,记录到access
日志中的。可能是客户端接收响应超时了,可以先在客户端统计下是不是这个原因,再调查为什么会导致超时
500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限,或连接数据库失
败,rewrite死循环
502: Bad Gateway,代理服务器从后端服务器收到了一条错误响应,如无法连接到网关;Bad Gateway,
比如:后端服务端口没有打开,或后端服务不可用,iptable -j REJECT
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:超过连接数和连接频率
504: Gateway Timeout,网关超时,或者后端服务器无回应报文,比如:服务端口虽然打开,但服务返回结果
时间过长,iptable -j DROP

 I/O 的具体实现方式 

1、select:
select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型。I/O多路复用这个概念被提出来以后, select于1983年第一个在BSD里面实现
2、poll:
在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编译nginx的时候可以使用--with-poll_module和--without-poll_module这两个指定是否编译select库。poll出现在1997年
3、epoll:
epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.在2002年DavideLibenzi 实现了epoll.epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮询检查这个表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。
4、kqueue:
用于支持BSD系列平台的高校事件驱动模型,主要用在FreeBSD 4.1及以上版本、OpenBSD 2.0级以上版本,NetBSD级以上版本及Mac OS X 平台上,该模型也是poll库的变种,因此和epoll没有本质上的区别,
效效率和epoll相似
5、IOCP:
Windows系统上的实现方式,对应第5种(异步I/O)模型。
6、/dev/poll:
用于支持unix衍生平台的高效事件驱动模型,主要在Solaris 平台、HP/UX,该模型是sun公司在开发
Solaris系列平台的时候提出的用于完成事件驱动机制的方案,它使用了虚拟的/dev/poll设备,开发人员将
要见识的文件描述符加入这个设备,然后通过ioctl()调用来获取事件通知,因此运行在以上系列平台的时候请使用/dev/poll事件驱动机制。效率和epoll相似
7、rtsig:
不是一个常用事件驱动,最大队列1024,不是很常用
8、eventport:

该方案也是sun公司在开发Solaris的时候提出的事件驱动库,只是Solaris 10以上的版本,该驱动库可防止内核崩溃等情况的发生。

 通过官方 yum 源安装nginx最新版

vim /etc/yum.repos.d/nginx.repo             (创建写入)

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

 [root@rocky8 ~]#yum list nginx                                    更新一下源

#安装指定版本
[root@centos8 ~]#yum -y install nginx

apt update    自动更新有可能有锁

nginx -t 检查语法(建议经常用,损失无小事)

Nginx 核心模块 

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

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

Nginx 主配置文件的配置指令方式:

directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name

主配置文件结构:四部分 

main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {

...
}

两种组合启动退出

systemctl start nginx:       (组装启动,退出 )
systemctl stop nginx.

nginx(启动)

nginx -s puit (循环退出,现有用户可以访问,后续用户连接不上,最后谁都连接不上)

默认的nginx.conf 配置文件格式说明                                         绿色自己加的

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID       (设置账号的话需要给账号相关权限,不然没用) 
路径,日志路径等。 (普通账户是没有权限监听1023端口以下的)
user nginx nginx;                                   启动Nginx工作进程的用户和

orker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同;                                                                            最好设置为auto(自动改成cpu的核数)

 worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; #将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU

100           :  2号CPU
10000000:7号CPU

#error_log  logs/error.log;                   错误日志(可以自行盖)cat/apps/nginx/logs/error.log  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;   

worker_priority 0; #工作进程优先级,-20~20(19)

worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,    (简单来说就是设置上线,防止忽然太多炸了)

daemon off; #前台运行Nginx服务用于测试、或者以容器运行时,需要设为off

守护进程一般都是开机自己启动的·后台进程,不需要用户登录

master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为 on

worker_connections 65536; #设置单个工作进程的最大并发连接数   

( 和·worker_rlimit_nofile有关,

use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只
能设置在events模块中设置。  

accept_mutex on; #on为同一时刻一个请求轮流由worker进程处理,而防止被同时唤醒所有
worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on

multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on}

#如果systemd启动,则需要修改nginx.service文件中加LimitNOFILE=100000,才能有效

[root@ubuntu2004 ~]#vim /lib/systemd/system/nginx.service

#root@centos8 ~]#vim /etc/security/limits.conf

root@centos8 ~]#vim /etc/security/limits.conf

可以一个nginx下多个网站, 也可以多个nginx下一个文件

是否在响应报文的Server首部显示nginx版本 http下(不显示版本信息显示软件名,可以自己改)
server_tokens on | off | build | string;

nginx -s reload                重新加载文件

1 把京东另存下来

2 在vim /apps/nginx/conf/nginx.conf的最后的}写上路径 include /apps/nginx/conf/conf.d/*.conf;

3 mkdir /apps/nginx/conf/conf.d/   创建文件路径

server {                                                加在文件目录指定区
    listen 80 default_server;           default_server  设置监听地址和端口,多个虚拟机时当前是否是默认的虚拟主机
    server_name www.wang.org;
    root /data/nginx/html/pc/;
}

一个服务器上有多个网站他是通过ip头来确定你访问的是谁的,

你访问的域名他会转会成ip 而IP会把域名以Host(主机头的方式带走)去访问你指定的网站

访问IP号的话谁优先级高(在前面)先访问谁 ,也可以用IP地址端口号来区分  default_serve可以设置默认访问谁也可以指定访问 curl -H -v "host: www.wang.org" 10.0.0.100区分方法 1端口号 2 ip  3  主机头 server  一般主机头区分 合理

location 的详细使用 

 server {
    listen 80 default_server;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    location /test/ {                         #当访问www.wang.org/test/时 需要单独定义访问时需要在    location 下指定
        alias /opt/pc/ ;                   #这样他就会去/test/找了
    }

}

 #语法规则:                                                         

#语法规则:                                  用于动静分离 访问谁
location [ = | ~ | ~* | ^~ ] uri { ... }
=         #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~         #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左边部分做匹配检查,不区分字符大小写
~         #用于标准uri前,表示包含正则表达式,并且区分大小写
~*         #用于标准uri前,表示包含则表达式,并且不区分大写

不带符号           #匹配起始于此uri的所有的uri
\         #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#        匹配优先级从高到低:
=, ^~, ~/~*, 不带符号 

范例: 

# cat /etc/nginx/conf.d/www.wang.org.conf
server {
    listen 80;
    server_name location.wang.org;
    location = / {
        default_type text/html;
        return 200 'location = /';
    }
    location / {
        default_type text/html;
        return 200 'location /';
    }
    location /documents/ {
        default_type text/html;
        return 200 'location /documents/';
    }
    location ^~ /images/ {
        default_type text/html;
        return 200 'location ^~ /images/';
    }
    location ~* \.(gif|jpg|jpeg)$ {
        default_type text/html;
        return 200 'location ~* \.(gif|jpg|jpeg)';
        }
    }

 #测试结果如下,建议是curl测试
#1.请求 http://location.wang.org/ 会被 location =/ 匹配
#2.请求 http://location.wang.org/index.html 会被 location / 匹配
#3.请求 http://location.wang.org/documents/1.html 会被 location /documents/ 匹配
#4.请求 http://location.wang.org/images/1.gif 会被 location ^~ /images/ 匹配
#5.请求 http://location.wang.org/documents/1.jpg 会被 location ~* \.
(gif|jpg|jpeg)$匹配

Location @重定向         

                                ngx_http_core_module      模块的上述大部分·指令都来源于这里

server {
    listen 80 default_server;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    error_page 404 @error_404;      #如果出现异常,则重新定向到@error_404这个location上
        location @error_404 {              #就是自行指定错误输出
        default_type text/html;
        charset utf8;
        return 200 '你访问的页面可能走丢了!';
 }
}

 Nginx 四层访问控制

  server {                                        自己访问自己也不行
    listen 80 default_server;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    deny 10.0.0.1;                              拒绝访问
    allow 10.0.0.0/24;                         允许访问
    deny all;                                        拒绝所有访问 #按先小范围到大范围排序
}    

 Nginx 账户认证功能

[root@ubuntu2004 conf.d]#apt install apache2-utils    下载安装包

[root@ubuntu2004 pc]#htpasswd -c -b /apps/nginx/conf/conf.d/.nginx_users wei 123456

htpasswd    创建文件地址  c 指定用户名 b 指定密码   
[root@ubuntu2004 pc]#htpasswd  -b /apps/nginx/conf/conf.d/.nginx_users huahua 123456
  htpasswd    创建文件地址      第二次不要再下c 不然会覆盖    b 指定密码   

curl http://wei:123456@www.wang.org/admin/     交互式登录

server {                                                可以抓包找到密码
    listen 80 default_server;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    location  /admin {
    auth_basic   "login password";          指定提示符
    auth_basic_user_file /apps/nginx/conf/conf.d/.nginx_users; 指定认证的人文件(下载包)
    }
}        

 自定义错误页面(跳转)

 server {
    listen 80 default_server;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    error_page 500 502 503 404 =200 /index.html;       错误页面也跳转到正确页面
    location  /admin {
    auth_basic   "login password";
    auth_basic_user_file /apps/nginx/conf/conf.d/.nginx_users;
    }
}        

error_page 500 502 503 504 404 /error.html;      错误页面跳转到指定页面(需要在错误页面的指定文件里创建/error.htm在里面创建错误页面)

error_log /apps/nginx/logs/www.wang.org-error.log; 自定此文件错误日志放这里

 检测文件是否存在 (可自行创建)

server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
#    error_log /apps/nginx/logs/www.wang.org-error.log;
    try_files $uri $uri/index.html $uri.html =489;   若文件不存在 则按要求搜索 直到489
    location  /admin {                                         也可手动创建访问xxx 就创建xxx.html 或什么
    auth_basic   "login password";
    auth_basic_user_file /apps/nginx/conf/conf.d/.nginx_users;
    } 
}   http://www.wang.org/xxx    

  

长连接配置 

keepalive_time time; #限制对一个连接中请求处理的最长时间,到时间后续的再有新的请求会断开连接,默认1h
keepalive_timeout timeout [header_timeout]; #设置保持空闲的连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为1000次

作为下载服务器配置

  • [root@ubuntu2004 ~]#mkdir /data/nginx/html/mirrors/rockylinux/8 -p   创建相关目录下的链接
  • [root@ubuntu2004 conf.d]# vim mirrors.wang.org.conf
  • server {

        listen 80;

        server_name mirrors.wang.org;

         autoindex on;      默认不支持下载网站的功能  加上他才能把文件列出来,用户才能访问到

        root /data/nginx/html/mirrrors/;

    }

  •  [root@ubuntu2004 ~]#mount /dev/sr0 /data/nginx/html/m^Crors/rockylinux/8

相关指令: 

utoindex on | off;#自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位
K、M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
charset charset | off; #指定字符编码,默认为off,中文会乱码,指定为utf8
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即
bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.Rate limit can also
be set in the $limit_rate variable, however, since version 1.17.0, this method is
not recommended:

范例: 实现下载站点 

#注意:download不需要index.html文件
[root@centos8 ~]# mkdir -p /data/nginx/html/pc/download
[root@centos8 ~]# vim /apps/nginx/conf/conf.d/pc.conf
location /download {
autoindex on;         #自动索引功能
autoindex_exact_size on;         #计算文件确切大小(单位bytes),此为默认值,off只显示大概大
小(单位kb、mb、gb)
autoindex_localtime on;         #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT
时间
charset utf8;         #支持中文
limit_rate 1024k;         #限速,默认不限速
root /data/nginx/html/pc;
}
[root@centos8 ~] # cp /root/anaconda-ks.cfg /data/nginx/html/pc/download/
#重启Nginx并访问测试下载页面
#可以从清华大学镜像源同步下载实现仓库功能
[root@centos8 ~]#rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/ubuntu
/download/ubuntu

限流限速   规则必须写入http语句块里

限制下载速度

# cat /etc/nginx/conf.d/mirrors.wang.conf
server {
listen 80;
server_name mirrors.wang.org;
root /data/mirrors/;
charset utf8;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
limit_rate_after 100m;         #下载达到100MB数据后开始限速
limit_rate 100k;                   #限速100k
location / {
index index.html;
}

 #示例:

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
limit_req_status 500; #默认503,可以指定其它状态码
}

limit_req是一个Nginx配置指令,用于限制客户端请求的速率。在这个例子中,limit_req指令的参数为zone=one burst=5,表示:

1. zone=one:使用名为“one”的限制请求区域,该区域定义了请求速率限制的参数;
2. burst=5:允许在限制时间内(由limit_req_zone指令定义)最多出现5个请求超过限制速率。

此外,还有一个limit_req_status指令,用于指定当请求超过速率限制时返回的HTTP状态码。在这个例子中,limit_req_status指令的参数为500,表示当请求超过速率限制时返回HTTP状态码500。

这个指令通常用于防止恶意攻击或过度使用资源,可以根据实际情况进行调整。

#参数说明
limit_req_zone定义在http块中,$binary_remote_addr表示以客户端IP地址的二进制形式为限流依据的key
Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。8000个IP地址的状态信息约1MB,例子区域可以存储80000个IP地址。
Rate定义最大请求速率。示例中速率不能超过每秒10个请求。超过此速率的请求放入burst队列做延迟处理
burst表示队列大小,当此队列满后,会中断请求报错
nodelay表示超过请求速率并且缓存区满后不延迟处理,立即返回503错误 

#可以有几个limit_req指令。例如,以下配置将限制来自单个 IP 地址的请求的处理速率,同时限制虚拟服务器的请求处理速率
#示例:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;

范例: 基于来源IP对下载速率限制,限制每秒处理1次请求,缓存区请求突发队列为10个

 # http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
#注意:$remote_addr和$binary_remote_addr的不同
http {
        limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
    }
        server {
        listen 80;
        server_name mirrors.wang.org;
#请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
        limit_req zone=req_one burst=10 nodelay;
        location / {
        root /data/mirrors/;
        index index.html;
        }
}
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#第一个参数:$binary_remote_addr表示通过这个标识来做限制,限制同一客户端ip地址。
#第二个参数:zone=req_one:10m表示生成一个大小为10M,名为req_one的内存区域用来存储访问频次信息
#第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,此处限制的是每秒1次。
limit_req zone=req_one burst=10 nodelay;
#第一个参数:zone=req_one 设置使用哪个配置区域来做限制,与上面limit_req_zone的name对应。
#第二个参数:burst=10,设置一个大小为10的缓冲区,当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
#第三个参数:nodelay,超过访问频次并且缓冲区也满了的时候,则会返回503,如果没有设置,则所有请求会等待排队。

限制并发连接数     规则必须写入http语句块里

范例: 设置共享内存区域和给定键值的最大允许个连接数。超过此限制时服务器将返回503错误

# cat /etc/nginx/conf.d/mirrors.wang.org.conf 
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;    同一个ip做依据,刚在10M的缓冲区
server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    limit_conn conn_zone 2;        #限制并发2个连接
}

实现百度云盘非会员限度限流功能: 

  • 当下载超过100M则限制下载速度为500k
  • 限制web服务器请求数处理为1秒一个,触发值为5、限制用户仅可同时下载一个文件。
  • 如果同时下载超过2个资源,则返回提示 "请联系管理员进行会员充值" 并跳转到其他页面

#cat /etc/nginx/conf.d/mirrors.wang.conf
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
listen 80;
server_name mirrors.wang.org;
root /data/mirrors/;
charset utf8;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
limit_req zone=req_zone burst=5 nodelay;
limit_conn conn_zone 2;
limit_rate_after 100m;
limit_rate 500k;
error_page 503 @error_page;
location @error_page {
default_type text/html;
return 200 '温馨提示:请联系管理员进行会员充值!';
#return https://pan.baidu.com/buy/center?tag=8&from=loginpage#/svip ;
}

Nginx 状态页 

server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    location /status {           访问它就返回状态页
    stub_status;                        ~~~~
    }
}

#状态页用于输出nginx的基本状态信息:
#输出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: #当前处于活动状态的客户端连接数,包括连接等待空闲连接数
=reading+writing+waiting
accepts:#统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled:#统计总值,Nginx自启动后已经处理完成的客户端请求连接总数,通常等于accepts,除非有因
worker_connections限制等被拒绝的失败连接,即失败连接数=accepts-handled
requests:#统计总值,Nginx自启动后客户端发来的总的请求数。因为长连接的原因此值大于上面的
accept数
Reading:#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:#当前状态,正在等待客户端发出请求的空闲连接数,开启keep-alive
时,Waiting+reading+writing=active connections

curl -s http://www.wang.org/nginx_status | awk '/Active connections/{print $3}'   提去当前链接量

nginx-module-vts 模块实现流量监控     

GitHub - vozlt/nginx-module-vts: Nginx virtual host traffic status module   官网下载

[root@centos8 ~]#cd /usr/local/src
[root@centos8 src]#git clone git://github.com/vozlt/nginx-module-vts.git
[root@centos8 src]#cd nginx-1.18.0/
[root@centos8 nginx-1.18.0]#./configure --prefix=/apps/nginx --add-
module=/usr/local/src/nginx-module-vts
[root@centos8 nginx-1.18.0]#make && make install
[root@centos8 ~]#vim /apps/nginx/conf/nginx.conf
http {
......
vhost_traffic_status_zone;
......
server {
......
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
......
}
}
[root@centos8 ~]#systemctl restart nginx
#浏览器访问:http://<nginx_ip>/status 可以看到下面显示 

echo 模块实现信息显示 

[root@ubuntu2004 src]#unzip echo-nginx-module-master.zip         解压

[root@ubuntu2004 src]# cd nginx-1.22.0/

[root@ubuntu2004 conf.d]#vim www.wang.org.conf 
server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    location /echo {
     echo $request;            不会啥打印啥
    }
}

systemctl restart nginx

[root@centos8 ~]#nginx -V   出来变量
nginx version: wanginx/1.68.9
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
built with OpenSSL 1.1.1c FIPS 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --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

--add-module=/usr/local/src/echo-nginx-module-master 写入要增加的变量(路径加文件)
#测试查看结果
[root@centos7 ~]#curl http://www.wang.org/echo

自定义变量

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

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

范例 

set $name magedu;
echo $name;
set $my_port $server_port;
echo $my_port;
echo "$server_name:$server_port";
#输出信息如下
[root@centos6 ~]#curl www.wang.org/main
magedu
80
www.wang.org:80

常用内置变量       server {    都在里面

$remote_addr;
#存放了客户端的地址,注意是客户端的公网IP


$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addr
the “X-Forwarded-For” client request header field with the $remote_addr variable
appended to it, separated by a comma. If the “X-Forwarded-For” field is not
present in the client request header, the $proxy_add_x_forwarded_for variable is
equal to the $remote_addr variable.


$args;
#变量中存放了URL中的所有参数,例如:http://www.wang.org/main/index.do?
id=20190221&partner=search
#返回结果为: id=20190221&partner=search


$is_args
#如果有参数为? 否则为空
“?” if a request line has arguments, or an empty string otherwise


$document_root;
#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html。


$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.wang.org/main/index.do?id=20190221&partner=search会被定义
为/main/index.do
#返回结果为:/main/index.do


$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请求生成的文件绝对路径,
如:/apps/nginx/html/main/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的对应的首部字段名需要为小写,如果有横线需要替换为下划线
arbitrary request header field; the last part of a variable name is the field
name converted to lower case with dashes replaced by underscores #用下划线代替横线

#示例:
echo $http_user_agent;
echo $http_host;
$sent_http_<name>

#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;

$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数
echo $arg_id;

自定义默认格式日志 

#注意:此指令只支持http块,不支持server块

[root@ubuntu2004 conf.d]#vim www.wang.org.conf 

log_format access_log_format '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'$server_name:$server_port';

server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;
    access_log /apps/nginx/logs/www.wang.org-access.log access_log_format;
}

#注意:此指令一定要在放在log_format命令后
access_log logs/access.log access_log_format;

[root@ubuntu2004 logs]#tail -f www.wang.org-access.log    访问查看

自定义json格式日志   支持多个

 log_format access_json '{"@timestamp":"$time_iso8601",'
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'        #总的处理时间
        '"upstreamtime":"$upstream_response_time",' #后端应用服务器处理时间
        '"upstreamhost":"$upstream_addr",'   
        '"http_host":"$host",'
        '"uri":"$uri",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"tcp_xff":"$proxy_protocol_addr",'
        '"http_user_agent":"$http_user_agent",'
        '"status":"$status"}';
     access_log  /apps/nginx/logs/access_json.log  access_json;

 和上面一样,看不懂可以去网上找一下JSON格式转换一堆呢   

[root@ubuntu2004 logs]#apt install jq      格式装换
[root@ubuntu2004 logs]#cat www.wang.org-access-json.log |jq

json 格式的日志访问统计 

 #python3
[root@centos8 ~]#dnf -y install python3

vim json_access.py 

#!/usr/bin/env python3
#coding:utf-8

status_200= []
status_404= []
with open("/apps/nginx/logs/www.wang.org-access-json.log") as f:
    for line in f.readlines():
        line = eval(line)
        if line.get("status") == "200":
            status_200.append(line.get)
        elif line.get("status") == "404":
            status_404.append(line.get)
        else:
            print("状态码 ERROR")
        print((line.get("clientip")))
f.close()

print("状态码200的有--:",len(status_200))
print("状态码404的有--:",len(status_404))

python3  json_access.py  

 关于 favicon.ico

favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错

方法一:服务器不记录访问日志:
location = /favicon.ico {
log_not_found off;
access_log off;
}
#方法二:将图标保存到指定目录访问:
#location ~ ^/favicon\.ico$ {
location = /favicon.ico {
root /data/nginx/html/pc/images;
expires 365d; #设置文件过期时间
access_log off;
}

#方法三:直接放在网页文件哪里

Nginx 压缩功能

 Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块
官方文档: https://nginx.org/en/docs/http/ngx_http_gzip_module.html 

配置指令如下:

启用或禁用gzip压缩,默认关闭
gzip on | off;


#压缩比由低到高从1到9,默认为1
gzip_comp_level level;


#禁用IE6 gzip功能                        有的没有
gzip_disable "MSIE [1-6]\.";

#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;


#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;


#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;


#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;


#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;


#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
#注意: 来自于ngx_http_gzip_static_module模块
gzip_static on | off;

 配置指令如下:

#启用或禁用gzip压缩,默认关闭
gzip on | off;
#压缩比由低到高从1到9,默认为1
gzip_comp_level level;
#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
#注意: 来自于ngx_http_gzip_static_module模块
gzip_static on | off;
#重启nginx并进行访问测试压缩功能
[root@centos8 ~]# cp /apps/nginx/logs/access.log /data/nginx/html/pc/m.txt
[root@centos8 ~]# echo "test" > /data/nginx/html/pc/test.html #小于1k的文件测试是否
会压缩
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf

server {
    listen 80 ;
    server_name www.wang.org;
    root /data/nginx/html/pc/;

gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
gzip_vary on;

}

https 加密 

server {
    listen 80 ;  
    server_name 8467238_m50.wangxiaochun.com.pem;     (名字必须和加密文件一样)
    root /data/nginx/html/pc/;
    listen 443 ssl http2;
    ssl_certificate /apps/nginx/conf/conf.d/8467238_m50.wangxiaochun.com.pem;  
    ssl_certificate_key /apps/nginx/conf/conf.d/8467238_m50.wangxiaochun.com.key;
}   指定目录文件夹俩钥匙

DNS 也要改 域名改了嘛

https://8467238_m50.wangxiaochun.com/

 

 

平滑升级和回滚

 有时候需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停止,这时就可以选择平滑升级

平滑升级四个阶段

  1. 只有旧版nginx的master和worker进程
  2. 旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求(注意:做快照方便测试回滚)
  3. 旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
  4. 只有新版nginx的master和worker进程

 下载最新稳定版
[root@centos8 ~]#wget http://nginx.org/download/nginx-1.23.1tar.gz (本身22.0只能如此)[root@centos8 ~]#tar xvf nginx-1.23.1.tar.gz
[root@centos8 ~]#cd nginx-1.23.1

#查看当前使用的版本及编译选项。结果如下

[root@centos8 ~]/apps/nginx/sbin/nginx -V
nginx version: nginx/1.22.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --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

configure arguments    #后面是以前编译时的参数。现在编译使用一样的参数
#开始编译新版本

[root@centos8 nginx-1.22.0]#./configure     --prefix=/apps/nginx --user=nginx --
group=nginx --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
[root@centos8 nginx-1.22.0]#make
[root@centos8 nginx-1.22.0]#objs/nginx -v
nginx version: nginx/1.22.0

#查看两个版本
[root@centos8 nginx-1.22.0]#ll objs/nginx /apps/nginx/sbin/nginx
-rwxr-xr-x 1 nginx nginx 7591096 Jun 7 16:28 /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root root 7723272 Jun 7 17:27 objs/nginx

#把之前的旧版的nginx命令备份     防止不兼容,可用来回滚
[root@centos8 nginx-1.22.0]#cp /apps/nginx/sbin/nginx /opt/nginx.old

#把新版本的nginx命令复制过去覆盖旧版本程序文件,注意:需要加 -f 选项强制覆盖,否则会提示Text
file busy

[root@centos8 nginx-1.22.0]#cp -f ./objs/nginx /apps/nginx/sbin/

#如果cp 不加-f 选项,会出现下面提示
[root@rocky8 nginx-1.23.1]#cp objs/nginx /apps/nginx/sbin/
cp: overwrite '/apps/nginx/sbin/nginx'? y
cp: cannot create regular file '/apps/nginx/sbin/nginx': Text file busy

检测一下有没有问题
[root@centos8 nginx-1.23.1]#/apps/nginx/sbin/nginx -t

#发送信号USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx

  • #此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
  • 此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。

[root@centos8 nginx-1.23.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`

#可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程

[root@centos8 nginx-1.23.1]#ps auxf|grep nginx

  • root       34825  0.0  0.0   9392   720 pts/1    S+   18:04   0:00          \_ grep --color=auto nginx
  • root         751  0.0  0.1   8624  3044 ?        Ss   06:06   0:00 nginx: master process /apps/nginx/sbin/nginx
  • nginx      34135  0.0  0.1   9292  3356 ?        S    17:38   0:00  \_ nginx: worker process

#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚

  • #向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理

[root@centos8 nginx-1.23.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin` 

#如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭

[root@centos8 nginx-1.23.1]#pstree -p|grep nginx
|-nginx(8814)---nginx(12014)-+-nginx(12015)
| `-nginx(12016)
#经过一段时间测试,新版本服务没问题,最后发送QUIT信号,退出老的master

[root@centos8 nginx-1.23.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`
#查看版本是不是已经是新版了
[root@centos8 nginx-1.23.1]#nginx -v

#回滚
#如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker

[root@centos8 nginx-1.23.1]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@centos8 nginx-1.23.1]#pstree -p |grep nginx

#最后关闭新版的master
[root@centos8 nginx-1.23.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`
#恢复旧版的文件
[root@rocky8 ~]#mv /opt/nginx.old /apps/nginx/sbin/

[root@ubuntu2004 ~]#rpm -qc nginx     #可以查看读取的配置文件适用于yum安装

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值