NGINX02

nginx

Nginx介绍

  • Nginx:engine X ,2002年,开源,商业版
  • NGINX是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器
  • 解决C10K问题(10K Connections)
  • 官网:http://nginx.org
  • 二次开发版:Tengine OpenResty(章亦春)

特性:

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

基本功能:

  • 静态资源的web服务器
  • http协议反向代理服务器
  • pop3/imap4协议反向代理服务器
  • FastCGI(LNMP),uWSGI(python)等协议
  • 模块化(非DSO),如zip,SSL模块

web服务相关的功能:

虚拟主机(server)
支持 keep-alive 和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口

Nginx架构

Nginx架构

nginx的程序架构

nginx的程序架构:

master/worker结构
  • 一个master进程:
    • 负载加载和分析配置文件、管理worker进程、平滑升级
  • 一个或多个worker进程
    • 处理并响应用户请求
  • 缓存相关的进程:
    • cache loader:载入缓存对象
    • cache manager:管理缓存对象

nginx模块

  • nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载

  • 模块分类:

    • 核心模块:core module

    • 标准模块:

      • HTTP 模块:ngx_http_*
        • HTTP Core modules 默认功能
        • HTTP Optional modules 需编译时指定
      • Mail 模块 ngx_mail_*
      • Stream 模块 ngx_stream_*
    • 第三方模块

nginx目录结构和命令

ls /usr/local/nginx/ html是测试页,sbin是主程序
s /usr/local/nginx/sbin/ nginx 只有一个程序文件
ls /usr/local/nginx/html/ 50x.html index.html 测试网页

  • Nginx:默认为启动nginx

    • -h 查看帮助选项
    • -V 查看版本和配置选项
    • -t 测试nginx语法错误
    • -c filename 指定配置文件(default: /etc/nginx/nginx.conf)
    • -s signal 发送信号给master进程,signal:stop, quit, reopen, reload
      示例: nginx -s stop 停止nginx nginx -s reload 加载配置文件 -g directives 在命令行中指明全局指令

nginx配置

  • 配置文件的组成部分:
    • 主配置文件:nginx.conf
    • 子配置文件 include conf.d/*.conf
    • fastcgi, uwsgi,scgi等协议相关的配置文件
    • mime.types:支持的mime类型
  • 主配置文件的配置指令:
    • directive value [value2 …];
  • 注意:
    • (1) 指令必须以分号结尾
    • (2) 支持使用配置变量
      • 内建变量:由Nginx模块引入,可直接引用
      • 自定义变量:由用户使用set命令定义 set variable_name value;
      • 引用变量:$variable_name

主配置文件结构:四部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
main block:主配置段,即全局配置段,对http,mail都有效

event {
...
} 事件驱动相关的配置

http {
...
} http/https 协议相关配置段

mail {
...
} mail 协议相关配置段

stream {
...
} stream 服务器相关配置段

http协议相关的配置结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
...
... 各server的公共配置
server { 每个server用于定义一个虚拟主机
...
}
server {
...
server_name 虚拟主机名
root 主目录
alias 路径别名
location [OPERATOR] URL { 指定URL的特性
...
if CONDITION {
...
}
}

帮助文档 http://nginx.org/en/docs/

模块加载配置文件:/usr/share/nginx/modules/*.conf

指明要装载的动态模块路径: /usr/lib64/nginx/modules

性能优化相关的配置

1、worker_processes number | auto

  • worker进程的数量;通常应该为当前主机的cpu的物理核心数

2、worker_cpu_affinity cpumask …

  • worker_cpu_affinity auto [cpumask] 提高缓存命中率
    • CPU MASK: 00000001:0号CPU
    • 00000010:1号CPU
    • 10000000:8号CPU
  • worker_cpu_affinity 0001 0010 0100 1000;
  • worker_cpu_affinity 0101 1010;

3、worker_priority number

  • 指定worker进程的nice值,设定worker进程优先级:[-20,20]

4、worker_rlimit_nofile number

  • worker进程所能够打开的文件数量上限,如65535

事件驱动相关的配置

  • worker_connections number

每个worker进程所能够打开的最大并发连接数数量,如10240
总最大并发数:worker_processes * worker_connections

  • use method

指明并发连接请求的处理方法,默认自动选择最优方法 use epoll;

  • accept_mutex on | off 互斥

处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请
求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊
群”,影响性能

调试和定位选项

  • daemon on|off 是否以守护进程方式运行nignx,默认是守护进程方式
  • master_process on|off是否以master/worker模型运行nginx;默认为on off 将不启动worker
  • error_log file [level] 错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了“–with-debug”选项时才/有效
  • level:debug|info|notice|warn|error|crit|alter|emerg

ngx_http_core_module

1、server { … }

配置一个虚拟主机

1
2
3
4
5
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}

2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

  • default_server 设定为默认虚拟主机
  • ssl 限制仅能够通过ssl连接提供服务
  • backlog=number 超过并发连接数后,新请求进入后援队列的长度
  • rcvbuf=size 接收缓冲区大小
  • sndbuf=size 发送缓冲区大小

注意:
(1) 基于port;listen PORT; 指令监听在不同的端口
(2) 基于ip的虚拟主机 listen IP:PORT; IP 地址不同
(3) 基于hostname server_name fqdn; 指令指向不同的主机名

3、server_name name …;

虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持通配任意长度的任意字符 server_name *.magedu.com www.magedu.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用server_name ~^www\d+\.magedu\.com$
说明: \d 表示 [0-9]
匹配优先级机制从高到低:
(1) 首先是字符串精确匹配 如:www.magedu.com
(2) 左侧通配符 如:.magedu.com
(3) 右侧通配符 如:www.magedu.
(4) 正则表达式 如: ~^.*.magedu.com$
(5) default_server

4、tcp_nodelay on | off;

在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http, server, location

5、sendfile on | off;

是否启用sendfile功能,在内核中封装报文直接发送,默认Off

6、server_tokens on | off | build | string

是否在响应报文的Server首部显示nginx版本 ngx_http_core_modu

7、root

设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server, location, if in location

1
2
3
4
server {
...
root /data/www/vhost1;
}

8、location [ = | ~ | ~* | ^~ ] uri { … }

location @name { … }

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路
径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最
佳匹配,而后应用其配置

示例:

1
2
3
4
5
6
server {...
server_name www.magedu.com;
location /images/ {
root /data/imgs/;
}
}

^~: 对URI的最左边部分做匹配检查,不区分字符大小写
~: 对URI做正则表达式模式匹配,区分字符大小写
~*: 对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有的uri
匹配优先级从高到低:=, ^~, ~/~*, 不带符号

9、alias path;

路径别名,文档映射的另一种机制;仅能用于location上下文

示例:
http://www.magedu.com/bbs/index.php

1
2
3
4
5
6
location /bbs/ {
alias /web/forum/;
} --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html

注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/

10、index file …;

指定默认网页文件,注意:ngx_http_index_module模块

11、error_page code … [=[response]] uri;

模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http, server, location, if in location
error_page 404 /404.html
error_page 404 =200 /404.html

12、try_files file … uri;

try_files file … =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误

1
2
3
4
5
6
location /images/ { 
try_files $uri /images/default.gif;
}
location / {
try_files $uri $uri/index.html $uri.html =404;
}

13、keepalive_timeout timeout [header_timeout];

设定保持连接超时时长,0表示禁止长连接,默认为75s

14、keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认为100

15、keepalive_disable none | browser …

对哪种浏览器禁用长连接

16、send_timeout time;

向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长

17、client_body_buffer_size size;

用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置

18、client_body_temp_path path [level1 [level2 [level3]]];

设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff

19、limit_rate rate;

限制响应给客户端的传输速率,单位是bytes/second,默认值0表示无限制

20、limit_except method … { … },仅用于location

限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH

1
2
3
4
limit_except GET {
allow 192.168.1.0/24;
deny all;
}

除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用

21、aio on | off | threads[=pool];

是否启用aio功能

22、directio size | off;

当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存

23、open_file_cache off;

open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2) 打开的目录结构
(3) 没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现管理,inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除

24、open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息,默认值为off

25、open_file_cache_min_uses number;

open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1

26、open_file_cache_valid time;

缓存项有效性的检查频率,默认值为60s

-------------本文结束感谢您的阅读-------------