基础-NGINX学习笔记

Nginx概述

Nginx (engine x) 是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器软件,也是一个IMAP/POP3/SMTP服务器软件。也就是说Nginx本身就可以托管网站(类似于Tomcat一样),进行Http服务处理,也可以作为反向代理服务器使用。

Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。

Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

Nginx 解决了服务器的C10K(就是在一秒之内连接客户端的数目为10k即1万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制,是一种异步事件驱动结构。

Nginx特点

  1. 跨平台:Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。
  2. 配置异常简单:非常的简单,易上手。
  3. 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。
  4. Nginx代理和后端Web服务器间无需长连接;
  5. Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。
  6. 发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。
  7. 网络依赖性低,理论上只要能够ping通就可以实施负载均衡,而且可以有效区分内网、外网流量。
  8. 支持内置服务器检测。Nginx能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上。
  9. 采用Master/worker多进程工作模式
  10. 此外还有内存消耗小、成本低廉(比F5硬件负载均衡器廉价太多)、节省带宽、稳定性高等特点。

Nginx安装

CentOS系列发行版,在epel源中提供了Nginx的RPM软件包,所以在YUM仓库中添加对应版本中的epel源就可以使用YUM安装了。

阿里云直接提供了epel源的repo简单配置文件,我们直接下载下来使用就行了:

(详情查看:http://mirrors.aliyun.com/help/epel)

下载新repo 到/etc/yum.repos.d/

epel(RHEL 7)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
epel(RHEL 6)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
epel(RHEL 5)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.repo
yum clean all //刷新YUM缓存
yum install nginx //YUM安装Nginx

Nginx配置

Nginx配置文件的组成部分:

主配置文件:nginx.conf

子配置文件:include conf.d/*.conf

主配置文件的配置指令:

directive value [value2 ...]; //属性 属性值...

注意:

(1) 指令必须以分号结尾;

(2) 支持使用配置变量;

1、内建变量:由Nginx模块引入,可直接引用;

2、自定义变量:由用户使用set命令定义;

set variable_name value;  //自定义变量

引用变量:

$variable_name //引用变量

主配置文件结构:

main block:主配置段,也即全局配置段;

event {
...
    }:事件驱动相关的配置;
http {
    ...
}:http/https 协议相关的配置段;
mail {
    ...
}:邮箱服务器相关的配置段
stream {
    ...
}:TCP/UDP代相关的配置段

http协议相关的配置结构

http {
    ...
    ...:各server的公共配置
    server {
        ...
    }:每个server用于定义一个虚拟主机;
    server {
        ...
        listen 
        server_name
        root
        alias
        location [OPERATOR] URL {
            ...
            if CONDITION {
...
            }
        }
    }
}

正常运行必备的配置

1、user

Syntax:user user [group];

定义worker进程使用的用户和用户组,默认为nobody,如果只定义用户,那么用户组将会使用和用户同名的组。

2、pid /PATH/TO/PID_FILE;

指定存储nginx主进程进程号码的文件路径;

3、include file | mask;

指明包含进来的其它配置文件片断;

4、load_module file;

指明要装载的动态模块;

性能优化相关的配置

1、worker_processes number | auto;

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

auto:当前主机物理CPU核心数;

2、worker_cpu_affinity cpumask ...;

worker_cpu_affinity auto [cpumask];

nginx进程的CPU亲缘性;

CPU MASK:
00000000:
0000 0001:0号CPU
0000 0010:1号CPU
0000 0100:2号CPU
... ...

0000 0011:表示0和1号CPU;
3、worker_priority number;

指定worker进程的nice值,设定worker进程优先级;优先级范围[-20,20]

4、worker_rlimit_nofile number;

worker进程所能够打开的文件数量上限;

调试、定位问题:

1、daemon on|off;

是否以守护进程方式运行Nignx;

2、master_process on|off;

是否以master/worker模型运行nginx;默认为on;

3、error_log file [level];

错误日志等级

事件驱动相关的配置

events {
...
}

1、worker_connections number;

每个worker进程所能够打开的最大并发连接数数量;

worker_processes * worker_connections=总的最大并发连接数量。

2、use method;

指明并发连接请求的处理方法;use epoll;

3、accept_mutex on | off;

处理新的连接请求的方法
;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;

http协议的相关配置

http {
... ...
server {
...
server_name
root
location [OPERATOR] /uri/ {
...
}
}
server {
...
}
}

套接字相关的配置

1、server { ... } //配置一个虚拟主机;

server {
    listen address[:PORT]\|PORT;
    server_name SERVER_NAME;
    root /PATH/TO/DOCUMENT_ROOT;
    }

2、listen

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:发送缓冲区大小;

3、server_name name ...;

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;

支持*通配任意长度的任意字符;server_name *.magedu.com www.magedu.*

支持~起始的字符做正则表达式模式匹配;
server_name ~^www\d
+\.magedu\.com$
匹配优先级机制:
(1) 首先是字符串精确匹配;
(2) 左侧*通配符;
(3) 右侧*通配符;
(4) 正则表达式;

4、tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项;

tcp_nopush on|off;
在sendfile模式下,是否启用TCP_CORK选项;

5、sendfile on | off;

是否启用sendfile功能;

路径相关的配置

6、root path;

设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location;

7、location [ = | ~ | ~ * | ^~ ] uri { ... }
Sets configuration depending on a request URI.
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
例如, http://www.magedu.com/http://www.magedu.com/index.html

location  =  / {
...
}
=:对URI做精确匹配;
~:对URI做正则表达式模式匹配,区分字符大小写;
~ \*:对URI做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
不带符号:以URI为前缀的所有uri;

匹配优先级:=, ^~, ~/~ \*,不带符号;

root /vhosts/www/htdocs/
http://www.magedu.com/index.html --> /vhosts/www/htdocs/index.html

server {
root  /vhosts/www/htdocs/

location /admin/ {
root /webapps/app1/data/
}
}

8、alias path;
定义路径别名,文档映射的另一种机制;仅能用于location上下文;

注意:location中使用root指令和alias指令的意义不同;

(a) root,给定的路径对应于location中的/uri/左侧的/;

(b) alias,给定的路径对应于location中的/uri/右侧的/;

9、index file ...;

默认资源;http, server, location;

10、error_page code ... [=[response]] uri;
Defines the URI that will be shown for the specified errors.

error_page 404 /404.html;
location = /404.html {
root "/www/error_pages";
}

11、try_files file ... uri;

定义客户端请求的相关配置

12、keepalive_timeout timeout [header_timeout];

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

13、keepalive_requests number;

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

14、keepalive_disable none | browser ...;

对哪种浏览器禁用长连接;

15、send_timeout time;

向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;

16、client_body_buffer_size size;

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

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

设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;

使用16进制的数字;
client_body_temp_path   /var/tmp/client_body  1 2 2
1:表示用一位16进制数字表示一级子目录;0-f
2:表示用2位16进程数字表示二级子目录:00-ff
2:表示用2位16进程数字表示三级子目录:00-ff

限制客户端的相关配置

18、limit_rate rate;

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

19、limit_except method ... { ... }

限制对指定的请求方法之外的其它方法的使用客户端;

limit_except GET {
allow 192.168.1.0/24;
deny  all;
}

文件操作优化的配置

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

是否启用aio功能;

21、directio size | off;

在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;

22、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指令所指定的次数的缓存项即为非活动项;

23、open_file_cache_valid time;

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

24、open_file_cache_min_uses number;

在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;

25、open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息;

推荐阅读更多精彩内容

  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 9,318评论 5 124
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,261评论 0 3
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,540评论 0 9
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 526评论 0 4
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 30,975评论 24 998
  • 上学期有朋友问过我一个问题:如果有一天曾经拒绝过你的那个男生回来找你了,告诉你他当初拒绝你是想等自己有所成...
    沐汐花影阅读 1,156评论 0 2