便宜的网站设计,全球邮邮箱登录,浙江建设工程招标网,企业邮箱的格式长什么样子Nginx基础
课程目标 掌握nginx的特点及完成nginx安装部署 掌握http协议的请求与响应以及常用状态码 掌握nginx的配置文件参数含义 掌握nginx日志 掌握nginxweb模块的设置 掌握nginx的访问相关控制
课程实验 IO多路复用介绍及nginx的部署安装 http协议与状态码 nginx编…Nginx基础课程目标掌握nginx的特点及完成nginx安装部署掌握http协议的请求与响应以及常用状态码掌握nginx的配置文件参数含义掌握nginx日志掌握nginxweb模块的设置掌握nginx的访问相关控制课程实验IO多路复用介绍及nginx的部署安装http协议与状态码nginx编译选项与执行选项nginx虚拟主机与web模块nginx日志nginx访问控制课堂引入nginx是目前webServer领域使用量最大的软件那么对于nginx的使用与原理掌握不管对日常工作还是面试都是非常重要的授课进程一、http协议1、概述HTTPHyper Text Transfer Protocol 全称超文本传输协议是用于从万维网WWW:World Wide Web 服务器传输超文本到本地浏览器的传送协议。HTTP 是一种应用层协议是基于 TCP/IP 通信协议来传递数据的其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.1 和 HTTP3.0协议 为了使数据在网络上从源头到达目的网络通信的参与方必须遵循相同的规则这套规则称为协议它最终体现为在网络上传输的数据包的格式。2、抓包工具1概述当我们访问一个网站时可能涉及不止一次的 HTTP 请求和响应的交互为此为了更加清楚的了解我们访问一个网站时 HTTP 请求/协议是怎么交互的由于 HTTP 是一个文本格式的协议就可以通过以下两种方式通过 F12 打开浏览器的开发者工具点击 Network 标签页然后刷新页面就行。显示的每一条记录都是一次 HTTP 请求/响应抓包工具如 Fiddler 它能够直接读取你电脑上网卡的信息网卡上有什么数据流动它都能感知到并且显示出来3、请求方式与响应状态码 【重点】1请求请求就是客户端向服务发送一个请求就是访问服务端的一个地址比如http://www.baidu.com常见的请求方式get 用于查询 用户向服务器获取请求资源 post 用于新增修改查询都可以常用于新增或者查询 put 用于修改 delete 用于删除2响应响应就是客户端发起请求服务端接收这个请求之后做出的响应那么响应就是有状态常见的响应状态码1xx表示临时响应并需要请求者继续执行操作的状态代码 2xx表示成功处理了请求的状态代码 3xx要完成请求需要进一步操作通常这些代码用来重定向 4xx表示请求可能出错妨碍了服务器的处理 5xx表示服务器在尝试处理请求时发生内部错误这些错误通常是服务器本身的错误并不是由于请求出错当然也有可能是访问者的故意为200 OK 表示访问成功 304 unmmodify 自从上次请求后请求的网页未修改过,访问本地缓存 404 Not Found 表示没有找到资源 403 Forbidden 表示访问被拒绝(没有权限) 405 Method Not Allowed 表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法 500 Internal Server Error 表示服务器出现内部错误 504 Gateway Timeout 表示当前服务器负载比较大服务器处理单条请求的时耗很长就会出现超时情况4、请求与响应格式【重点】1请求数据格式格式HTTP请求格式是由四部分组成请求行Request line包括请求方法、URL和协议版本 请求头部Request headers包括一些关于请求的额外信息如User-Agent、Content-Type、Authorization等 请求空行 请求体Request body用于传输请求的数据对于GET请求来说请求体通常为空示例GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q0.9请求行包括GET方法、URL为/index.html和协议版本为HTTP/1.1。 请求头部包括Host、User-Agent、Accept、Accept-Encoding和Accept-Language等字段。 请求体为空因为这是一个GET请求2响应数据格式格式HTTP响应格式是由四部分组成状态行HTTP/1.1 200 OK 表示HTTP版本是1.1状态码是200表示请求成功 响应头部包含日期、服务器类型、内容长度和内容类型等信息 空行头部和响应体之间的空行 响应体实际返回的数据这里是一个简单的HTML页面示例HTTP/1.1 200 OK Date: Wed, 02 Aug 2024 12:00:00 GMT Server: Apache/2.4.41 (Unix) Content-Length: 78 Content-Type: application/json; charsetUTF-8 { status: success, data: { id: 123, name: Example User, email: userexample.com } }5、会话技术1无状态HTTP无状态协议是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息则它必须重传这样可能导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就较快2会话技术【重要】HTTP 是一个无状态的协议一次请求结束后下次在发送服务器就不知道这个请求是谁发来的了同一个 IP 不代表同一个用户这样就无法确定你的本次请求和上次请求是不是你发送的。如果要进行类似论坛登陆相关的操作就实现不了http会话保持是Web开发中常用的技术用来跟踪用户的整个会话cookie客户端会话技术session服务端会话技术3cookie与session二、概述及安装1、概述Nginx是一款轻量级的高性能的Web服务器和反向代理服务器是由俄罗斯的程序设计师Igor Sysoev所开发Nginx 处理高并发能力是十分强大的能经受高负载的考验有报告表明能支持高达 50,000 个并发连接数官网地址为https://nginx.org/轻量级1.软件的体积比较小2.不需要依赖其它很多的内容只需要依赖少量的软件包3.运行所消耗的资源比较少cpu内存磁盘2、特点由于以下这几点所以使用Nginx非常火在互联网项目中广泛应用相较于 Apache具有占有内存少、稳定性高、并发能力强等优势Nginx 使用基于事件驱动架构使得其可以支持数以百万级别的 TCP 连接高度的模块化、扩展性好、和自由软件许可证、使得第三方模块层出不穷Nginx 是一个跨平台服务器可以运行在 Linux、Windows、Mac OS 等操作系统上3、原理进程模型在工作方式上Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下除主进程外还有一个工作进程工作进程是单线程的在多工作进程模式下每个工作进程包含多个线程。Nginx默认为单工作进程模式。Nginx在启动后会有一个master进程和多个worker进程。1master进程master进程主要用来管理worker进程具体包括如下4个主要功能收来自外界的信号向各worker进程发送信号监控woker进程的运行状态当woker进程退出后异常情况下会自动重新启动新的woker进程2worker进程而基本的网络事件则是放在worker进程中来处理了。多个worker进程之间是对等的他们同等竞争来自客户端的请求各进程互相之间是独立的。一个请求只可能在一个worker进程中处理一个worker进程不可能处理其它进程的请求。worker进程的个数是可以设置的一般我们会设置与机器cpu核数一致这里面的原因与nginx的进程模型以及事件处理模型是分不开的。worker进程之间是平等的每个进程处理请求的机会也是一样的。当我们提供80端口的http服务时一个连接请求过来每个进程都有可能处理这个连接怎么做到的呢Nginx采用异步非阻塞的方式来处理网络事件类似于Libevent具体过程如下1接收请求首先每个worker进程都是从master进程fork过来在master进程建立好需要listen的socketlistenfd之后然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读每个work进程都可以去accept这个socketlistenfd。当一个client连接到来时所有accept的work进程都会受到通知但只有一个进程可以accept成功其它的则会accept失败。为保证只有一个进程处理该连接Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept连接。所有worker进程在注册listenfd读事件前抢accept_mutex抢到互斥锁的那个进程注册listenfd读事件在读事件里调用accept接受该连接。 2处理请求当一个worker进程在accept这个连接之后就开始读取请求解析请求处理请求产生数据后再返回给客户端最后才断开连接这样一个完整的请求就是这样的了。我们可以看到一个请求完全由worker进程来处理而且只在一个worker进程中处理。worker进程之间是平等的每个进程处理请求的机会也是一样的。IO多路复用-epoll虽然nginx采用多worker的方式来处理请求每个worker里面只有一个主线程那能够处理的并发数很有限啊多少个worker就能处理多少个并发何来高并发呢非也这就是nginx的高明之处nginx采用了事件驱动和异步非阻塞I/O的方式来处理请求事件驱动模型Nginx 采用了事件驱动的模型来处理请求。在这种模型中主循环负责监听是否有新的事件如新的连接或者已有连接上的新数据一旦有事件发生就进行相应的处理。这种设计使得 Nginx 可以同时处理多个事件而不是在处理一个事件的时候阻塞其他事件。非阻塞 I/ONginx 使用了非阻塞的 I/O 操作。传统的阻塞 I/O 操作在读写数据的时候会阻塞当前的线程直到数据准备好才继续。而非阻塞 I/O 操作则会立即返回即使数据还没有准备好然后在后台继续等待数据。这样Nginx 可以在等待数据的同时处理其他的事件。因此nginx是可以同时处理成千上万个请求的。在处理一个连接的时候Nginx 不会被阻塞而是可以继续处理其他的连接。一个worker进程可以同时处理的请求数只受限于内存大小而且在架构设计上不同的worker进程之间处理并发请求时几乎没有同步锁的限制worker进程通常不会进入睡眠状态因此当Nginx上的进程数与CPU核心数相等时最好每一个worker进程都绑定特定的CPU核心进程间切换的代价是最小的。4、安装1基于扩展源yum的方式安装yum install epel-release -y yum --showduplicates list nginx2基于nginx指定源yum方式的安装官网文档地址https://nginx.org/en/linux_packages.html#RHELTo set up the yum repository, create the file named/etc/yum.repos.d/nginx.repowith the following contents:[nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_hotfixestrue [nginx-mainline] namenginx mainline repo baseurlhttp://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck1 enabled0 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_hotfixestrueyum install yum-utils -y # 安装yum工具包 yum-config-manager --enable nginx-mainline # 默认使用稳定版本如果想要使用主线版本执行该命令安装nginx稳定版系统时间设置yum install nginx -y3源码安装之前已经安装过此处不在进行赘述5、编译参数源码安装nginx的时候可以自定义很多的选项可以通过nginx -V查看编译选项列表nginx -V常见的选项有--prefix/etc/nginx 安装路径 --sbin-path/usr/sbin/nginx 二进制路径 --modules-path/usr/lib64/nginx/modules 模块路径 --conf-path/etc/nginx/nginx.conf 主配置文件 --error-log-path/var/log/nginx/error.log 错误日志 --http-log-path/var/log/nginx/access.log 访问日志 --pid-path/var/run/nginx.pid 进程文件 --usernginx 用户 --groupnginx 用户组 --with-http_gunzip_module 启动压缩模块 --with-http_ssl_module 启动安全模块6、目录介绍查询nginx安装后产生的文件及目录rpm -ql nginx/etc/logrotate.d/nginx 日志轮转 /etc/nginx/nginx.conf 总配置文件 /etc/nginx/conf.d 子配置文件 /etc/nginx/conf.d/default.conf 默认网站配置文件有可能没有那么就在总配置文件中 /etc/nginx/mime.types 多用途互联网邮件扩展类型文件类型 /usr/lib64/nginx/modules 第三方模块 /usr/lib/systemd/system/nginx.service 服务脚本 /usr/sbin/nginx 主程序 /usr/share/nginx/html 默认的项目文件目录 /var/cache/nginx 缓存目录 /var/log/nginx 日志目录7、配置文件介绍main # 全局配置对全局生效 ├── events # 配置影响 nginx 服务器或与用户的网络连接 ├── http # 配置代理缓存日志定义等绝大多数功能和第三方模块的配置 │ ├── upstream # 配置后端服务器具体地址负载均衡配置不可或缺的部分 │ ├── server # 配置虚拟主机的相关参数一个 http 块中可以有多个 server 块 │ ├── server │ │ ├── location # server 块可以包含多个 location 块location 指令用于匹配 uri │ │ ├── location │ │ └── ... │ └── ... └── ...全局块mainnginx 的全局配置对全局生效 events配置影响 nginx 服务器或与用户的网络连接 http可以嵌套多个 server配置代理缓存日志定义等绝大多数功能和第三方模块的配置 server配置虚拟主机的相关参数一个 http 中可以有多个 server location配置请求的路由以及各种页面的处理情况 upstream配置后端服务器具体地址负载均衡配置不可或缺的部分。vim /etc/nginx/nginx.confuser nginx; # nginx用户 worker_processes auto; # worker进程的数量auto表示自动一般与cpu数量保持一致 error_log /var/log/nginx/error.log notice; # 错误日志 pid /var/run/nginx.pid; # nginx进程号文件 events { worker_connections 1024; # 每个worker进程支持的最大连接数 } http { include /etc/nginx/mime.types; # Nginx支持的媒体类型库文件 default_type application/octet-stream; # 默认的媒体类型 log_format main $remote_addr - $remote_user [$time_local] $request # 日志格式名称为main $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log /var/log/nginx/access.log main; # 访问日志日志格式使用main格式 sendfile on; # 开启高效传输模式 #tcp_nopush on; # 不开启缓存区 keepalive_timeout 65; # 连接超时 #gzip on; # 不开启压缩 include /etc/nginx/conf.d/*.conf; # 包含的子配置文件一般里面配置的就是虚拟主机server }vim /etc/nginx/conf.d/default.confserver { # 一个server就表示一个虚拟主机一个网站 listen 80; # 提供服务的端口默认80 server_name localhost; # 提供服务的域名主机名 #access_log /var/log/nginx/host.access.log main; # 该虚拟主机的访问日志 location / { # 第一个location区块开始地址映射 root /usr/share/nginx/html; # 站点的根目录相当于Nginx的安装目录去哪里找文件 index index.html index.htm; # 默认的首页文件多个用空格分开 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; # 出现对应的http状态码时使用50x.html回应客户 location /50x.html { # location区块开始访问50x.html root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apaches document root # concurs with nginxs one # #location ~ /\.ht { # deny all; #} }8、启动参数nginx作为服务的相关命令systemctl start nginx # 启动nginx服务 systemctl stop nginx # 停止nginx服务 systemctl restart nginx # 重启nginx服务 systemctl reload nginx # 重新加载nginx配置文件 systemctl status nginx # 查看nginx服务的启动状态nginx命令相关的选项nginx -h # 查看帮助文档 nginx -s start|stop|reload|quit # 发送指定信号 nginx -t # 查看配置文件语法是否正确 nginx -v # 查看版本 nginx -e # 配置错误日志路径三、基本配置需求自定义一个虚拟主机监听80端口页面资源访问/opt/user主机名设置为user.woniu.cn思路 1. /etc/nginx/conf.d/default.conf复制出来一个配置文件 2. 定义一个存放页面文件的目录 3. 修改配置文件主机名/页面文件路径 4. 在真实机中配置hosts 5. 启动nginx 6. 测试访问四、日志1、概述Nginx的日志管理是一个重要的功能它允许用户跟踪和监控Nginx服务器的运行状态和性能。常用于排查错误或者用户数据的分析。Nginx日志主要记录以下信息记录Nginx服务启动和停止的信息记录客户端访问Nginx服务的信息包括客户端IP、客户端浏览器、访问时间、访问状态等等记录Nginx运行的异常情情况及错误信息如果你不进行任何配置的话这 2 个日志将会使用默认的日志配置这个日志将会位于/var/log/nginx目录中2、日志类型访问日志Access Log记录每个请求的信息包括客户端IP、请求时间、请求方法、URI、状态码、发送字节数等。通过访问日志得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息错误日志Error Log记录Nginx服务运行期间发生的错误信息和警告信息。通过错误日志得到系统某个服务或server的性能瓶颈等信息3、日志配置日志的配置主要体现在以下3个方面通过修改Nginx的配置文件通常是nginx.conf来定义日志的位置和格式。例如使用access_log和error_log指令来分别指定访问日志和错误日志的文件路径。Nginx还允许通过log_format指令定义自定义的日志格式。根据需要记录特定的信息。Nginx允许我们根据需要定义自定义的日志变量和字段。记录与特定请求或响应相关的特定信息以便后续分析和调试。1访问日志Nginx默认开启了访问日志的功能log_file是日志文件的绝对路径log_format是日志文件记录的格式。可以在http、server、location等指令的上下文中启用访问日志。log_format指令的配置仅可用在http模块内否则会出现警告信息access_log path [format [buffersize] [gzip[level]] [flushtime] [ifcondition]]; # 设置访问日志 access_log off; # 关闭访问日志 path 指定日志的存放位置。 format 指定日志的格式。默认使用预定义的combined。 buffer 用来指定日志写入时的缓存大小。默认是64k。 gzip 日志写入前先进行压缩。压缩率可以指定从1到9数值越大压缩比越高同时压缩的速度也越慢。默认是1。 flush 设置缓存的有效时间。如果超过flush指定的时间缓存中的内容将被清空。 if 条件判断。如果指定的条件计算为0或空字符串那么该请求不会写入日志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 /var/log/nginx/access.log main;变量 含义 $bytes_sent 发送给客户端的总字节数 $body_bytes_sent 发送给客户端的字节数不包括响应头的大小 $connection 连接序列号 $connection_requests 当前通过连接发出的请求数量 $msec 日志写入时间单位为秒精度是毫秒 $pipe 如果请求是通过http流水线发送则其值为p否则为“. $request_length 请求长度包括请求行请求头和请求体 $request_time 请求处理时长单位为秒精度为毫秒从读入客户端的第一个字节开始直到把最后一个字符发送张客户端进行日志写入为止 $status 响应状态码 $time_iso8601 标准格式的本地时间,形如“2024-05-24T18:31:2708:00” $time_local 通用日志格式下的本地时间如24/May/2024:18:31:27 0800 $http_referer 请求的referer地址。 $http_user_agent 客户端浏览器信息。 $remote_addr 客户端IP $http_x_forwarded_for 当前端有代理服务器时设置web节点记录客户端地址的配置此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。 $request 完整的原始请求行如 GET / HTTP/1.1 $remote_user 客户端用户名称针对启用了用户认证的请求 $request_uri 包含请求参数的原始URI不包含主机名如”/foo/bar.php?argbaz”需求1查看nginx的访问日志分析访问日志每个变量的的含义192.168.217.1 - - [19/Aug/2024:11:35:03 0800] GET / HTTP/1.1 200 5 - Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0 -需求2增加一个访问日志格式user记录日志的写入时间响应状态码客户端IP完整的请求行完整的请求地址。user虚拟主机启动user格式的日志vim /etc/nginx/nginx.conf log_format user $time_local $status $remote_addr $request $scheme://$host$request_uri; vim /etc/nginx/conf.d/user.conf access_log /var/log/nginx/access.log user;2错误日志error_log path(存放路径) level(日志等级) path含义同access_loglevel表示日志等级日志等级分为[ debug | info | notice | warn | error | crit ]从左至右日志详细程度逐级递减即debug最详细crit最少需要注意的是error_log off并不能关闭错误日志而是会将错误日志记录到一个文件名为off的文件中。正确的关闭错误日志记录功能的方法如下error_log /dev/null; 表示将存储日志的路径设置为“垃圾桶”error_log /var/log/nginx/error.log notice;需求1查看nginx的错误日志分析错误日志中信息的含义2024/08/19 17:32:12 [error] 1995#1995: *11 open() /woniu/user/a failed (2: No such file or directory), client: 192.168.217.1, server: user.woniu.cn, request: GET /a HTTP/1.1, host: user.woniu.cn课堂案例自定义404错误页面思路 1. 定义一个错误页面 2. 修改user.conf配置文件cd /woniu/user echo 我自己定义的404页面美不美。。。 404.html vim /etc/nginx/conf.d/user.conf error_page 404 /404.html; location /404.html { root /woniu/user; }4、日志轮转、压缩、删除为了管理旧的日志文件并节省磁盘空间结合使用logrotate工具来定期压缩和删除旧的日志文件。logrotate可以根据需求配置为每天、每周或每月执行一次压缩和删除操作。Nginx支持日志轮转功能这意味着它可以在达到一定的文件大小或时间限制时自动创建新的日志文件。这有助于防止日志文件变得过大并耗尽磁盘空间1. 检查并安装logrotate # rpm -qa | grep logrotate 2. 编写nginx的logrotate配置文件 # cat /etc/logrotate.d/nginx /usr/local/nginx/logs/*.log { daily # 每天轮转 missingok # 如果日志文件丢失不报错 rotate 52 # 保留52个备份 compress # 使用 gzip 压缩旧日志文件 delaycompress # 延迟压缩直到下一次轮转周期 notifempty # 如果日志文件为空不轮转 create 640 nginx nginx # 创建新日志文件并设置权限和所有权 sharedscripts # 如果有多个日志文件只运行一次 postrotate 脚本 postrotate if [ -f /var/run/nginx.pid ]; then # 检查PID文件是否存在 kill -USR1 cat /var/run/nginx.pid # 发送USR1信号(重新打开日志文件) fi endscript } 3. 手动运行logrotate date -s 2024-11-11 # /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf 4. 配置计划任务 # 添加内容每天0点执行logrotate /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf5、日志分析Nginx日志分析是管理和维护Nginx服务器]的重要部分。Nginx的访问日志access log和错误日志error log提供了关于服务器性能、用户访问模式以及任何潜在问题的关键信息常用字段$remote_addr $1 远程客户端地址 $time_local $4 本机时间 $request $7 请求URL $status $9 状态码 $body_bytes_sent $10 请求体积需求1统计ip访问情况要求分析nginx访问日志找出访问页面数量在前十位的ipcat access.log | awk {print $1} | uniq -c | sort -rn | head -10uniq删除文本文件中相邻的重复的行并写到标准输出 -c : 在每行前加上表示相应行目出现次数的前缀编号 -d : 只显示重复的行 -i : 略大小写差异 -u : 只显示出现一次的行sort以行为单位对文件进行排序 -b : 忽略前导的空格 -d : 只考虑空格,字母,数字 -f : 忽略字母的大小写 -M : 排序月份(未知词)“JAN” … “DEC” -n : 根据字符串的数值进行排序 -r : 逆向排序 -u : 对相同的行只输出一行 n : n 为数字,对指定的列进行排序,0 表示第1列, 以空格或制表符作为列的间隔符6、日志优化1不同项目不同的访问日志access_log /var/log/nginx/user.log user;2日志缓存大量访问到来时对于每一条日志记录都将是先打开文件再写入日志然后关闭.占用了系统的IO,与业务无关。 可以使用open_log_file_cache来设# open_log_file_cache off; open_log_file_cache max1000 inactive20s min_uses3 valid1m ; - max 1000 指的是日志文件的FD最大的缓存数量为1000 - min_uses 3 20秒内小于3次访问的FD就给你清掉结合inactive 20s 的时间 - valid 1m 检查周期为1分钟 总结缓存最多1000个到了极限,每分钟开始清除掉,20秒内小于3次的文件FD五、web模块1、连接状态目的观察用户与 nginx 服务器的链接数量 状态模块stub_status_module 启用状态模块 location /nginx_status { stub_status; allow all; } # 当有人访问 /nginx_status 这个页面时给他看 stub_status 这个模块授予所有用户访问权限需求给user虚拟主机添加连接状态查询模块location /nginx_status { stub_status; allow all; }Active connections: 22 当前活动的连接数 server accepts handled requests 6 6 6 服务器接受处理请求 6 总连接数connection(TCP) 6 成功的连接数connection (TCP) 6 总共处理的请求数requests(HTTP) Reading: 0 读取客户端Header的信息数请求头 Writing: 1 返回给客户端的header的信息数响应头 Waiting: 0 等待的请求数开启了keepalive2、文件读取模块ngx_http_core_module 原理 sendfile:sendfile() 不但能减少切换次数而且还能减少拷贝次数。 未使用sendfile() 的传统网络传输过程硬盘 kernel buffer user buffer kernel socket buffer 协议栈 使用 sendfile() 来进行网络传输的过程硬盘 kernel buffer (快速拷贝到kernelsocket buffer) 协议栈 tcp_nopush: 减少网络资源的浪费 未使用tcp_nopush()网络资源浪费:应用程序每产生一次操作就会发送一个包而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头于是产生4000%的过载很轻易地就能令网络发生拥塞。同时也浪费资源 使用tcp_nopush()网络传输效率提升:当包累计到一定大小后再发送 tcp_nodelay:开启或关闭nginx使用TCP_NODELAY选项的功能。 这个选项仅在将连接转变为长连接的时候才被启用。 TCP_NODELAY是禁用Nagle算法即数据包立即发送出去。 由于Nagle和DelayedACK的原因数据包的确认信息需要积攒到两个时才发送长连接情况下奇数包会造成延时40ms所以tcp_nodelay会将ack立刻发出去。 如果不在长连接时可以关闭此模块因为ack会被立刻发出去。sendfile on; tcp_nopush on;3、文件压缩模块ngx_http_gzip_module 作用使文件传输前进行压缩优化运行提高传输效率 启用压缩功能 gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_static on;需求上传图片或者文件到nginx服务器不开启压缩查看图片的访问情况需求开启压缩查看图片的访问情况4、页面缓存模块ngx_http_headers_module 目的expires 字段用于设置网页的过期时间起到控制页面缓存的作用减轻服务器端的压力 浏览器缓存 开启浏览器缓存访问界面第一次返回状态码 200第二次返回状态码 304 当第一次请求网页时服务器会返回状态码200表示成功响应请求浏览器会将页面的内容和 HTTP 头信息缓存起来 当再次请求这个页面时浏览器会先检查缓存中的页面是否有过期时间。如果没有过期服务器会检查页面是否有更新。如果页面没有更新服务器会返回一个状态码304浏览器就会直接从缓存中获取页面而不需要再次向服务器请求 若开启禁用缓存则访问页面的返回状态码一直是 200 启动缓存 location / { root /usr/share/nginx/html index index.html index.htm; expires 24h; }5、防盗链链接将互联网上的两个或多个网页相互连接起来使用户可以通过点击从一个页面跳转到另一个页面 盗链盗链是指服务提供商直接在自己的网站上向最终用户提供其它服务提供商的服务内容骗取用户的浏览和点击率。 防盗链防盗链则是一种保护资源不被盗用的技术手段阻止未经授权的网站或客户端访问受保护的资源链接。 模块ngx_http_referer_module 目的防止被盗链 启动 location / { root /a.com; index index.html index.htm; valid_referers none blocked *.admin.woniu.cn; if ($invalid_referer) { return 403; } }需求1在创建一个admin的虚拟主机在admin虚拟主机的默认页面中引用user虚拟主机中的图片查看效果html body img srchttp://user.woniu.cn/xue.png /body /html需求2在user虚拟主机中添加防盗链功能查看效果valid_referers none blocked *.admin.woniu.com; if ($invalid_referer) { return 403; }6、location1概述location模块是server块的一个指令。作用基于nginx服务器收到的请求字符串虚拟主机名称ip域名、url匹配对特定请求进行处理。2匹配规则及优先级匹配规则精准匹配location / {} 正则匹配location ~/{} 一般匹配location / {}匹配优先级精准匹配 正则匹配 一般匹配3案例演示需求在user主机中定义a.html b.html c.html请问以下地址如何显示 location /hello.html { root /opt/a; index hello.html; } location /hello.html { root /opt/c; index hello.html; } location ~* \.html$ { root /opt/b; index hello.html; } user.woniu.cn/hello.html 需求描述以下location的含义location /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { proxy_pass http://127.0.0.1; } location ~ /\.ht { deny all; }六、访问控制1、访问限制我们经常会遇到这种情况服务器流量异常负载过大等等。对于大流量恶意的攻击访问会带来带宽的浪费服务器压力影响业务往往考虑对同一个ip的连接数并发数进行限制包括限制并发连接数和连接请求数1限制并发连接数ngx_http_limit_conn_module 模块来实现。该模块可以根据定义的键来限制每个键值的连接数如同一个IP来源的连接数。并不是所有的连接都会被该模块计数只有那些正在被处理的请求这些请求的头信息已被完全读入所在的连接才会被计数语法http { limit_conn_zone $binary_remote_addr zoneconn_zone:10m; } server { location / { ... limit_conn conn_zone 2; } }语法limit_conn_zone key zonename:size; limit_conn_zone 定义限制连接的命名空间 key 一般填写binary_remote_addr和remote_addr代表的含义是一样的远程主机的IP只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节 zonename 命名空间 用来存储连接客户端ip size 空间大小作为限制存储连接客户端信息的上限需求通过user虚拟主机测试限制并发连接数http{ #区域名称为addr,共享内存缓存大小为10m limit_conn_zone $binary_remote_addr zoneaddr:10m; server{ location / { #该区域并发数不能超过2个 limit_conn addr 2; } }2限制并发请求处理速率限制并发请求处理速率模块用于限制对每个定义键的请求处理速率例如单客户端IP的每秒请求数。实现的原理是使用“漏桶”原理语法http{ #区域名称为one大小为10m平均处理的请求频率不能超过每秒一次 limit_req_zone $binary_remote_addr zoneone:10m rate1r/s; server{ location / { #允许超过频率限制的请求数不多于3个。如果不希望超过的请求被延迟可以用nodelay参数失败的都会以503状态返回 limit_req zoneone burst3 nodelay; } } }压力测试工具Apache AB或者Apache Jmeter本次使用ab工具进行测试jmeter的使用后续在进行讲解# 安装AB压测工具 yum -y install httpd-tools # 查看版本确认是否暗转成功 ab -VAB压测语法ab [options] [http://]hostname[:port]/path -n:本次测试发起的总请求数 -c:一次产生的请求数或并发数 示例ab -n 100 -c 20 http://user.woniu.cn/ 说明模拟 20 个人同时访问,每个人发送5个请求AB压测结果描述Document Path:测试页面 Document Length: 页面大小 Concurrency Level: 测试的并发数 Time taken for tests:整个测试持续的时间 Complete requests:完成的请求数量 Failed requests: 失败的请求数量 Total transferred: 整个过程中的网络传输量 HTML transferred: 整个过程中的HTML内容传输量 Requests per second: 最重要的指标之一相当于LR中的每秒事务数后面括号中的mean表示这是一个平均值 Time per request: 最重要的指标之二相当于LR中的平均事务响应时间后面括号中的mean表示这是一个平均值 Time per request: 每个连接请求实际运行时间的平均值 Transfer rate: 平均每秒网络上的流量可以帮助排除是否存在网络流量过大导致响应时间延长的问题需求进行以下配置使用ab工具进行压测观察结果http { limit_req_zone $binary_remote_addr zonereq_zone:10m rate1r/s; } server { location / { ... limit_req zonereq_zone burst3 nodelay; } }2、访问控制访问控制要做的事情是控制客户端的资源访问权限主要有两种方法一种是基于IP的访问控制另一种是基于Basic Auth认证基于IP的访问控制 ngx_http_access_module模块基于用户的信任登录 ngx_http_auth_basic_module模块1基于IP的访问控制 ngx_http_access_module模块模块允许限制访问某些客户端地址。访问也可以通过密码请求结果或JWT来限制满足控制地址和密码的同时访问限制语法location / { deny 192.168.223.129; #拒绝192.168.223.129 访问 allow all; #允许所有 root html; }allow访问 允许 address表示地址CIDR表示网段。unix:指定了特殊值则允许访问所有UNIX域套接字。all表示所有的 deny访问 拒绝 address表示地址CIDR表示网段。unix:指定了特殊值则拒绝访问所有UNIX域套接字。all表示所有的2基于用户的信任登录 ngx_http_auth_basic_module模块访问是需要账号密码才能够使用语法location / { auth_basic Auth access test! input your password!; #开启身份验证 auth_basic_user_file /etc/nginx/auth_conf; #指定身份验证文件地址 root html; }auth_basic 默认关闭开启的话输入一段字符串即可 auth_basic_user_file 该文件存储用户账号密码新增用户htpasswd -c /etc/nginx/auth_conf zhangsan New password: Re-type new password: Adding password for user zhangsanyum install httpd-tools -y修改nginx.conf配置location / { auth_basic Auth access test! input your password!; #开启身份验证 auth_basic_user_file /usr/local/nginx/auth_conf; #指定身份验证文件地址 root html; }课堂小结IO多路复用介绍及nginx的部署安装http协议与状态码nginx编译选项与执行选项nginx虚拟主机与web模块nginx日志nginx访问控制课后作业完成课堂的案例及练习将今天的内容整理为思维导图的形式完成以下面试题为什么使用nginxnginx常用的命令nginx虚拟主机有哪些nginx的常用模块有哪些nginx常用状态码统计ip访问情况要求分析nginx访问日志找出访问页面数量在前十位的ip编写一个Nginx的access模块要求准许192.168.3.29/24的机器访问准许10.1.20.6/16这个网段的所有机器访问准许34.26.157.0/24这个网段访问,除此之外的机器不准许访问扩展内容无