为什么使用Nginx;
性能比较好;
第三方模块扩展较多;(开源协议较为宽松)
高可靠性:主控进程和工作进程,一个工作进程出错主进程可以快速另开一个;
低内存消耗:一万个keep-alive连接在Nginx仅消耗2.5MB,支持较高的连接数;
支持热部署;不用停止服务就能版本更新,更新配置文件,更换日志文件,(源于master和worker分开设计)
基本功能:
支持静态的web服务器;能缓存打开的文件 描述符,
http smtp pop3协议的反向代理服务器,缓存,负载均衡;
支持FastCGI(fpm)
模块化,不能动态装卸在,支持过滤器压缩zip,支持ssi及图像大小调整;支持SSL
扩展功能;
支持基于名称和IP的虚拟主机
支持keepalive
支持平滑升级
可以定制访问日志,支持使用日志缓冲区提高日志存储性能;
支持url重写
支持路径别名
支持基于ip和用户的访问控制
支持速率限制,支持并发数限制
...
Nginx基本架构;
一个master进程生成一个或多个worker进程基于事件驱动机制响应工作;
消息通知:select,poll,rt,signals
支持sendfile,sendfile64
支持AIO
支持mmap
Nginx的工作模式:
非阻塞,事件驱动,一个master生成一个或多个worker,每个worker处理多个事件请求;
简单的编译安装Nginx:
./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 指定pid文件存放路径
--lock-path=/var/lock/nginx.lock 指定锁文件路径
--with-http_ssl_module 表明启用ssl模块
--with-http_stub_status_module 启用status模块
--with-http_gzip_static-module 启用gzip压缩
由于Nginx支持url重写,而url重写是要基于pcre的方式来使用正则表达式,
so要安装pcre_devel包,
编译好后启动nginx
/usr/local/nginx/sbin/nginx
结束nginx
killall nginx
nginx -h 查看帮助
nginx -t 测试配置文件
正常运行的必备配置:
1,指定运行worker进程的用户和组
2,pid 指定nginx的pid文件
3,worker_rlimit_nofile #
指定一个worker进程所能够打开的最大文件句柄;
4,worker_rlimit_sigpending #
指定每个用户能够发往worker的信号数量;
优化性能的配置:
1,worker_processes # :
worker 线程的个数,通常应该设定为物理CPU核心数减一
2,worker_cpu_affinity cpumask ...:
绑定worker进程至指定的CPU上:
3,timer_resolution t:解析度频繁数
4,worker_priority nice: -20,19 调整优先级
worker_priority -2
事件相关的配置:
1 accept_mutex [on|off] 内部调用用户请求各worker时用的负载均衡锁;
打开时表示能让多个worker轮流地,序列化的与响应新请求;
2 lock_file /path/to/lock_file:
3,accept_mutex_delay # ms:一个worker请求锁文件等待时长;
4,use [epoll | rgsig | select | poll];
定义使用的事件模型;建议让Nginx自动选择;
5,worker_connections #
每个worker进程响应的最大并发请求数;
用于调试定位问题的:
1,deamon [off|on]
表示是否以守护进程方式启动nginx:正常环境应该为on
2,master_process on|off:
是否以master/worker模型来启动nginx 默认为on
3,error_log /path/to/error_log level:
错误日志及级别:出于调试的目的可以使用debug,但此级别只有在编译nginx时使用了--with-debug才有效;
IO模型:
阻塞,非阻塞,IO复用,信号驱动IO(epoll),AIO(异步IO)
Nginx应用
1,定义虚拟主机:
一个server块就是一个server主机
server{
}
2,listen
监听的端口
listen address [:port] [default_server] [ssl]
backlog=number:指明TCP协议的backlog队列大小,默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
例子:
listen 172.16.100.8:80
3,server_name name1 [name2] [name3] ... 主机名;
(1) 先做精确匹配 www.magedu.com
(2) 左侧通配符匹配 *.magedu.com
(3) 右侧通配符匹配 www.*>
(4) 正则表达式匹配 ~^.*\.magedu.\.com$
(5) default_server中定义的默认配置
elinks -dump 表示直接请求网页之后退出;
elinks -dump http://www.mage.com
4,root 设置路径映射的,设置web资源路径映射,用于指明请求的url所对应的文档目录路径;
5,location:匹配访问请求的URI,匹配到后就用location内部定义的方式响应;
URI:请求路径中去掉服务器名和端口剩余部分
比如:
Nginx 定义了三种
location /img {}
location /bbs {}
location / {}
我们访问http://www.server.com/img会被第一个匹配到
http://www.server.com/bbs就会被第二个匹配到
如果访问里第其他的被匹配不到的,那就会被默认的/匹配也就是第三情况
location 匹配规则:location [=|~|~*]
= 精确匹配
~ 正则表达式匹配
~* 正则表达式匹配且不区分大小写
*~ URL的前半部分匹配,不检查正则
匹配优先级
= *~ ~* 无符号
root可以写在location中,比如
location /p_w_picpaths/{
root "/web/p_w_picpaths";
}
6 alias path 路径别名
别名与root区别:
如果定义成root:
location /img {
root "/www/p_w_picpaths/"
}
请求:www.mage.com/img/index.html
实际结果是在 /www/p_w_picpaths/index.html
如果定义成alias
location /imgs/ {
alias "/www/p_w_picpaths/"
}
请求:www.mage.com/imgs/index.html
实际结果是在 /www/p_w_picpaths/index.html
7 index file
设定默认主页面
index index.html ;
8 自定义错误页面:根据http状态返回码重定向错误页面
error_page code [..] URI
例如:
error_page 404 /error/404.html
注意:如果定义的页面写成绝对路径和相对路径的返回码时不一样的;
自定义 错误码
error_page 404 =200 /error/404.html
# 错误码为404时,跳转时定义成200,然后转到你访问的页面;
# 等号后面的code码可以省略,此时表示以新资源的响应码为用户请求的响应码;
9 try_file
网络连接的相关配置:
1,keepalive_timeout time:
保持连接的超时时长,默认为75
2,keepalive_requests #
再一次保持连接上允许承载的最大资源数;
3,keepalive_disable 跟浏览器类型比如 safari,msie6
禁用指定浏览器的长连接;
4,tcp_nodelay on|off
对长连接是否使用TCP_NODELAY选项;
5,client_header_timeout #
读取http请求报文首部的超时时长;
6,client_body_timeout #
读取http请求报文body的超时时长;
7,send_timeout #
发送响应报文的超时时长;
对客户端请求进行限制:
1,limit_except METHOD {...}
指定对范围之外的其他方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
如果客户端请求访问时使用的是GET方法以外的,那么仅允许172.16这网段,其他的都拒绝;
2,client_body_max_size SIZE:
限制请求报文中body部分的上限;通过检查请求报文首部中的"Content_Length"来判定;
3,limit_rate speed:
限制客户端美妙中传输的字节数,默认为0,表示无限制;
文件操作优化相关的配置:
1,sendfile on|off
2,aio on|off 异步IO是否开启
3,directio size|off 直接IO,不写往内存,
4,open_file_cache max=N[inactive=time] | off;
nginx可以缓存以下三种信息:
(1) 文件句柄、文件大小和最近一次修改时间;
(2) 打开目录的目录结构;
(3) 没有找到的或者没有权限操作的文件的相关信息;
max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;
inactive=time: 在inactive指定的时长内没有被访问过的缓存条目就会淘汰;
5,open_file_cache_errors on|off
是否缓存在文件缓存中打开文件时出现错误(找不到,没权限等错误)信息;
6,open_file_cache_min_user #:
每隔多久检查一次缓存中缓存条目的有效性;默认为60s;
扩展模块:
基于IP的访问控制:
Nginx学习补充:(附件上传)
1,编译安装Nginx配置文件语法不会高亮
2,Nginx服务脚本