为什么使用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服务脚本