认识Nginx
Nginx是由俄罗斯人Igor Sysoev开发的一款开源的,轻量级的Web服务器。Ngnix以其功能丰富著称于世。它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器能够快速的响应静态页面(HTML)的请求;支持FastCGO、SSL、Virtual Host、URL、Rewrite、HTTP Basic Auth、Gzip等大量功能;并且支持更多的第三方功能模块的扩展。
Nginx的特点
1、跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。
2、配置异常简单,非常容易上手。配置风格跟程序开发一样,神一般的配置
3、非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)
4、事件驱动:通信机制采用epoll模型,支持更大的并发连接。
5、master/worker结构:一个master进程,生成一个或多个worker进程
6、内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)
7、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
8、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
9、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
10、稳定性高:用于反向代理,宕机的概率微乎其微
Nginx的特性
基本功能:
静态资源的web服务器,能缓存打开的文件描述符;
反向代理服务器,缓存、负载均衡;
支持FastCGI
模块化,非DSO机制,过滤器gzip,SSI和图像大小调整等
支持SSL
扩展功能:
基于名称和IP做虚拟主机
支持keepalive
支持平滑配置更新或程序版本升级
定制访问日志,支持使用日志缓存以提高性能
支持url rewrite
支持路径别名
支持基于IP及用户的认证;
支持速率限制,并发限制等;
nginx的基本架构:
一个master, 生成一个或多个worker
事件驱动:kqueue, epoll, /dev/poll
消息通知:select, poll, rt signals
支持sendfile, sendfile64
文件AIO
支持mmap
nginx: 非阻塞、事件驱动、一个master多个worker,一个worker响应多个用户请求
Nginx的模块类别
核心模块
标准http模块
可选的http模块
邮件模块
第三方扩展模块
Nginx的安装方法
1、编译安装
2、rpm包安装:
epel源
Nginx的配置文件
main配置段
http {
}
配置参数需要以分号结尾,语法格式:
参数名 值1 [值2 …];
还支持使用变量:
模块内置变量
用户自定义变量
set var_name value
Nginx的配置
Nginx基本核心配置的类别:
用于调试、定位问题
正常运行的必备配置
优化性能的配置
事件类的配置
正常运行的必备配置:
1、user username [groupname];
指定运行worker进程的用户和组
2、pid /path/to/pidfile_name;
指定nginx的pid文件
3、worker_rlimit_nofile #;
指定一个worker进程所能够打开的最大文件句柄数;
4、worker_rlimit_sigpending #;
设定每个用户能够发往worker进程的信号的数量;
优化性能相关的配置:
1、worker_processes #;
worker进程的个数;通常其数值应该为CPU的物理核心数减1;
2、worker_cpu_affinity cpumask …;
0000
0001
0010
0100
1000
worker_processes 6;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;
3、ssl_engine device;
在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;
4、timer_resolution t;
每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution用于定义每隔多久才会由gettimeofday()更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置;
5、worker_priority nice;
-20,19之间的值;
事件相关的配置:
1、accept_mutex [on|off]
是否打开Ningx的负载均衡锁;此锁能够让多个worker进轮流地、序列化地与新的客户端建立连接;而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker;
2、lock_file /path/to/lock_file;
lock文件
3、accept_mutex_delay #ms;
accept锁模式中,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少要等待#ms才能再一次请求锁;
4、multi_accept on|off;
是否允许一次性地响应多个用户请求;默认为Off;
5、use [epoll|rtsig|select|poll];
定义使用的事件模型,建议让nginx自动选择;
6、worker_connections #;
每个worker能够并发响应最大请求数;
用于调试、定位问题: 只调试nginx时使用:
1、daemon on|off;
是否让ningx运行后台;默认为on,调试时可以设置为off,使得所有信息去接输出控制台;
2、master_process on|off
是否以master/worker模式运行nginx;默认为on;调试时可设置off以方便追踪;
3、error_log /path/to/error_log level;
错误日志文件及其级别;默认为error级别;调试时可以使用debug级别,但要求在编译时必须使用–with-debug启用debug功能;
Nginx的web功能
虚拟主机相关的配置:
1、server {}
定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;
2、listen
listen address[:port];
listen port
default_server:定义此server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,那么第一个server即为默认server;
rcvbuf=SIZE: 接收缓冲大小;
sndbuf=SIZE: 发送缓冲大小;
ssl: https server;
3、server_name […];
server_name可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头);当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较;比较方式:
(1) 先做精确匹配;www.magedu.com
(2) 左侧通配符匹配;*.magedu.com
(3) 右侧通配符匹配;www.abc.com, www.*
(4) 正则表达式匹配: ~^.*\.magedu\.com$
4、server_name_hash_bucket_size 32|64|128;
为了实现快速主机查找,nginx使用hash表来保存主机名;
5、location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理;比如:http://www.magedu.com/images/logo.gif
=:精确匹配;
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,匹配时忽略字符大小写
^~: URI前半部分匹配,不检查正则表达式
http://www.magedu.com/index.html
http://www.magedu.com/
http://www.magedu.com/documents/index.html
http://www.magedu.com/images/index.html
http://www.magedu.com/images/a.png
匹配优先级:
字符字面量最精确匹配、正则表达式检索(由第一个匹配到所处理)、按字符字面量
文件路径定义:
1、root path
设置web资源路径;用于指定请求的根文档目录;
location / {
root /www/htdocs;
}
location ^~ /images/ {
root /web;
}
root: root/URI/
http://www.magedu.com/images/b.html
2、alias path
只能用于location中,用于路径别名;
location / {
root /www/htdocs;
}
location ^~ /images/ {
alias /web;
}
alias: alias/
http://www.magedu.com/images/b.html
3、index file …;
定义默认页面,可参跟多个值;
4、error_page code … [=[response]] uri;
当对于某个请求返回错误时,如果匹配上了error_page指令中设定的code,则重定向到新的URI中。
错误页面重定向;
5、try_files path1 [path2 …] uri;
自左至右尝试读取由path所指定路径,在第一次找到即停止并返回;如果所有path均不存在,则返回最后一个uri;
location ~* ^/documents/(.*)$ {
root /www/htdocs;
try_files $uri /docu/$1 /temp.html;
}
http://www.magedu.com/documents/a.html
http://www.magedu.com/docu/a.html
http://www.magedu.com/temp.html
网络连接相关的设置:
1、keepalive_timeout time;
保持连接的超时时长;默认为75秒;
2、keepalive_requests n;
在一次长连接上允许承载的最大请求数;
3、keepalive_disable [msie6 | safari | none ]
对指定的浏览器禁止使用长连接;
4、tcp_nodelay on|off
对keepalive连接是否使用TCP_NODELAY选项;
5、client_header_timeout time;
读取http请求首部的超时时长;
6、client_body_timeout time;
读取http请求包体的超时时长;
7、send_timeout time;
发送响应的超时时长;
对客户端请求的限制:
1、limit_except method … { … }
指定对范围之外的其它方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
2、client_max_body_size SIZE;
http请求包体的最大值;常用于限定客户所能够请求的最大包体;根据请求首部中的Content-Length来检测,以避免无用的传输;
3、limit_rate speed;
限制客户端每秒钟传输的字节数;默认为0,表示没有限制;
4、limit_rate_after time;
nginx向客户发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速;
文件操作的优化:
1、sendfile on|off
是否启用sendfile功能;
2、aio on|off
是否启用aio功能;
3、open_file_cache max=N [inactive=time]|off
是否打开文件缓存功能;
max: 缓存条目的最大值;当满了以后将根据LRU算法进行置换;
inactive: 某缓存条目在指定时长时没有被访问过时,将自动被删除;默认为60s;
缓存的信息包括:
文件句柄、文件大小和上次修改时间;
已经打开的目录结构;
没有找到或没有访问权限的信息;
4、open_file_cache_errors on|off
是否缓存文件找不到或没有权限访问等相关信息;
5、open_file_cache_valid time;
多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s;
6、open_file_cache_min_use #;
在inactive指定的时长内被访问超此处指定的次数地,才不会被删除;
对客户端请求的特殊处理:
1、ignore_invalid_headers on|off
是否忽略不合法的http首部;默认为on; off意味着请求首部中出现不合规的首部将拒绝响应;只能用于server和http;
2、log_not_found on|off
是否将文件找不到的信息也记录进错误日志中;
3、resolver address;
指定nginx使用的dns服务器地址;
4、resover_timeout time;
指定DNS解析超时时长,默认为30s;
5、server_tokens on|off;
是否在错误页面中显示nginx的版本号;
内存及磁盘资源分配:
1、client_body_in_file_only on|clean|off
HTTP的包体是否存储在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件;on表示请求结束后包体文件不会被删除,clean表示会被删除;
2、client_body_in_single_buffer on|off;
HTTP的包体是否存储在内存buffer当中;默认为off;
3、cleint_body_buffer_size size;
nginx接收HTTP包体的内存缓冲区大小;
4、client_body_temp_path dir-path [level1 [level2 [level3]]];
HTTP包体存放的临时目录;
client_body_temp_path /var/tmp/client/ 1 2
5、client_header_buffer_size size;
正常情况下接收用户请求的http报文header部分时分配的buffer大小;默认为1k;
6、large_client_header_buffers number size;
存储超大Http请求首部的内存buffer大小及个数;
7、connection_pool_size size;
nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256;
8、request_pool_size size;
nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k;
http核心模块的内置变量:
$uri: 当前请求的uri,不带参数;
$request_uri: 请求的uri,带完整参数;
$host: http请求报文中host首部;如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替;
$hostname: nginx服务运行在的主机的主机名;
$remote_addr: 客户端IP
$remote_port: 客户端Port
$remote_user: 使用用户认证时客户端用户输入的用户名;
$request_filename: 用户请求中的URI经过本地root或alias转换后映射的本地的文件路径;
$request_method: 请求方法
$server_addr: 服务器地址
$server_name: 服务器名称
$server_port: 服务器端口
$server_protocol: 服务器向客户端发送响应时的协议,如http/1.1, http/1.0
$scheme: 在请求中使用scheme, 如https://www.magedu.com/中的https;
$http_HEADER: 匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
$sent_http_HEADER: 匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中的content-type首部;
$document_root:当前请求映射到的root配置;
Nginx的安装方法:
1、 本次实验通过配置yum仓库进行安装,首先开始配置yum仓库的源;
# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=centos-nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
2、 第二步开始进行安装;
# yum install nginx
选Y进行安装;
3、 接下来启动Nginx即可进行访问;
# service nginx start
4、 在浏览器访问,测试是否能够访问
出现此种访问不了web默认页的情况,一般是由于防火墙没做规则导致的,此处,我们可以尝试关闭防火墙;
# service iptables stop
5、 查看Nginx的主配置文件;
# vi /etc/nginx/nginx.conf
可在此处定义上文中的各种参数,进行Nginx的调优;