nginx入门实践

nginx(engine x)是一种http服务器,反向代理服务器,tcp/udp代理服务器。因拥有很多优秀的特性和提供了丰富的功能,被广泛应用。具体可以看下官网介绍http://nginx.org/en/,最常见是被用于反向代理和负载均衡。本文着重介绍nginx的使用,以及负载均衡的原理。

nginx配置
安装nginx完成之后,安装目录下会有一个nginx.conf文件,里面提供了nginx常见的配置,并展示主要配置模块。可以归类如下:

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
  1. 全局块,对nginx的全局配置

    worker_processes 4; #进程数,一般设置为和cpu核数一样
    error_log /error.log crit; #错误日志存放目录
    user nginx; #运行用户,默认即是nginx,可不设置
    pid /application/nginx/nginx.pid; #进程pid存放位置
    worker_rlimit_nofile 51200; #每个进程可打开的最大文件描述符
    worker_cpu_affinity 0001 00100; #绑定进程到cpu
  2. events块,对nginx服务器和客户端的连接进行配置

    accept_mutex on; #设置网路连接序列化,防止发生惊群,默认开启
    multi_accept on; #设置一个进程是否同时接受多个网络连接,默认禁用
    use epoll;#epoll是多路复用IO(I/O Multiplexing)中的一种方式
    worker_connections 1024; #一个进程可连接的客户端的最大连接数

    介绍一下惊群,这里的惊群是指,当一个新的连接请求来的时候,所有的worker进程都将被唤醒,而最终只能有一个worker进行来处理这个连接请求,其他的worker就白白被唤醒。这里worder进程数就是由worker_processes来设置的。而避免惊群的方式就是新连接到来的时候,指定一个worder进程来处理,对其他worker无感知。但是需要注意的是nginx的worker进程不像apache会创建那么进程,进程数通常会设置成和当前机器的cpu数一样,所以即便有惊群现象,影响也是比较小。而且如果同时请求比较多的话,换句话说一次不是来一个连接请求,而是一批连接请求,那么如果每个请求都去指定一个worker去处理,效率反而会下降,影响最终的吞吐量。
    IO多路复用的实现方式跟系统有关,通常有下面几种
    select|poll|kqueue|epoll|resig|/dev/poll|eventport,在linux上使用的就是epoll,具体可以看一下NIO的相关文档。
  3. http全局块

    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型,默认为text/plain
    access_log log/access.log myFormat; #combined为日志格式的默认值
    sendfile on; #允许sendfile方式传输文件,默认为off
    sendfile_max_chunk 100k; #每个进程每次调用传输不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65; #连接超时时间,默认为75s
    error_page 404 error.html; #错误页

    sendfile是linux下文件传输的一种模式,概括来讲,就是文件由传统read和write方式,从io-内核buf-用户buf-socket相关buf-协议引擎经历4此copy,改为io-内核buf-协议引擎只需要两次copy,减少数据copy次数,提高传输效率。
  4. server块,一个server可以当成是一个虚拟主机,同一个nginx根据不同的server可以同时提供不同的服务。

    upstream mysvr {   #将会使用8087和8088进行负载均衡,8089会进行热备
      server localhost:8087 weight=1 max_fails=2 fail_timeout=30s;
      server localhost:8088 weight=1 max_fails=2 fail_timeout=30s;
      server localhost:8089 backup;  #热备
    }
    server {
        listen       80;   #监听端口
        server_name  domainName;   #监听地址       
        location / {
            root path; #根目录
            index index.html; #默认主页
        }
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 192.168.1.2; #允许的ip           
        } 
    }

    上面的配置的意思是,请求符合正则的将会使用负载均衡转发到定义的mysvr中的服务器上。而其他的,通常是静态资源会到root对应的目录中去寻找。upstream中可以ip加端口,也可以是域名加端口,如果没有端口,默认是80端口。weight是指负载均衡的权重,默认为1,值越大,将会有越多的请求发到这个server上。

    执行流程
    通过上面配置,nginx可以正常运行。而nginx的运行流程又是什么样的呢?网上有很多研究其源码的文章,我这里总结一下主要流程。
    1,在使用worker_processes进行配置表示的是创建worker进程数,其实除了worker进程之外,还会有master进程和cache manager进程。
    2,master进程也是nginx启动的主进程,从main函数开始执行到自身的事件循环,到最终的结束。其主要的工作是对nginx做整体的管理,包括对worker进程的管理,比如说启动,关闭等,而不做具体的请求处理,比如说连接,读写等,这是由worker完成的。master的事件循环,是对管理事件进行监听,然后通知各worker,从而达到对worker管理的作用。
    3,worker被master创建启动之后,会进入到自己的事件循环,在此循环中,一方面对master的事件进行响应,另一方面对连接和读写等事件进行处理。需要注意的是worker之间通过socket互相通信。
    4,cache manager/loader 是进行cache管理,主要用来将上游服务器返回的数据缓存在本地文件中,如果请求命中缓存,则直接通过sendfile将缓存文件的内容发送给下游。Cache的管理由Cache Loader/Cache Manager两个进程合作完成;Cache Manager的功能是定期清理过期缓存(基本策略为LRU);Cache Loader的功能是将已经缓存文件映射到内存中。
    那么一个请求来了之后,nginx具体怎么处理的呢?
    首先是worker在进行端口监听,无论配置了多少个server,这些server都是共用这些worker的。如果配置了accept_mutex那么将会交给其中一个worker进行处理,否则所有worker进行竞争。这中间要明确一个知识点,多个进程是可以同时监听一个端口的,通过fork就能实现,其实nginx便是这么让所有worker监听同一个端口的,而且进程之间存在竞争关系。
    这里写图片描述
    负载均衡
    负载均衡是nginx很重要的功能。有以下几种配置,分别对应了不同的路由转发规则:
    Round Robin(按照weight进行轮询)
    ip_hash
    generic_hash(按照uri进行hash)
    fair(按响应时间快慢路由)
    backend(其他请求失败的时候会落到此server)
    参考
    http://www.aosabook.org/en/nginx.html
    https://segmentfault.com/a/1190000004613261
    https://www.cnblogs.com/ajianbeyourself/p/5859989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值