Nginx原理

  • 原理机制
    • Nginx采用多进程(每个worker进程只对应一个线程)和I/O多路复用机制,实现并发的事件驱动处理;
    • 多路复用即通过一种机制监视多个文件描述符,一旦文件描述符就绪(读写就绪),就可通知程序进行相应的读写操作;
    • 多路复用机制在处理单个连接没有优势,但在一个进程或线程内可处理多个连接;并减少系统开销,如创建进程或线程,维护进程或线程;
    • 一般worker 进程数设置成机器 cpu 核数,否则一个cpu多个worker进程会造成竞争(上下文切换);
    • master进程主要用来管理worker进程:接收外部信号(如命令行输入);向worker发送信号;监控worker状态;worker退出后创建新的worder进程;
    • Nginx采用epoll多路复用模型,相对于select模型,没有文件描述符数量限制;select/poll采用轮询方式,而epoll采用每个fd的回调函数获取状态变化;而且select/poll(没有文件描述符数量限制,但都采用轮询方式)要获取某个文件描述符状态时,需将文件描述符的集合在用户和内核之间复制整个集合,epoll只需要将用户关心的文件描述符一次性copy到内核;
    • I/O流操作概念
      • 阻塞:等待数据就绪,数据完成操作后(读/写)再返回进行下一个流操作,在I/O第一阶段和第二阶段都发生阻塞;
      • 非阻塞:主动轮询检查数据是否可以操作,直到数据完成操作并返回;在I/O第一阶段没有阻塞,但第二阶段发生阻塞;
      • 所以严格意义上,阻塞,非阻塞及多路复用都属于I/O同步;因为I/O操作分为两个阶段:数据就绪阶段,用户进程和内核进程之间的数据复制阶段;
      • 异步I/O操作不会导致请求进程阻塞,因为当发出I/O操作请求,直接返回,等待I/O操作完成后,再通知调用进程(回调函数);

 

 

  • 负载均衡策略
    • 默认轮询:以请求到服务(如Tomcat)的时间顺序不同来分配(如宕机自动忽略);

upstream tomcat_server
{
       server 192.168.1.100:8080;
       server 192.168.1.100:9090;
}

    • 最少链接:哪个服务器链接数最少请求到哪个;

upstream tomcat_server 
{

       least_conn;
       server 192.168.1.100:8080;
       server 192.168.1.100:9090;
}

    • weight权重:weight值越大,请求根据服务器权重分配;

upstream tomcat_server 
{
       server 192.168.1.100:8080 weight=2;
       server 192.168.1.100:9090 weight=1;
}

    • ip_hash:根据请求的用户IP计算hash值,根据hash选择对应的服务器,这样可以保证同一用户请求到同一服务器;

upstream tomcat_server 
{

       ip_hash;
       server 192.168.1.100:8080;
       server 192.168.1.100:9090;
}

    • url_hash:基本与ip_hash一致,但url_hash能够提高后端缓存服务器的效率,如提高squid的效率,但是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回给用户一个503错误;所以session问题还得使用如memcached来实现session共享(或客户端cookie机制?)。

upstream tomcat_server 
{

       hash $request_url;
       server 192.168.1.100:8080;
       server 192.168.1.100:9090;
}

    • fair:哪个服务器的响应时间短,就选择谁;

upstream tomcat_server 
{

       server 192.168.1.100:8080;
       server 192.168.1.100:9090;

       fair;
}

 

 

  • Nginx实现地址映射,可将某些资源如下载文件不需直接放在服务器下,如配置:

location ~ ^/images/(.*)
{
  expires 1s;
  alias E:/test/images/$1; #“$1”表是location后面()的内容
  index index.html index.htm;
  break;
}

  • 基本配置(以Linux下为例)

user root; #运行用户
worker_processes 1; #启动进程,通常设置成和cpu的数量相等

#全局错误日志及每个进程PID文件
error_log /usr/local/nginx/logs/error.log;
error_log /usr/local/nginx/logs/error.log notice;
error_log /usr/local/nginx/logs/error.log info;
pid /usr/local/nginx/logs/nginx.pid;

# 工作模式及连接数上线
events
{
  use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
  worker_connections 1024; #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
  include mime.types;
  default_type application/octet-stream;

  #设定请求缓冲
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32K;
  large_client_header_buffers 4 32k;
  # client_max_body_size 8m;

  #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
  #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  #连接超时时间
  keepalive_timeout 65;

  #开启gzip压缩,降低传输流量
  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  #添加tomcat列表,真实应用服务器都放在这
  upstream tomcat_pool
  {
    #server tomcat地址:端口号 weight表示权值,权值越大,被分配的几率越大;
    server 192.168.0.223:8080 weight=4 max_fails=2 fail_timeout=30s;
    server 192.168.0.224:8080 weight=4 max_fails=2 fail_timeout=30s;
  }

  server
  {
    listen 80; #监听端口
    server_name localhost;

    #默认请求设置
    location /
    {
      proxy_pass http://tomcat_pool; #转向tomcat处理
    }

    #所有的jsp页面均由tomcat处理
    location ~ \.(jsp|jspx|dp)?$
    {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass http://tomcat_pool; #转向tomcat处理
    }

    #所有的静态文件直接读取不经过tomcat,nginx自己处理
    location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
    {
      expires 30d;
    }
    location ~ .*\.(js|css)?$
    {
      expires 1h;
    }

    #定义错误提示页面
    error_page 500 502 503 504 /50x.html;
    location = /50x.html
    {
      root html;
    }
  }

 

#HTTPS server
#server {
# listen 443 ssl;
# server_name localhost;

 

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

 

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

 

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

 

# location / {
# root html;
# index index.html index.htm;
# }
#}

 

 

}

 

posted @ 2018-08-27 08:43  岩文01  阅读(226)  评论(0编辑  收藏  举报