这篇博客记录一下Nginx的目录结构,Master-Worker多进程模型,和基本配置

一、目录结构

用tree工具查看一下目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost nginx]# tree
.
├── client_body_temp #POST 大文件暂存目录
├── conf #Nginx配置文件目录
│   ├── fastcgi.conf
│   ├── fastcgi.conf.default
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf #主配置文件目录
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp #临时目录
├── html #默认站点目录
│   ├── 50x.html #访问失败
│   └── index.html #默认首页
├── logs #日志文件
│   ├── access.log
│   ├── error.log
│   └── nginx.pid
├── proxy_temp
├── sbin #Nginx可执行文件
│   └── nginx
├── scgi_temp #临时目录
└── uwsgi_temp #临时目录

二、Master-Worker多进程模型

Ngnix采用了Master-Worker模型,Master-Worker模式是常用的并行设计模式。它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程。Master进程负责接收和分配任务,Worker进程负责处理子任务。当各个Worker进程将子任务处理完后,将结果返回给Master进程,由Master进行归纳和汇总,从而得到系统结果。

Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。worker进程主要处理基本的网络事件,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般会设置与机器cpu核数一致。
我们可以查看一下当前系统中的Ngnix进程,可以看到它的确是有master和worker进程

1
2
3
4
[root@localhost nginx]# ps -ef | grep nginx
root 4548 1 0 12:14 ? 00:00:00 nginx: master process /usr/localnginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 4549 4548 0 12:14 ? 00:00:00 nginx: worker process
root 12885 1721 0 14:36 pts/0 00:00:00 grep --color=auto nginx

三、基本配置

打开ngnix.conf配置文件查看当前配置,先只保留最基本的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
worker_processes  1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

(1)work_processes

决定了worker的进程数量,一般与CPU的内核数相同

(2)worker_connections

单个进程最大连接数(最大连接数=连接数*进程数)

(3)include

include可以包含外部配置文件,mime.types是文件扩展名与文件类型映射表。浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 Web服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。如果预先定义的类型没匹配上,默认使用二进制流的方式传输

(4)sendfile

sendfile函数在两个文件描述符之间传递数据,从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,被称为零拷贝。打个比方就是两个人之间传输数据并不需要通过U盘拷贝,而是直接传输。
在off的状态下,Nginx 读取本地文件后,在进行网络传输时会先将硬盘文件从硬盘中读取到 Nginx 的文件缓冲区中,操作流程为硬盘 → 内核文件缓冲区 → 应用缓冲区。然后将 Nginx 文件缓冲区的数据写入网络接口,操作流程:应用缓冲区 → 内核网络缓冲区 → 网络接口。
Nginx 的本地文件在进行网络传输的过程中,经历了上述两个操作过程,两次操作都在内核缓冲区中存储了相同的数据。为了提高文件的传输效率,内核提供了零复制技术,该技术支持文件在内核缓冲区内直接交换打开的文件句柄,无须重复复制文件内容到缓冲区,则上述两个操作的流程变为:硬盘 → 内核文件缓冲区 → 内核网络缓冲区 → 网络接口。

(5)serve

serve为虚拟主机配置,虚拟主机是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。虚拟主机之间完全独立,并可由用户自行管理,虚拟并非指不存在,而是指空间是由实体的服务器延伸而来,其硬件系统可以是基于服务器群,或者单个服务器。我们可以在ngnix中配置多个虚拟主机,管理多个不同的站点。