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