|
nginx(web server,web reverse proxy)
http事务:request response
request:
...
response:
...
web资源:URL (scheme://server:port/path/to/source)
方法:GET, HEAD, POST, (WEBDAV) PUT, DELETE, TRACE, OPTIONS
status:
1xx: 信息类
2xx: 成功类,200
3xx: 重定向,301, 302, 304
4xx: 客户端类错误,403, 401, 404
5xx: 服务端类错误,502
I/O类型:
同步和异步:synchronous, asyncrhonous
关注的是消息通知机制
同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;
阻塞和非阻塞:block, nonblock
关注的是调用者等待调用结果(消息、返回值)时的状态
阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,调用不会阻塞当前线程;
5种I/O模型:
同步阻塞 blocking IO
同步非阻塞 nonblocking IO
IO复用 IO multiplexing select(),poll()
信号驱动IO signal driven IO 通知:1、水平触发:多次通知;2、边缘触发:只通知一次;
异步IO asyncrhonous IO
nginx:读音engine x
二次研发:tengine、registry
libevent:高性能的网络库
1、epool()
Nginx的特性:
模块化设计、较好扩展性;
高可靠性:master/worker
支持热部署:不停机更新配置文件、更换日志、更新服务器程序版本;
低内存消耗 :10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
事件驱动机制(mmap), 异步IO(aio), 内存映射机制(mmap);
基本功能:
静态资源的web服务器,能缓存打开的文件描述符;
http、smtp、pop3、imap4等协议的反向代理服务器;
缓存加速、负载均衡;
支持FastCGI(php-fpm), uWSGI(Python Web Framwork)等协议
模块化(非DSO机制),过滤器zip、SSI及图像的大小调整;
支持SSL;
扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志,支持使用日志缓存区提供日志存储性能;
支持url rewrite;
支持路径别名;
支持基于IP及用户的访问控制;
支持速率限制,支持并发数限制;
Nginx的程序架构:
master/worker
一个master进程,可生成一个或多个worker进程;
事件驱动模型:epoll(Linux默认边缘触发), kqueue(FreeBSD), /dev/poll(Solaris)
消息通知(复用器):select, poll, rt signals
支持sendfile, sendfile64
支持AIO,mmap
master: 加载配置文件、管理worker进程、平滑升级,...
worker:http服务,http代理,fastcgi代理,...
模块类型:
1、核心模块:core module
2、标准模块:
a、标准http模块:Standard HTTP modules
b、可选http模块:Optional HTTP modules
c、邮件相关模块:Mail modules
3、第三方模块:3rd party modules
安装方法:
1、源码:编译安装
yum groupinstall "development tools" "server plantform development"
yum -y install pcre-devel openssl-devel zlib-devel
wget http://101.110.118.22/nginx.org/download/nginx-1.14.0.tar.gz
tar xvf nginx-1.14.0.tar.gz -C /usr/local/
cd /usr/local/nginx-1.14.0/
./configure --help | less
useradd -r 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 --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug
make && make install
2、制作好的程序包:rpm包
配置文件组织结构
main block:全局配置;对http及mail模块均有效;
events {}:定义event模型(事件驱动)的相关配置;对http及mail模块均有效
http {}:http协议的相关配置;
mail {}:mail协议的相关配置;
配置指令:要以分号结尾,语法格式:directive value1 [value2...]
支持使用变量:1、内置变量:模块会提供内建变量;2、自定义变量:set var_name value;
main配置段:
类别:
正常运行必备的配置;
优化性能相关的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
1、user USERNAME [GROUPNAME];
指定用于运行worker进程的用户和组;
user nginx nginx;
2、pid /PATH/TO/PID_FILE;
指定nginx进程的pid文件路径;
pid /var/run/nginx.pid;
3、worker_rlimit_nofile #;
指定单个worker进程所能够打开的最大文件描述符数量;
性能优化相关的配置:
1、worker_processes #;
worker进程的个数;通常应该为物理CPU核心数量减1;
可以为"auto",实现自动设定;
2、worker_cpu_affinity CPUMASK(cpu掩码) CPUMASK ...;
worker_cpu_affinity auto [CPUMASK]
实现nginx绑定cpu;
优点:提升缓存的命中率;
CPUMASK:多少颗cpu就用多少个二进制来表示;如下例如4颗cpu;
0001
0010
0100
1000
worker_cpu_affinity 00000001 00000010 00000100;
3、worker_priority nice;
定义worker进程的优先级;
[-20, 19],默认nice值为0
100-139,默认优先级为120
4、timer_resolution interval;
计时器解析度,降低此值,可减少gettimeofday()系统调用的次数;
调试、定位问题的配置:
1、daemon off|on;
是否以守护进程方式启动nignx;默认为on;调试时应该设置为off;
2、master_process on|off;
是否以master/worker模型运行nginx;默认是on;调试时应该设置为off;
3、error_log /PATH/TO/ERROR_LOG level;
错误日志文件的记录方式,及其级别;出于调试的需要,可以设为debug;但debug仅在编译时使用了“--with-debug”选项时才有效;
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug:依赖于configure时的--with-debug选项;
info、notice、warn、error、crit、alert、emerg
事件驱动相关的配置:
1、accept_mutex on | off;
master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化的响应新请求;
2、lock_file file;
accept_mutex用到的锁文件路径;
3、use method;
指明并发连接请求处理时使用的方法;即指明使用的事件模型;建议让nginx自行选择;
use epool;linux只有epool可选
4、worker_connections number;
每个worker进程所能够响应的最大并发请求数量;
总结:常需要进行调整的参数:
worker_processes,worker_connetctions,worker_cpu_affinity,worker_priority
新改动配置生效的方式:nginx -s> nginx作为web服务器时使用的配置:
定义套接字相关功能
1、server {}:定义一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
}
...
注意:
(1) 基于port的虚拟主机;
listen指令监听在不同的端口;
(2) 基于hostname的虚拟主机;
server_name指令指向不同的主机名;
(3)基于ip的虚拟主机:
listen IP:PORT;
2、listen
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
listen port [default_server] [ssl] [http2 | spdy]
listen unix:path [default_server] [ssl] [http2 | spdy]
default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;
backlog:后援队列的长度;
rcvbuf:接收缓冲区大小;
sndbuf:发送缓冲区大小;
spdy:SPDY protocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议;
http2:http version 2;
3、server_name NAME [...];
指明当前server的主机名;后可跟一个或多个用空白字符分隔的主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
优先级:
(1) 首先做精确匹配;例如:www.magedu.com
(2) 左侧通配符;例如:.magedu.com
(3) 右侧通配符,例如:www.magedu.
(4) 正则表达式,例如:~^.*.magedu.com$
(5) default_server
4、root path;
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;
可用上下文:http,server,location,if
5、location [ = | ^~ | ~ | ~* ] uri { ... };
location @name { ... }
功能:允许根据用户请求的URI来匹配定义的各location;匹配到时,此请求将被相应的location块中的配置所处理,例如做访问控制等功能;
=:URI的精确匹配;
^~:URI的前半部分匹配,不支持正则表达式;
~:做正则表达式匹配,区分字符大小写;
~*:做正则表达式匹配,不区分字符大小写;
匹配优先级:精确匹配=、^~、~或~*、不带符号的URL;
6、alias path;
只能用于location配置段,定义路径别名;
location /images/ {
root /data/imgs/;
}
http://www.magedu.com/images/a.jpg /scripts/index.php
http://www.magedu.com/users.php?username=tom
(4) fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size];
定义缓存:缓存空间等;
可应用的上下文 :http
缓存机制:
元数据:内存,即为keys_zone;
数据:磁盘,即为path;
path:文件系统路径,用于储存缓存的文件数据;
levels=#[:#[:#]]:缓存目录层级定义;
levels=2:1
keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
name: cache的标识符;
size:元数据cache大小;
max_size:缓存空间上限;
注意:只能用于http上下文;
(5) fastcgi_cache zone | off;
调用定义过的缓存;
zone即为通过fastcgi_cache_path定义缓存时其keys_zone参数中的name;
(6) fastcgi_cache_key string;
定义如何使用缓存键;
使用示例:fastcgi_cache_key $request_uri;
(7) fastcgi_cache_methods GET | HEAD | POST ...;
为何请求方法对应的请求进行缓存,默认为GET和HEAD;
(8) fastcgi_cache_min_uses number;
缓存项的最少使用次数;
(9) fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 | http_403 | http_404 | off ...;
是否可使用stale缓存项响应用户请求;
(10) fastcgi_cache_valid [code ...] time;
对不同响应码的响应设定其可缓存时长;
示例:
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid 404 1m;
注意:调用缓存时,至少应该指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
LNMP:php启用fpm模型;
php-fpm的工作方式:
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic|static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
示例:location / {
root /vhosts/web1;
index index.php index.html index.htm;
}
location ~ .php$ {
root /vhosts/web1;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /vhosts/web1/$fastcgi_script_name;
include fastcgi_params;
}
|
|
|