初识Nginx (一)
Nginx适用于哪些场景
一个web请求从红色箭头进来后,会先经过Nginx,然后进入应用程序,然后再去访问数据库或缓存服务。
那么这里有一个问题,我们的应用服务要求的开发效率很高,所以运行效率是很低的,它的qps、tps或者并发都是受限的。所以需要把很多这样的应用程序组成一个集群,来提供高可用服务,集群对外服务需要Nginx提供反向代理功能,可以把动态请求传递给应用服务。
多个应用构成集群,一定会带来两个需求:动态扩容和当服务出问题时候的容灾。所以反向代理必须具备负载均衡功能。
在这样一个链路中,Nginx在企业内网中处于一个边缘节点,随着网络链路的增长,用户的延迟会增加,如果能把一些不经常变更的动态资源缓存到Nginx中,由Nginx直接提供访问,这样用户延迟就会减少很多。所以反向代理会衍生出另外一个功能缓存,缓存能够加速访问。
由于数据服务的业务场景比较简单,tps,并发性能要比应用程序高,所以第三个应用场景就是由Nginx直接访问数据服务作为API服务,直接访问数据库,利用Nginx强大的并发能力,来提供防火墙这样的复杂业务功能。这要求API服务有强大的业务处理功能,所以像OpenResty,lua这样的语言功能和语言工具库来提供完整的API服务。
Nginx出现的历史背景
Nginx出现的原因主要有三个。第一个就是互联网上的数据量快速增长。数据的爆炸性增长对硬件提出了很高的要求。硬件的提升符合摩尔定律。但是本世纪初,摩尔定律从单颗CPU上已经失效了,CPU开始向多核方向发展。比如,当一个服务从8核升级到16核后,性能提升是低于一倍的,这部分损耗的性能是由于操作系统和软件服务没有做好服务多核架构的准备,比如Apache。
在Apache中,架构模型一个进程同一时间只会处理一个连接一个请求。实际上是在使用操作系统中进程切换的特性。操作系统微观上只有有限个CPU,但是操作系统设计为同时服务数百上千的进程。在Apache中如果同时面临几十万请求时,无法开启几十万的进程,e
Nginx可以处理数百万甚至上千万的并发连接
Nginx的市场份额图,在存量的基础上从其他web服务抢占份额,说明新的服务,很多都在使用Nginx来处理。
Nginx的5个主要优点
- 高并发,高性能:高并发往往只需要每个连接使用的内存尽量少就可以达到,同时达到高性能需要非常好的设计。Nginx在主流服务器,32核64G,可以轻松达到数千万并发连接,如果是处理简单的静态请求,可以达到100w的rps
- 可扩展性好:模块化设计,生态圈丰富
- 高可靠性:可以在服务器上持续不间断运行数年,一般的服务运行数月就需要重启,可以达到4个9,5个9这样的可靠性
- 热部署:不停止服务的情况下升级服务。一般的服务kill掉重启就可以,但是如果kill掉Nginx进程会导致操作系统给所有已经建立连接的客户端发送一个TCP中的reset包,很多客户端是没办法很好的处理这种情况的,在大并发情况下,一些偶然事件会导致必然的恶性结果
- BSD许可证:不只是开源免费,而且可以在基础上进行修改
Nginx的四个主要组成部分
- Nginx二进制可执行文件:由各模块源码编译出的一个文件。相当于汽车本身
- Nginx.conf配置文件:控制nginx的行为,开启哪些功能,具体参数设置。相当于驾驶员
- access.log访问日志:记录没一条http请求信息与响应信息。相当于汽车经过的地方的轨迹
- error.log错误日志:相当于黑匣子
四个部分相辅相成,二进制文件和配置,定义了Nginx处理请求的方式;如果想对服务进行运营分析,需要对access.log进行进一步分析;如果出现了未知问题,需要由error.log来定位根本问题
Nginx发行版本
五个主要的Nginx版本
- 开源Nginx
- 商业版Nginx Plus
- 阿里Tengine:经过了阿里的严苛考验,有些特性优于Nginx;但是没有办法根据Nginx同步升级
- 开源OpenResty
- 商业版OpenResty
如果没有太多业务诉求,使用开源版Nginx
如果需要API服务器或者防火墙,使用开源OpenResty
安装Nginx
对于一些常见的 Linux 发行版本,OpenResty® 提供 官方预编译包。确保你首先用这种方式来安装。
你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令)。运行下面的命令就可以添加我们的仓库:
yum install yum-utils -y
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
然后就可以像下面这样安装软件包,比如 openresty:
yum install openresty -y
如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:
yum install openresty-resty -y
命令行工具 opm 在 openresty-opm 包里,而 restydoc 工具在 openresty-doc 包里头。
列出所有 openresty 仓库里头的软件包:
yum --disablerepo="*" --enablerepo="openresty" list available
参考 OpenResty RPM 包页面获取这些包更多的细节。
Nginx 目录结构
Nginx 文件结构比较简洁,主要包括配置文件和二进制可执行程序,通过安装包形式安装的 nginx 文件结构跟各 Linux 发行版目录规则存放配置文件和二进制文件的位置。
源码安装一般会把所有文件一起放到/usr/local/nginx,安装后整体的目录结构及文件功能如下:
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
Nginx配置文件
- 配置文件由指令与指令块构成
- 每条指令以;分号结尾,指令与参数间以空格分割
- 指令块以{}大括号将多条指令组织在一起
- include语句允许组合多个配置文件以提升可维护性
- 使用#符号添加注释,提高可读性
- 使用$符号使用变量
- 部分指令的参数支持正则表达式
配置参数 时间单位
ms: milliseconds
s: seconds
m: minutes
h: hours
d: days
w: weeks
M: months,30days
y: years,365days
配置参数 空间单位
默认: bytes
k/K: kilobytes
m/M: megabytes
g/G: gigabytes
文章内容参考极客时间专栏