一 web服务器
常见的web服务器无非就是Apache和nginx,市面上常用的是nginx,但是少量商家使用的是Apache
这里简单介绍一下Apache的三种模型
1.1 Apache prefork模型
预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024每个子进程有一个独立的线程响应用户请求相对比较占用内存,但是比较稳定,可以设置最大和最小进程数是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景优点:稳定缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景
1.2Apache worker模型
种多进程和多线程混合的模型
有一个控制进程,启动多个子进程
每个子进程里面包含固定的线程 ,使用线程来处理请求当线程不够使用的时候会再启动一个新的子进程 , 然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发优点:相比 prefork 占用的内存较少,可以同时处理更多的请求缺点:使用 keepalive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork模式下,同样会发生)
1.3Apache event模型
Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll)每个进程响应多个请求,在现在版本里的已经是稳定可用的模式它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放缺点:没有线程安全控制
二 nginx源码安装
官方源码包地址 https://nginx.org/en/download.html
编译安装过程
下载必要的包,否则编译会显示缺少包文件
创建一个不可交互的用户,为文件执行提供身份
将文件压缩包传到虚拟机上解压
利用configure文件加载相应模块
开始安装
安装完成后,更改配置文件,查看版本
编辑nginx启动文件
启动nginx
三 Nginx平滑升级和回滚
为了不影响正在运行的服务,保持服务稳定性,我们建议nginx使用平滑回滚或者平滑升级
解压其他版本的安装包
这里是额外加的模块
全部解压
加载模块,以及刚刚解压的模块
安装
旧版本命令备份
将新版命令复制过去
检测是否存在问题
查看1.24的进程
四 nginx核心配置
4.1建立新的web站点
4.2 root与alias
4.2.1 root
写入网页信息
测试
4.2.2 alias
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少
测试
4.3 location详细使用
在一个 server 中 location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射;ngnix 会根据用户请求的 URI 来检查定义的所有 location ,按一定的优先级找出一个最佳匹配, 而后应用其配置在没有使用正则表达式的时候,nginx会先在server 中的多个 location 选取匹配度最高的一个uriuri 是用户请求的字符串,即域名后面的 web 文件路径然后使用该location 模块中的正则 url 和字符串,如果匹配成功就结束搜索,并使用此 location 处理此请求。
# 语法规则:location [ = | ~ | ~* | ^~ ] uri { ... }= # 用于标准 uri 前,需要请求字串与 uri 精确匹配,大小敏感 , 如果匹配成功就停止向 下匹配并立//即处理请求^~ # 用于标准 uri 前,表示包含正则表达式 , 并且匹配以指定的正则表达式开头# 对 uri 的最左边部分做匹配检查,不区分字符大小写~ # 用于标准 uri 前,表示包含正则表达式 , 并且区分大小写~* # 用于标准 uri 前,表示包含正则表达式 , 并且不区分大写不带符号 #匹配起始于此 uri 的所有的 uri\ # 用于标准 uri 前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通 符号#匹配优先级从高到低:=, ^~, ~/~*, 不带符号
因为等号的优先级大于/,因此这里先将“虎先锋”注释掉
删除虎先锋注释
4.4 nginx账户认证功能
非交互建立用户认证,-c表示创建一个用户密码文件,之后创建认证就不需要再-c防止之前问文件被覆盖
建立网页页面,配置网页用户认证
在windows主机的c:/windows/system32/dirver/etc/hosts添加本地解析
访问就会让客户进行用户认证
4.5 自定义错误页面
编辑错误页面主配置
当404的时候去访问/40x.html
然后location定义uri为/40x.html的页面位置
访问测试
4.6 自定义错误日志
本地默认nginx访问和错误日志是在/usr/local/nginx/logs/下面
把错误日志和访问日志在子配置文件中做个重定向
创建错误日志目录,不需要创建文件,会自动生成
4.7 检测文件是否存在
若访问的指定类型的uri不存在,则会访问后面指定的文件
这里一定要写root,指定好目录,不然会500报错,找不到default.html文件,导致反复重定向报错
测试
4.8 长链接配置
更改主配置文件
timeout是指长链接保持时间,如果设置成0就是不可连
requests是指能允许最多的连接次数
利用telnet,如果没有这个软件,可以dnf install下载软件
尝试两次连接后直接断开
timeout有两个参数,前一个是链接保持的真实时间,第二个是用户看到链接保持的时间,一般长链接保持五分钟,这里为了看效果保持5秒
客户连接显示保持2秒,连接上后没有连接第二次,过了五秒自动断开
4.9 作为下载服务器配置
创建相关目录,写入相关信息,网页不需要是html结尾,因为是下载页面
重启服务
不能下载是因为被我游览器拦截了
五 nginx高级配置
5.1 nginx状态页
状态页配置依赖的模块
编辑配置文件
这边显示了各个参数
Active connections:# 当前处于活动状态的客户端连接数# 包括连接等待空闲连接数 =reading+writing+waitingaccepts: # 统计总值, Nginx 自启动后已经接受的客户端请求连接的总数。handled:# 统计总值, Nginx 自启动后已经处理完成的客户端请求连接总数# 通常等于 accepts ,除非有因 worker_connections 限制等被拒绝的连接requests: # 统计总值, Nginx 自启动后客户端发来的总的请求数Reading:# 当前状态,正在读取客户端请求报文首部的连接的连接数# 数值越大 , 说明排队现象严重 , 性能不足Writing:# 当前状态,正在向客户端发送响应报文过程中的连接数 , 数值越大 , 说明访问量很大Waiting: # 当前状态,正在等待客户端发出请求的空闲连接数开启 keep-alive 的情况下 , 这个值等于 active – (reading+writing)
一般状态页不会让客户看,需要指定查看的用户,一般要设定用户认证,或者指定ip访问
用户认证
放行IP
放行了windows主机的ip,因此只有windows主机可以访问,虚拟机上是访问不到的403报错
5.2 nginx数据压缩功能
gzip on | off; #启用或禁用 gzip 压缩,默认关闭gzip_comp_level 4; #压缩比由低到高从 1 到 9 ,默认为 1 ,值越高压缩后文件越小,但是消耗 cpu 比较高。基本设定未 4 或者 5gzip_disable "MSIE [1-6]\."; #禁用 IE6 gzip 功能,早期的 IE6 之前的版本不支持压缩gzip_min_length 1k; #gzip压缩的最小文件,小于设置值的文件将不会压缩gzip_http_version 1.0 | 1.1; #启用压缩功能时,协议的最小版本,默认 HTTP/1.1gzip_buffers number size; #指定 Nginx 服务需要向服务器申请的缓存空间的个数和大小 , 平台不同 , 默认 :32 4k 或者 16 8k;gzip_types mime-type ...; #指明仅对哪些类型的资源执行压缩操作 ; 默认为 gzip_types text/html ,不用显示指定,否则出错gzip_vary on | off; #如果启用压缩,是否在响应报文首部插入 “Vary: Accept-Encoding”, 一般建议打开# 预压缩,即直接从磁盘找到对应文件的 gz 后缀的式的压缩文件返回给用户,无需消耗服务器 CPU# 注意 : 来自于 ngx_http_gzip_static_module 模块gzip_static on | off;
一般常用的参数gzip on | off;gzip_comp_level 4;gzip_min_length 1k;gzip_http_version 1.0 | 1.1;gzip_types mime-type ...;gzip_vary on | off;
创建一个没超过1k和一个超过1k 的网页文件
利用curl --head --compressed访问
5.3 nginx版本隐藏
因为保证安全,不开放nginx版本的信息,所以需要隐藏版本
5.4 nginx变量使用
5.4.1内置常用变量
$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;
使用我们之前安装的echo模块,添加本地解析
结果是可以输出echo的
5.4.2 自定义变量
六 Nginx Rewrite的相关功能
6.1ngx_http_rewrite_module 模块指令
官方文档: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
6.1.1 if指令
if (条件匹配) {action}
使用正则表达式对变量进行匹配,匹配成功时 if 指令认为条件为 true ,否则认为 false ,变量与表达式之间使用以下符号链接:= # 比较变量和字符串是否相等,相等时 if 指令认为该条件为 true ,反之为 false!= # 比较变量和字符串是否不相等,不相等时 if 指令认为条件为 true ,反之为 false~ # 区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假!~ # 区分大小写字符 , 判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* # 不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假!~* # 不区分大小字符 , 判断是否匹配,满足匹配条件为假,不满足匹配条件为真-f 和 !-f # 判断请求的文件是否存在和是否不存在-d 和 !-d # 判断请求的目录是否存在和是否不存在-x 和 !-x # 判断文件是否可执行和是否不可执行-e 和 !-e # 判断请求的文件或目录是否存在和是否不存在 ( 包括文件,目录,软链接 )# 注意:# 如果 $ 变量的值为空字符串或 0 ,则 if 指令认为该条件为 false ,其他条件为 true 。#nginx 1.0.1 之前 $ 变量的值如果以 0 开头的任意字符串会返回 false