UDN-企业互联网技术人气社区

板块导航

浏览  : 2034
回复  : 0

[运维] Nginx工作原理及模块详解一

[复制链接]
cat77的头像 楼主
发表于 2016-9-10 10:27:19 | 显示全部楼层 |阅读模式
  Nginx简介

  解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现状,2006年由俄罗斯lgor sysoev编写,全称为engine X, 缩写为nginx,官方站点为http://nginx.org,2013年发出企业版本Nginx Plus. 二次发行版本:Tengine, OpenResy….

  Nginx特性

  1 模块化设计,较好的扩展性,早期不支持模块的动态装卸载

  2 高可靠性,基于master/worker模式

  master:负责启动服务,分析配置文件,负责启动子进程和worker进程

  worker: 真正响应用户请求进程

  3 支持热部署(平滑迁移):不停机更新配置文件,更换日志文件,更新服务器程序版本

  4 内存消耗低: 10K个keep-alive连接模式下的非活动连接仅消耗2.5M内存

  5 支持event-driven事件驱动模型,aio驱动机制,mmap内存映射机制

  Nginx基本功能

  1 静态资源的web服务器,自身只能简单的接收和响应http

  2 http协议的反向代理服务器

  3 pop3,smtp imap4等邮件协议的反向代理

  4 能缓存打开的文件(元数据缓存:文件的描述符等信息),能加快文件的打开速度

  5 支持FastCGI(php-fpm),UWSGI(python web framwork框架)等协议机制,实现代理后端应用程序交互

  6 模块化(非DSO机制)
1.png

  7 支持过滤器,例如ZIP,SSI(服务端包含)

  8 支持SSL加密机制

  web服务相关的功能

  虚拟主机(server)

  keepalive

  支持访问日志

  支持基于日志进行缓冲,以提高日志的存取性能

  url rewrite

  路径别名

  基于IP及用户的访问控制

  支持速率限制(每客户端连接速度)

  支持并发数限制(每客户端的并发连接)

  Nginx的基本架构:master/worker

  master/worker模型:

  一个master进程可以生成一个或多个worker进程,每个worker基于事件驱动,linux(epoll),freeBSD(kqueue),solaris(/dev/poll)响应用户请求, 其支持sendfile,sendfile64,这两种支持的文件大小不同

  master负责内容:

  加载配置文件

  管理worker进程

  平滑升级

  worker负责内容

  响应客户端请求

  提供http服务

  提供http代理

  提供fastcgi代理

  nginx工作原理图
2.png

  Nginx编译安装配置

  环境准备

  yum install -y “Development Tools”

  yum install -y “Server platform development”

  yum install -y pcre-devel openssl-devel zlib-devel

  useradd -r nginx

  检查Linux系统上epoll机制是否存在

  Nginx的编译及安装
  1. ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx  --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug

  2. make && make install
复制代码

  Nginx的配置文件

  • /etc/nginx/nginx.conf : 主配置文件
  • Include conf.d/*.conf
  • /etc/nginx/mime.types : 所支持的MIME类型列表
  • /etc/nginx/fastcgi_params : fastcgi的配置文件
  • /etc/nginx/fastcgi.conf : 与fastcgi_params一般只使用一个
  • /etc/nginx/uwsgi_params : 与uwsgi框架的配置文件
  • /etc/nginx/scgi_params : cgi的配置文件
  • /etc/nginx/proxy.conf : 代理的配置
  • /etc/nginx/sites.conf : 配置虚拟主机的

  /etc/nginx/nginx.conf配置文件的一般格式:

  1 全局指令 : 放置于main block中,即文档根

  2 模块指令 : 由模块引用,其它必须放置于directive中

  3 Directive Value1 [Value2,….]

  4 支持使用变量:

  set variable value;

  内置变量: 由模块引入

  自定义变量(较新版本支持)

  引用 变量: $variable

  5 每条指令都以;号结束,否则就是语法错误

  6 主配置文件组织结构
  1. main block : 不能放在花括号中,正常运行必备的配置,优化性能相关的配置,用于调度,定位问题的配置.

  2.   event {
  3.       ...
  4.   }      

  5.   #事件驱动模块段,面向用户并发连接请求响应组织配置机制

  6.   http {
  7.       ...
  8.   }

  9.   #web模块相关配置

  10.   mail {
  11.       ...
  12.   }

  13.   #邮件模块相关配置, 编译时候默认无此模块
复制代码

  7 Nginx HTTP configuration示意图:
3.png

  主配置文件框架解析

  Main配置段常用参数

  (1) 正常运行必备的配置指令

  指定每个用户能够发往worker进程的信号的最大数量

  指定每个worker进程能打开的最大文件描述符数量(nofile: number of file)

  指定nginx进程的PID文件路径, 默认为:pid /var/runl/nginx/nginx.pid

  指定用于运行worker进程的用户和组,默认是nginx用户,nginx组

  uesr USERNAME [GROUPNAME];

  pid /path/to/pid_file;

  worker_rlimit_nofile #;

  worker_rlimit_sigpending #;

  (2) 性能优化相关的配置

  [-20,19],worker进程的优先级, 默认为0

  将worker进程与指定的CPU进行绑定,这种绑定不能隔离CPU,CPU还可能会响应其它进程请求.
  1. 示例:
  2.   worker_cpu_affinity 00000001 00000010 00000100;
复制代码

  worker进程的个数,通常应该为物理CPU核心数量减1或者减2,worker_processes auto;可以根据物理CPU自动设定. worker不使用进程或线程处理请求, 而是直接将worker绑定到CPU上, 这样就没有进程切换的说法了.

  woker_processes #;

  worker_cpu_affinity CPUMASK CPUMASK...;

  worker_priority NICE;

  (3)调试定位问题的配置

  错误日志文件及级别, 出于调试的需要,可以设定为debug,但在debug级别在编译时使用—with-debug选项时才有效

  是否以master/worker模型运行nginx,off后,只单个进程启动Nignx.

  是否以守护进程方式启动nginx

  daemon [off|on];

  master_process [on | off];

  error_log /path/to/error_log Level;

  event配置段常用参数

  worker_connections #;

  每个worker进程所能够响应的最大并发请求数量, 请求的最大上限为:worker_processes * worker_connections

  use [epoll | rgsig | select | poll]]

  定义使用的事件模型, 建议让nginx自动选择

  accept_mutex [on | off];

  定义内部调用请求至worker时请求的互斥锁文件(各worker接收用户的请求的负载均衡锁),on:能够让多个worker轮流地,序列化的响应新请求

  lockfile /path/to/lockfile

  锁文件定义位置

  http配置段常用参数

  server {}

  定义一个虚拟主机,server可以出现一次或多次
  1. server {
  2.   listen [IP:]PORT;
  3.   server_name NAME;
  4.   root /path/to/documentroot;
  5. }
复制代码

  listen address [:port] [default_server] [[ssl] [http2 | spdy]]

  listen port [default_server] [ssl] [http2 | spdy]

  default_server:设置默认虚拟主机, 当用户使用IP地址访问时,就返回default_server的虚拟主机, 如果未定义default_server时,第一个虚拟主机将做为默认的主机

  ssl : 用于限制只能通过SSL连接提供服务,不是以端口确认其协议的, 故需要启用ssl,需要在监听的端口后面, 添加ssl选项

  spdy : spdy protocol(google研发的http协议,比http/1.1性能要好, 全称为speedy),在编译时编译了spdy模块的情况下,用于支持spdy协议

  http2 : http version2,在编译时需要开启http2协议支持

  server_name NAME [....]; : 指明主机名称

  (1) 先做精确匹配,例如:www.zhenping.me

  (2) 左侧通配符,例如:*.zhenping.me

  (3) 右侧通配符,例如:www.zhenping.*

  (4) 正则表达式匹配,例如:~^.*.zhenping.me$

  default_server
  1. nginx默认工作法则: 先将域的匹配规则,先做hash计算,把计算的结果放置进内存,下次访问请求过来时, 直接做对比
复制代码

  servername后可跟一个或多个主机名, 名称还可以使用通配符和正则表达式(~),域名匹配顺序

  tcp_nodelay [on | off];

  对keepalive模式下的连接是否使用tcp_nodelay选项,默认关闭.其功能为:把多个小报文合并为一个报文,一起发送. 此机制可以提高带宽利用率,将发往同一个主机很小的TCP报文合并成一个,实际生产对于用户请求即使浪费带宽也不能合并请求

  tcp_nopush [on | off];

  是否启用tcp_nopush(FreeBSD)或tcp_cork(linux)选项,仅在sendfile为on时有用, 其功能:尝试将多个报文首部压缩成一个发送, 默认为off,不启用该功能

  sendfile [on | off];

  是否启用sendfile功能,静态文件直接在内核中封装响应,而不是从内核空间到用户空间封装后,再发往内核空间.

  roo /PATH/TO/Directory;

  设置web资源的路径映射,用于指明请求的URL所对应的文件的目录路径,可用于server或location中.

  ```

  示例:

  1. server {
  2. ...
  3.   root /www/html;
  4. }
复制代码

   → /www/html/images/logo.jpg
  1. server {
  2.         ...
  3.         server_name www.zhenping.me;
  4.         location /images/ {
  5.             root /www/html;
  6.             ...
  7.         }
  8.     }

  9.     http://www.zhenping.me/images/logo.jpg --> /www/html/images/logo.jpg
  10. ```
复制代码

  location [ = | ~ | ~* | ^~ ] url { ...}

  location @name {...}

  = : URI的精确匹配

  ~ : 做正则表达式匹配,区分字符大小写

  ~* : 做正则表达式匹配,不区分字符大小写

  ^~ : URI的左半部分匹配,不区分字符大小写

  允许根据用户请求的URI来匹配定义的各location,匹配到时, 此请求将被相应的location块中的配置所处理, 简言之:用于为需要用到专用配置的uri提供特定配置.

  当匹配多次时,其匹配优先级为:精确匹配=,^~,~或~*,不带符号的URL, 如果优先级都一样, 就匹配最精确的规则
  1. location = / {
  2.   [configuration A]
  3. }

  4. location / {
  5.   [configuration B]
  6. }

  7. location /documents/ {
  8.   [configuration C]
  9. }

  10. location ^~ /images/ {
  11.   [configuration D]
  12. }

  13. location ~* \.(gif|jpg|jpeg)$ {
  14.   [configuration E]
  15. }
复制代码

  alias

  只能用于location配置段,用于定义路径别名
  1. location /imags/ {
  2.   root /data/imgs/;
  3. }

  4. location /imags/ {
  5.   alias /data/imgs/;
  6. }
  7. 注意: root指令:给定的路径对应location的"/",这个URI
  8.       /imags/test.jpg --> /data/imgs/imags/test.jpg
  9.     alias指令:路径为对应的location的"/url/"这个URI
  10.         /imags/test.jpg --> /data/imgs/test.jpg
复制代码

  index

  设置默认主页(nginx_http_index_module模块引入), 可以带上变量,如$geo根据不同IP地址来设置不同的语言主页,应用上下文为:http,server,location
  1. index index.html index.php;
  2. error_page code ...[=[response]] uri;
复制代码

  自定义错误页面,根据http状态码重写向错误页面

  示例:

  1) 指明错误页面
  1.       error_page 404 /404.html;
  2.       error_page 500 502 503 504 /50x.html;
  3.       location = /50x.html {
  4.           root html;
  5.       }
复制代码

  2) 根据指定的响应状态码进行响应
  1.       error_page 404 = 200 /404.html;
  2. try_files file... uri;
  3. try_files file... =code;
复制代码

  可用于server,location中, 以指定的顺序检查文件的存在性响应

  尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源,若1至N-1文件都不存在, 则跳转至最后一个uri(必须 不能匹配至当前location,而应该匹配至其它location,否则会导致死循环)

  示例:
  1.   server {
  2.       listen 80 default_server;
  3.       server_name www.zhenping.me;
  4.       root /data/imgs/;
  5.       index index.html;
  6.       location /images/ {
  7.           try_files index.html /images/test1.html /images/test2.html /images/test3.html;
  8.       }

  9.       location = /images/test3.html {
  10.           expires 10s;
  11.       }
复制代码

  面向客户端请求相关的配置
  1. keepalive_disable none | browser;
复制代码

  禁止那些浏览器使用keepalive功能,如: keepalive_disable msie6
  1. keepalive_timeout #s;
复制代码

  设定keepalive连接的超时时长,0表示禁止长连接,默认启用为75s
  1. keepalive_requests #;
复制代码

  在keepalive连接上所允许请求的最大资源数量,默认为100;
  1. send_timout #;
复制代码

  发送响应报文的超时时长,默认为60s;
  1. client_body_buffer_size SIZE(8k | 16k);
复制代码

  接收客户请求报文body的缓冲区大小, 默认为16k(64位系统,32位系统为8K),超出指定大小时将被移存于磁盘上.
  1. client_body_temp_path [Level1 [level2 [level3]]]
复制代码

  设定用于存储客户端请求body的临时存储路径及子目录结构和数量
  1. client_body_temp_path /var/tmp/client_body 2 2;
复制代码

  表示一级子目录用2字符表示,二级子目录下用2字符表示,每级目录都有256个文件夹. 其是采用16进制的表示文件,1个字符最多表示16,2字符表示256
对客户端请求进行限制
  1. limit_except METHOD {...};
复制代码

  对指定范围之外的其它方法进行访问控制,应用于location上下文
  1. limit_except GET {
  2.   allow 172.16.0.0/16;
  3.   deny all;
  4. }
  5. limit_rate SPEED;
复制代码

  限制客户端每秒种所能够传输的字节数, 默认为0,表示不限制,应用于http,server,location,if in location上下文中
  1. server {
  2.   ...
  3.   if ($slow) {
  4.       set $limit_rate 4k;
  5.   }
  6. }
复制代码

  limit_rate_after SIZE;

  超出SIZE的值, 就限制速度,应用于http,server,location,if in locataion上下文中
  1. location /flv/ {
  2.   flv;
  3.   limit_rate_after 500k;
  4.   limit_rate 50k;
  5. }
复制代码

  文件操作优化相关的配置

  aio on | off;

  是否启用异步IO模式, 应用于http, server,location上下文中

  directio size | off;

  是否启用直接IO操作, 不在内存中缓冲, 直接从硬盘加载使用(当大于指定的size),应用于http,server,location

  open_file_cache off | max=N [inactive=time];

  (1) 文件描述符

  (2) 文件大小

  (3) 最近一次的修改时间

  (4) 打开的目录的结构

  (5) 没有找到或者没有权限操作的文件的相关信息

  对打开的文件进行缓存 ,nginx可以缓存以下三种信息

  max=N : 可缓存的最大条目上限,一旦达到上限, 则会使用LRU算法从缓存中删除最近最少使用的缓存项

  inactive=time : 在此处指定的时长内没有被访问过的缓存项识别为非活动缓存项, 因此直接删除

  open_file_cache errors on|off;

  是否缓存找不到其路径的文件,或没有权限访问的文件相关信息

  open_file_cache_valid time;

  每隔多久检查一次缓存中缓存项的有效性,默认为60秒

  open_file_cache_min_uses number;

  缓存项在非活动其限内最少应该被访问的次数

  ngx_http_access_module模块的配置(基于IP的访问控制)

  allow address | CIDR | unix: | all; 允许

  deny address | CIDR | unix: | all; 拒绝

  应用上下文件:http,server,location,limit_except

  示例:
  1.   location / {
  2.       deny 192.168.1.1;
  3.       allow 192.16.1.0/24;
  4.       allow 10.1.1.0/16;
  5.       allow 2001:0db8::32;
  6.       deny all;
  7.   }
复制代码

原文作者: magedu-魏镇坪 来源:运维部落

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部