Nginx的中间件架构
中间件能够做到服务分发,分层优化服务。
Nginx
是一个开源且高性能、可靠的HTTP
中间件、代理服务。
我们看下Nginx
具体有哪些优势:
采用IO多路复用epoll模型
epoll
模型一般是指IO
读写的一种方式,之前学习Python
协程的时候讲了协程原理的时候有深入了解过epoll
。
硬件最终都是要由内核来驱动的
每次请求对应一个 Socket 产生一个IO流 需要一种好的方式来处理海量的IO流
如果使用单线程处理 就会造成阻塞
实现IO复用的处理方式
- 多进程多线程处理
- 多路IO复用
对于多线程或者多进程处理来说,一个线程只能处理一个流的I/O
事件。如果想要处理多个流,要么多进程(fork),要么多线程(pthread_create),这两种方式的效率都不是很高。
可以交给一个线程去采用IO
复用模式。
多个描述符的 I/O 操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的”复用”指的是复用同一个线程。
具体详细请查看文章:
Linux IO模式及 select、poll、epoll详解
轻量级
功能模块少:
源代码里只有核心代码,其他代码以插件形式安装
代码模块化:
适合二次改进
CPU亲和(affinity)
nginx
正是利用到了cpu
的亲和来提高并发处理能力以及减少不必要的cpu
损耗。
- 什么是
CPU
亲和
是一种把CPU
核心和Nginx
工作进程绑定方式,把每个worker
进程固定在一个cpu
上执行,减少cpu
的cache miss
(CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss)),获得更好的性能。 - 为什么需要
CPU
亲和
nginx
作为接入层的中间件,nginx
通过多个work
进程进行处理。
假设我们主机是两个CPU
,每个有四个核心,我们把CPU
的八个进程分别绑定到不同的CPU
上(也就是不同的work
分配到不同的核心上)。如果有多个CPU
利用自带的CPU
切换,会造成性能损失。利用这种CPU
的亲和绑定,就能减少切换的损耗。
采用sendfile机制
我们看下没有采用sendfile
机制的静态文件访问
上图是传统的http
服务,当我们访问一个文件时,会先经过内核空间,再经过用户空间,最后传给socket
,最后通过response
返回给用户。该过程需要多次与用户空间进行切换,但是静态文件其实不需要与用户空间进行过多的逻辑处理。直接可以通过内核空间传输。
sendfile
机制(零拷贝)只通过内核空间,将文件传给socket
,最终响应给用户。
因此nginx
在处理CDN和动静分离服务时有很大优势。
Nginx的目录和配置语法
Nginx的安装目录
在上一节我们安装了nginx,但是具体安装位置在哪我们如何查看呢?每个文件的作用是什么呢?编译参数是哪些呢?基本配置语法有哪些呢?下面,我们一起学习吧!
一:安装目录详解
首先我们查看一下安装nginx
之后总共生成了哪些文件
1 | [root@hongshaorou ~]# rpm -ql nginx |
在上面的文件中包括配置文件和日志文件,下面我们看看主要文件含义。
1 | 路径:/etc/logrotate.d/nginx |
1 | 路径:/etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf |
1 | 目录:/etc/nginx/fastcgi_params /etc/nginx/uwsgi_params /etc/nginx/scgi_params |
1 | 目录:/etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf |
1 | 目录:/etc/nginx/mime.types |
1 | 路径:/usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug |
1 | 路径:/usr/lib64/nginx /etc/nginx/modules |
1 | 目录:/usr/sbin/nginx /usr/sbin/nginx-debug |
1 | 目录:/usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz |
1 | 目录:/var/cache/nginx |
1 | 目录:/var/log/nginx |
Nginx编译配置参数
首先我们查看看安装编译参数有哪些(即如果我们是使用编译安装的时候./configure
后面跟的配置)
1 | [root@hongshaorou ~]# nginx -V |
1 | 编译选项: |
1 | 编译选项: |
1 | 编译选项: |
1 | 编译选项: |
1 | 编译选项: |
默认配置语法
我们首先看看有哪些默认配置文件,打开nginx.conf文件
1 | [root@hongshaorou nginx]# cat nginx.conf |
我们看到将/etc/nginx/conf.d/
文件下其他以.conf
结尾的配置文件都导入到该文件中。
我们看看/etc/nginx/conf.d/
文件下默认有哪些文件
1 | [root@hongshaorou conf.d]# ls |
也就是说默认情况下有两个配置文件nginx.conf
default.conf
今天我们主要学习nginx.conf
配置文件,该配置文件主要分为三大块:
第一块:
1 | user 设置nginx服务的系统使用用户 |
第二块:(时间)
1 | events worker_connections 每个进程允许最大连接数 |
第三块:
1 | server { |
一个http
下面可以有多个server
,每个server
都有一个独立的站点,一个server
可以有多个location
.
我们查看文件详解
1 | ######Nginx配置文件nginx.conf中文详解##### |
虚拟主机的配置 /etc/nginx/conf.d/default.conf
1 | server |
拓展阅读:
v1.5.2