Nginx入门到精通2-nginx框架

一、nginx框架

1.1 多进程模型

Nginx低资源消耗、高稳定、高性能的并发处理能力,来源于其优秀的代码架构。它采用了多进程模型,使自身具有低资源消耗的特性。以事件驱动的异步非阻塞多进程请求处理模型,使Nginx的工作进程通过异步非阻塞的事件处理机制,实现了高性能的并发处理能力,让每个连接的请求均可在Nginx进程中以工作流的方式得到快速处理。

Nginx采用的是固定数量的多进程模型,由一个主进程(管理进程)(Master Process)和数量与主机CPU核数相同的工作进程(Worker)协同处理各种事件。

  • 主管理进程负责工作进程的配置加载、启停等操作,工作进程负责处理具体请求。Master不处理具体的TCP/HTTP请求,只接收UNIX信号,管理和监控Worker进程;
  • 进程间的资源都是独立的,每个工作进程处理多个连接,每个连接由一个工作进程全
    权处理,不需要进行进程切换,也就不会产生由进程切换引起的资源消耗问题;
  • Nginx的多个进程间就是通过信号、管道、共享内存的方式共享数据的,主进程启动时创建共享内存,工作进程创建(fork方式)完成后,所有的进程都开始使用共享内存;
  • 当某个worker因为意味中止时,master进程会fork出一个新的worker进程。

主进程:

master进程主要用来管理worker进程,具体包括如下4个主要功能:

1)接受来自外界的信号。其中master循环中的各项标志位就对应着各种信号,如:ngx_quit代表QUIT信号,表示优雅的关闭整个服务。

2)向各个worker进程发送信。比如ngx_noaccept代表WINCH信号,表示所有子进程不再接受处理新的连接,由master向所有的子进程发送QUIT信号量。

3)监控worker进程的运行状态。比如ngx_reap代表CHILD信号,表示有子进程意外结束,这时需要监控所有子进程的运行状态,主要由ngx_reap_children完成。

4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。主要也是在ngx_reap_children。

nginx为什么不采用多线程的方式:

  • 采用独立的进程,可以让互相之间不会影响。一个进程异常崩溃,其他进程的服务不会中断,提升了架构的可靠性。
  • 进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。

1.2 模块化

Nginx一直秉持模块化的理念,其模块化的架构中,除了少量的主流程代码,都是模块。模块化的设计为Nginx提供了高度的可配置、可扩展、可定制特性。

模块代码包括核心模块和功能模块两个部分:核心模块负责维护进程的运行、内存及事件的管理;功能模块则负责具体功能应用的实现,包括路由分配、内容过滤、网络及磁盘数据读写、代理转发、负载均衡等操作。 

二、nginx配置指令

2.1 nginx配置指令

Nginx的配置指令很多,为了方便理解和使用,可以按照其在代码中的分布,将其分为核心配置指令和模块配置指令两大类。

核心配置指令分为事件核心配置指令和HTTP核心配置指令。

  • 事件核心配置指令主要是与Nginx自身软件运行管理及Nginx事件驱动架构有关的配置指令;
  • HTTP核心配置指令是对客户端从发起HTTP请求、完成HTTP请求处理、返回处理结果,到关
    闭HTTP连接的完整过程中的各个处理方法进行配置的配置指令。
  • 模块配置指令是在每个Nginx模块中对所在模块的操作方法进行配置的配置指令。

 2.2 核心配置指令

2.2.1 Nginx配置文件(nginx.conf)的结构解析

配置文件都会保存在/usr/local/nginx/conf目录下,在配置文件目录下,Nginx默认的主配置文件是nginx.conf,这也是Nginx唯一的默认配置入口。

conf/
├── 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

其中,以“.default”为扩展名的文件是Nginx配置文件的配置样例文件。

nginx.conf:Nginx默认的配置入口文件,语法格式如下

#user nobody;
worker_processes 1; # 只启动一个工作进程

events {  #配置event 配置块
    worker_connections 1024; # 每个工作进程的最大连接为1024
}

http {    #配置http 配置块
    include mime.types; # 引入MIME类型映射表文件
    default_type application/octet-stream; #全局默认映射类型为application/octet-stream
    #log_format main '$remote_addr -$remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent"$http_referer" '
    # '"$http_user_agent”"$http_x_forwarded_for"';
    #access_log logs/access.log main;
    sendfile on; # 启用零复制机制
    keepalive_timeout 65; # 保持连接超时时间为65s

    server {   #配置server 配置块
        listen 80; # 监听80端口的网络连接请求
        server_name localhost; # 虚拟主机名为localhost
        #charset koi8-r;
        #access_log logs/host.access.log main;
        location / {   #location配置块
            root html;   #设置http请求的根目录
            index index.html index.htm;#设置默认的index文件
        }
        error_page 500 502 503 504 /50x.html; #设置错误返回页
        location = /50x.html {   #设置http请求的根目录
        root html;
        }
    }
}

events和http所包含的部分分别为事件指令域和HTTP指令域,指令域内的指令则明确约定了该区域内的指令的应用范围。

核心配置指令可分为进程管理、进程调优、进程调试、事件处理四部分。

(1)worker_processes 进程管理

用户对nginx的运行方式、动态加载模块、日志输出等配置的基础指令。

worker_processes、master_processes、deamon等。

(2)events

Ngnix采用事件驱动,利用操作系统内核提供的epoll、kqueue等系统调用处理网络连接,events处理事件机制。

(3)http

ngnix使用http配置http相关的所有功能,包括cache、fastcgi、gzip、server(虚拟主机)、location、proxy、upstream(配置上游服务器)等。

server指令域被包含于http指令域中,同时又包含了location指令域,各指令域中的共
用范围逐层被上层指令域限定,可见各指令域匹配的顺序是由外到内的。

包含在最内层的指令将对外层同名指令进行指令值覆盖,并以最内层指令配置为最终生效配置。

其他配置:

TCP/UDP 服务、反向代理、负载均衡、代理转发。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值