nginx 个人详解,基础知识,要点总结

nginx 

nginx(web server , web reverse proxy):

http协议:80/tcp, HyperText Iransfer Procotol

html:HypreText Mark Language(超文本标记语言)


文本:HTTP/1.0 MIME


MIME:Multipurpose Internet Mail Extension

major/minor

text/plain

image/jpeg

URL:scheme://server[:port]/path/to/source


http事务:request <--> response

request

<method><URL><version>

<HEADERS>


<body>


response

<version><status><reason phrase>

<HEADERS>


<body>


协议格式:文本、二进制


method 

GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS


status

1xx:信息类

2xx:成功类

3xx:重定向类

4xx:客户端错误类

5xx:服务器端错误


HEADER

通用首部

请求首部

响应首部

实体首部

扩展首部

web页面:多个资源

入口:资源引用:


认证:

基于IP认证:

基于用户访问:

basic

digest


资源映射:

Alias

DocumentRoot


httpd:MPM(多路处理模块)

prefork ,worker ,event(第一种是进程模型,后两种是线程模型)

prefork:主进程,生成多个子进程,每个子进程处理一个进程

worker:主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求

event:主进程,生成多个子进程,每个子进程响应多个请求


I/O类型

同步和异步:

关注的是消息通知机制


同步:调用发出之后不会立即返回,但一返回,则返回的即是最终结果

异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果:被调用者通过状态,通知机制等来通知调用者,或通过回调函数来处理结果:


阻塞和非阻塞

关注的是调用者等待被调用者返回调用结果时的状态


阻塞:调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后才能继续


非阻塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者


I/O模型:

blocking IO 阻塞式IO

nonblocking IO 非阻塞式IO

IO multiplexing 复用性IO

select():最多不能超1024个并发,poll():profork、worker

singnal driven IO  事件驱动型IO:event

增加了通知机制

水平触发:多次通知

边缘通知:只通知一次

asynchronous IO: 异步型IO

eopll


例如:一次read操作

(1)等待数据准备好,从磁盘到内核内存

(2)从内核内存复制到进程内存




nginx 

Nginx:engine X

Tngine

Registry


libevent:高性能的网络库

epoll()


Nginx特性

模块化设计,较好的扩展性

高可靠

master --> worker

低内存消耗

10000个keep-alive模式下的connection,仅需要2.5MB内存

支持热部署

不停机而更新配置文件,日志文件滚动,升级程序版本


支持事件驱动、AIO、mmap


基本功能

静态资源的web服务器,能缓存打开的文件描述符

http、smtp、pop3 协议的反向代理服务器

支持缓存加速,负载均衡机制

支持FastCGI(fpm,LNMP),uWSGI(python)等

模块化(非DSO机制)、过滤器zip,SSI及图像的大小调整

支持SSL


扩展功能

基于名称和IP的虚拟主机

支持keeplive

支持平滑升级

定制访问日志,支持使用日志缓冲区提供日志存储性能

支持url rewrite

支持路径别名

支持基于IP和用户的访问控制

支持速率限制,支持并发数限制


Nginx的基本架构

一个master进程,生成一个或多个worker进程

事件驱动,epoll(边缘触发),kqueue:BSD系统,/dev/poll

复用器:select,poll,rt signal

支持sendfile,sendfile64

支持AIO

支持mmap


nginx的工作模式:非阻塞,时间驱动,有一个master进程生成多个worker线程,每个worker响应N个请求

worker * n


模块类型

核心模块

Standard HTTP modules

Optional HTTP modules

Mail modules

3rd party modules


安装方法:

源码:编译安装


编译安装: ./configure --help(查看帮助)


配置文件:

main配置段:全局配置段

event:定义event模型工作特性

http{}:定义http协议的相关配置


配置指令:要以分号结尾,语法格式:

directive value1[value2 ...]


支持使用变量

内置变量

模块会提供几建变量定义

自定义变量

set var_name value


主配置段指令

用于调试、定位问题

正常运行必备的配置

优化性能的配置

事件相关的配置


nginx:非阻塞、事件驱动、异步



主配置段的指令

正常运行的必备配置


1、user USERNAME[GROUPNAME]

指定运行worker进程的用户和组

2、pid  /path/to/pid_file

指定nginx守护进程的pid文件

3、worker_rlimit_nofile  # ;

指定所有worker进程所能够打开的最大文件句柄数


性能优化的相关配置

1、worker_processes #

所能打开的worker进程的个数:通常应该略少于cpu物理核心数

2、worker_cpu_affinity  cpumask...


优点:提升缓存的命中率


context switch (进程切换):会产生cpu的不必要的消耗


cpumask:

0000 0000

0000 0001

0000 0010

0000 0100

0000 1000


worker_cpu_affinity 00000001 00000010 00000100 (绑定前三颗cpu)

3、time_resolution

计时器解析度:降低此值,可减少gettimeofday()系统调用的次数


4、work_priority number;

指明worker进程的nice值,nice值越小,优先值越高

-20 19

100 139


事件相关的配置

1、accept_mutex {off|on};

master调度用户请求至各worker进程时使用的负载均衡锁:on表示能让多个worker轮流的,序列化的去响应新请求;


2、lock_file file:

accept_mutex用到的锁文件路径


3、use [epoll|rtsig|select|poll]

指明使用的事件模型:建议让nginx自行选择


4、worker_connection #;

设定单个worker进程所能够处理的最大并发连接数


worker_connection (51200)* worker_processes



用于调试,定位问题,(解码时,要加上这个包  --with-debug)

1、daemon {on|off}

是否已守护进程方式,来运行nginx:调试时应设置为off

2、master_process {on|off}

是否以master/worker模型来运行nginx;调试时可以调试为off

3、error_log 位置 级别;

若要使用debug级别,需要在编译nginx时使用了 --with-debug选项


nginx作为web服务器时使用的配置:

http{}:由ngx_http_core_module模块所引入:


配置框架:

http{

upstream{

..

}

server{

location URL{

...

}#类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系:

location URL {

if...{


}

}

...

}#每个server类似于httpd中的一个<VirtualHost>

}



注意:与http相关的指令仅能够放置于http、server、location、upstream、if上下文,但有些指令仅用于这五种上下文中的某些中:


配置指令;

1、server{}

定义一个虚拟主机的


2、listen

指定监听的端口和地址

3、server_name NAME [...]

后可跟多个主机;名称还可以使用正则表达式(~)或通配符;

(1)先做精确匹配检查;

(2)左侧通配符匹配检查

(3)右侧通配符匹配检查

(4)正则表达式匹配检查

(5)default_server

4、root path:

设置资源路径映射;用于指明请求的URL所对应的资源所在的文件系统上的起始路径

5、location

功能:允许根据请求的URL来匹配定义的各location。匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能


= :精确匹配检查

~:正则表达式模式匹配检查,区分字符大小写

~*:正则表达式模块匹配检查,不区分字符大小写

^~: URL的前半部分匹配,不支持正则表达式


匹配优先级:= > ^~ > ~ > ~* > 不带任何符号的


6、alias path;

用于location配置段,定义路径别名


注意:root表示指明路径为对应的location"/"URL; alias 表示路径映射,即location指令后定义的URL是相对于alias所知名的路径而言


7、 index file;

默认主页面:

index index.php index.html;


8、error_page code [...] [=code] URL | @name

根据http响应状态码来指明待用的错误页面:


error_page 404 [= 200]/404_customed.html


[=code]: 以指定的响应码进行响应,而不是默认的原来的响应码:默认表示以新资源的响应码为其响应码:


9、基于IP的访问控制机制

allow IP/network

deny IP/network


10、基于用户的访问控制

basic,digest


auth_basic "" ;

auth_basic_user_file "/PATH/TO/PASSWORD_FILE

账号密码文件建议使用htpasswd来创建

11、https服务


生成私钥,生成证书签署请求,并获得证书


server {

listen   443 ssl;

server_name www.baidu.com


ssl_certificate /etc/nginx/ssl/nginx.crt

ssl_cretificate_key /etc/nginx/ssl/nginx.crt


ssl_session_cache  shsred:SSL:1m;

ssl_session_timeout  5m;


ssl_ciphers  HIGH:!aNULL:!MDS

ssl_prefer_server_ciphers  on;


location / {

root /data/web

index index.html  index.htm

}

}


12、stub_ststus {on|off}

仅能用于location上下文

location  /ststus {

stub_status on;

}


13、rewrite regex replacement flag;

例如:

rewrite ^/images/(.*\.jpg)$ /imgs/$ break;


flag:

last:一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理,而是由User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程

break;一旦此rewrite规则重写完成后,由User Agent对新的URL重写发起请求,且不再会被当前location内的任何rewrite规则所检查

redirect:以302响应码(临时重定向)返回新的URL

permanent:以301响应码(永久重定向)返回新的URL


14、if

语法:if(condition){...}

应用语法: server , location


condtion:

(1)变量名:

变量值为空串,或者以“0”开始,则为false,其他均为true

(2)以变量为操作数构成的比较表达式

可使用=,!= 类似的比较操作符进行测试

(3)正则表达式的模式匹配操作

~:区分大小写

~*:不区分大小写

!~和!~*:对上面两种测试取反

(4)测试文件存在性:-f,!-f

(5)测试指定路径为目录的可能性:-d ,!-d

(6)测试文件存在性:-e,!-e

(7)检查文件是否有执行权限:-x,!-x

15、防盗链

location ~*\.(jpg|gif|jpeg|png)$ {

valid_referer none blocked www.baidu.com;

if ($invialid_referer) {

rewrite ^/ http://www.baidu.com/403.html

}

}


16、定制访问日志格式

log_format


网络连接相关的配置

1、keeplive_timeout #

长连接的超时时长,默认75秒

2、keeplive_requests #

在一个长连接上所能够允许请求的最大资源数

3、keeplive_disable [msie6|safari|none]

为指定类型的User Agent禁用长连接

4、tcp_nodelay on|off

是否对长连接使用TCP_NODELAY选项;(如想提升用户体验,使用on)

5、client_header_timeout #;

读取http请求报文首部的超时时长

6、client_body_timeout #;

读取http请求报文body部分的超时时长

7、send_timeout #;

发送响应报文的超时时长


fastcgi的相关配置

lnmp:php要启用fpm模型




猜你喜欢

转载自blog.51cto.com/13214087/2132974