运维入门到入土之企业级高性能web服务器的部署和优化,代码写好!直面天命!我们都是天命人!!

一 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的进程

平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的
nginx
此时两个 master 的进程都在运行 , 只是旧的 master 不在监听 , 由新的 master 监听 80
此时 Nginx 开启一个新的 master 进程,这个 master 进程会生成新的 worker 进程,这就是升级后的 Nginx 进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理
回收旧版本进程
测试当前版本

四 nginx核心配置

4.1建立新的web站点

指定子配置文件
创建一个web站点
 新建里面的目录写入网络信息
添加本地解析
重启并且访问测试

4.2 root与alias

4.2.1 root

root :指定 web 的家目录,在定义 location 的时候,文件的绝对路径等于 root+location

 写入网页信息

测试

4.2.2 alias

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少

 测试

 4.3 location详细使用

在一个 server location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射;
ngnix 会根据用户请求的 URI 来检查定义的所有 location ,按一定的优先级找出一个最佳匹配, 而后应用其配置在没有使用正则表达式的时候,nginx会先在server 中的多个 location 选取匹配度最高的一个uri
uri 是用户请求的字符串,即域名后面的 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+waiting
accepts: # 统计总值, 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数据压缩功能

Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT 支出,不过会占用相应的CPU 资源。
Nginx 对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模块
gzip on | off;        #启用或禁用 gzip 压缩,默认关闭
gzip_comp_level 4;        #压缩比由低到高从 1 9 ,默认为 1 ,值越高压缩后文件越小,但是消耗 cpu 比较高。基本设定未 4 或者 5
gzip_disable "MSIE [1-6]\.";        #禁用 IE6 gzip 功能,早期的 IE6 之前的版本不支持压缩
gzip_min_length 1k;        #gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_http_version 1.0 | 1.1;        #启用压缩功能时,协议的最小版本,默认 HTTP/1.1
gzip_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指令

用于条件匹配判断,并根据条件判断结果选择不同的 Nginx 配置,可以配置在 server location 块中进行配置,Nginx if 语法仅能使用 if 做单次判断,不支持使用 if else 或者 if elif 这样的多重判断,用法如下:
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
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值