nginx(web server,web reverse proxy)
http事务:request <—-> response
request:
<method> <URL> <version>
<HEADERS>
…
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
…
<body>
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 reload | stop | quit | reopen
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 <— /data/imgs/images/a.jpg
location /images/ {
alias /data/imgs/;
}
http://www.magedu.com/images/a.jpg <— /data/imgs/a.jpg
注意:root表示指明路径为对应的location “/” URL;alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言;
7、index file;
默认主页面;
例如: index index.php index.html;
8、error_page code […] [=code] URI | @name;
根据http的响应状态码来指明特用的错误页面;
error_page 404 /404_customed.html
[=code]:以指定的响应码进行响应,而不是默认的原来的响应码;默认表示以新资源的响应码为其响应码;
error_page 404 =200 /404.html
9、基于IP的访问控制
allow IP | NETWORK | unix: | all;
deny IP | NETWORK | unix: | all;
可用上下文:http, server, location, limit_except
10、基于用户的访问控制(basic,digest)
auth_basic “”;
auth_basic_user_file “/PATH/TO/PASSWD_FILE”;
账号密码建议使用htpasswd来创建
htpasswd命令;
# htpasswd -c -m /etc/nginx/.ngxhtpasswd tom
# htpasswd -m /etc/nginx/.ngxhtpasswd jerry
11、https服务
前提:生成私钥,生成证书签署请求,并获得证书;
server {
listen 443 ssl;
server_name www.magedu.com;
ssl_certificate cert.pem; 指明证书文件位置
ssl_certificate_key cert.key; 指明私钥文件位置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /vhosts/web1;
index index.html index.htm;
}
}
12、stub_status {on|off};
通过指定的uri输出stub status;仅能用于location上下文;
location /status {
stub_status on;
allow 172.20.120.0/23
deny all;
}
结果示例:
Active connections: 5
server accepts handled requests
234 234 462
Reading: 1 Writing: 5 Waiting: 12
Active connections:当前所有处于打开状态的连接数;
accepts:已经接受过的连接数;
handled:已经处理过的连接数;
requests:已经处理过的请求数;在“保持连接”模式下,请求数量可能会多于连接数量;
Readking:正处于接收请求状态的连接数;
Writing:请求已经接收完成,正处于处理请求或发送响应的过程中的连接数;
Waiting:保持连接模式,且处于活动状态的连接数;
13、rewrite regex replacement [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
regex:正则表达式,用于匹配用户请求的url;
replacement:重写为的结果;
[flag]:
last:一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理;而是由user agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程;
break:一旦此rewrite规则重写完成后,由user agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查;
redirect:以302响应码(临时重定向)返回新的URL;
permanent:以301响应码(永久重定向)返回新的URL;
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
http://www.magedu.com/images/a/1.jpg —> http://www.magedu.com/imgs/a/1.jpg
14、if
语法 if (condition) {…}
应用环境:server,location
condition:
(1)变量名:
变量值为空串,或者以“0”开始,则为fault,其他均为true;
(2)以变量为操作数构成的比较表达式
可使用=,!=类似的比较操作符进行测试;
(3)正则表达式的模式匹配操作;
~:区分大小写的模式匹配检查;
~*:不区分大小写的模式匹配检查;
!~和!~*:对上面两种测试取反;
(4)测试路径为文件的可能性:-f,!-f
(5)测试路径为目录的可能性:-d,!-d
(6)测试文件的存在性:-e,!-e
(7)检查文件是否有执行权限:-x,!-x
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
15、防盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.lewis.com;
if ($invalid_referer) {
rewrite ^/ http://www.lewis.com/403.html;
}
}
16、定制访问日志
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log logs/access.log main;
注意:此处可用变量为nginx各模块内建变量;
网络连接相关配置:
1、keepalive_timeout #; 长连接的超时时长,默认为75s;
2、keepalive_requests #; 在一个长连接上所能够允许请求的最大资源数;
3、keepalive_disable [msie|safari|none]; 为指定类型的user agent禁用长连接;
4、tcp_nodelay on|offf; 是否对长连接使用TCP_NODELAY选项;
5、client_header_timeout #; 读取http请求报文首部的超时时长;
6、client_body_timeout #; 读取http请求报文body部分的超时时长;
7、send_timeout #; 发送响应报文的超时时长;
LNMP:php启用fpm模型;
例如:
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;
}
nginx反向代理:proxy、fastcgi、upstream
ngx_http_proxy_module:实现反向代理及缓存功能;
(1) proxy_pass URL;
应用上下文:location, if in location, limit_except
proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;
location /uri/ {
proxy_pass http://hostname;
}
proxy_pass后面的路径是一个uri时,其会将location的uri替换为后端主机自己的uri;
location /uri/ {
proxy_pass http://hostname/new_uri/;
}
如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;
location ~* \.(jpg|gif|jpeg)$ {
proxy_pass http://HOSTNAME;
}
此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以;
(2) proxy_set_header field value;
用于proxy server向backend server发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部;
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;
实践作业:
假如nginx有两个server(虚拟主机),且均反代至后端某一个主机,此主机亦有两个虚拟主机,虚拟主机名与nginx的相同;
要求:用户请求nginx的哪一个虚拟主机,就将其代理后后端主机的对应的虚拟主机;
缓存相关的选项(缓存要先定义,后调用):
(3) proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
定义缓存;可用上下文为http;
(4) proxy_cache zone | off;
调用缓存;可用上下文 为http, server和location;
(5) proxy_cache_key string;
定义缓存键;
proxy_cache_key $scheme$proxy_host$request_uri;
(6) proxy_cache_valid [code …] time;
对不同响应码的响应设定其可缓存时长;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off …;
处于什么状态下,以旧的缓存响应;
proxy_cache_bypass string:设置在何种情况下nginx将不从cache取数据;
$cookie_nocache $arg_nocache $httpd_authorization
跟连接相关的选项
(7) proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;
(8) proxy_send_timeout time;
把请求发送给后端服务器的超时时长;默认为60s;
(9) proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长;
ngx_http_upstream_module:定义服务器组
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;
(1) upstream name { … }
定义一个后端服务器组,name为组名称;仅能用于http上下文 ;
(2) server address [parameters];
在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;
常用参数:
weight=number:定义服务器权重,默认为1;
max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定;
fail_timeout=number:等待目标服务器发送响应的时长;
backup:备用服务器,所有主服务器均故障时才启用此主机;
down:手动标记其不再处理任何用户请求;
使用方法:
(a) 定义upstream服务器组
upstream websrvs {
server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
server 172.16.100.6 weight=1 max_fails=2 fail_timeout=6s;
}
(b) 在反代场景中(proxy_pass, fastcgi_pass, …)进行调用;
location / {
proxy_pass http://websrvs/;
}
(3) ip_hash;
源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;
(4) least_conn;
最少连接;当各server权重不同时,即为加权最少连接;
(5) health_check [parameters];
健康状态检测机制;只能用于location上下文;建议关闭访问日志;
常用参数:
interval=time检测的频率,默认为5秒;
fails=number:判定服务器不可用的失败检测次数;默认为1次;
passes=number:判定服务器可用的失败检测次数;默认为1次;
uri=uri:做健康状态检测测试的目标uri;默认为/;
match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
(6) match name { … }
对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文;
常用的参数:
status code[ code …]: 期望的响应状态码;
header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
body:期望响应报文的主体部分应该有的内容;
(7) hash key [consistent];
指明基于hash方式进行调度时,其hash key;
hash $remote_addr相当于ip_hash;
常用的hash key:
$cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
$request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;
session会话保持:
session sticky:基于ip, ngix还可基于请求报文首部中的多种信息,例如cookie, uri;
session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境;
session server:使用一个共享的存储服务存储session信息;
ngx_http_headers_module模块配置
(1) add_header name value [always];
向响应报文添加自定义首部,并为其赋值;
示例:
add_header realserver $server_addr; 添加真实服务器地址的自定义首部
add_header cache_status $upstream_cache_status; 添加nginx缓存状态的自定义首部
(2) expires [modified] time;
expires epoch | max | off;
允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值;
fastcgi模块指令:
(1) fastcgi_pass address;
address为fastcgi server监听的地址和端口;
示例:fastcgi_pass 127.0.0.1:9000;
(2) fastcgi_index name;
定义fastcgi应用的默认主页;
示例:fastcgi_index index.php;
(3) fastcgi_param parameter value [if_not_empty];
设定传递给后端fastcgi server参数及其值;
示例:fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
/index.php –> /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
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;
}
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/101956