---------------------[高性能WEB服务NGINX部分]---------------------
>1. ngx_http_core_module模块: 定义位置路径-root(/默认)
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server, location, if in location
匹配优先级从高到低:=, ^~, ~/~*, 不带符号
示例:
server {
location /admin/ {
root /webapps/app1/data/;
}
}
http://www.magedu.com/admin/index.html
--> /webapps/app1/data/admin/index.html
>2. ngx_http_core_module模块: 定义路径别名-alias(路径别名)
路径别名,文档映射的另一种机制;仅能用于location上下文
示例:
http://www.magedu.com/bbs/index.html
location /bbs {
alias /web/forum/;
}
--> /web/forum/index.html 注意: /bbs 后建议不要加 /
location /bbs/ {
root /web/forum/;
}
--> /web/forum/bbs/index.html
注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri 左侧的/
(b) alias,给定的路径对应于location中的/uri 的完整路径
>3. ngx_http_proxy_module模块:请求转发到另外一个主机.
1、proxy_pass URL;
注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]; 注意: 最后没有/
}
...
}
上面示例:http://HOSTNAME/uri --> http://host/uri
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]/; 注意: 最后有/
}
...
}
上面示例:http://HOSTNAME/uri --> http://host/ 即置换.
2、如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用自己的uri; 用户请求时传递的uri将直接附加至后端服务器之后
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; 注意: 不能加/
}
...
}
上面示例:http://HOSTNAME/uri/ --> http://host/uri/
>4. ngx_http_core_module模块:客户端网络传输速率限制.
limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second, 默认值0表示无限制.
limit_except method ... { ... },仅用于location, 限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE,
OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使
>5. ngx_http_access_module模块: 基于IP的访问控制功能.
1、allow address | CIDR | unix: | all;
2、deny address | CIDR | unix: | all;
http, server, location, limit_except 自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
>6. ngx_http_auth_basic_module模块: 使用basic机制基于用户的访问控制(文件服务器)
实现基于用户的访问控制,使用basic机制进行用户认证
1、auth_basic string | off;
2、auth_basic_user_file file;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
用户口令文件:
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd命令实现, httpd-tools所提供
>7. ngx_http_stub_status_module模块: 输出nginx的基本状态信息
示例:
location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}
>8. ngx_http_ssl_module模块:证书绑定功能
1、ssl on | off;
为指定虚拟机启用HTTPS protocol, 建议用listen指令代替 (新版本必须使用listen www.xxx.com.cn ssl)
2、ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件
3、ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件
4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl协议版本,默认为后三个
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none: 通知客户端支持ssl session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存
6、ssl_session_timeout time;
客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
示例:
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
# ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
>9. ngx_http_rewrite_module模块:请求重定向
rewrite regex replacement [flag]
>10. ngx_http_referer_module模块:防盗链
valid_referers none|blocked|server_names|string ...;
>11. ngx_http_upstream_module模块: 负载均衡服务器
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用
1、upstream name { ... }
定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr
http {
upstream httpdsrvs {
server ...
server...
...
}
}
2、server address [parameters];
IP[:PORT]
HOSTNAME[:PORT]
parameters: weight=number 权重,默认为1
max_conns 连接后端报务器最大并发活动连接数,1.11.5后支持
max_fails=number 失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1
fail_timeout=time 后端服务器标记为不可用状态的连接超时时长,默认10s
backup 将服务器标记为“备用”,即所有服务器均不可用时才启用
down 标记为“不可用”,实现灰度发布
3、ip_hash 源地址hash调度方法
4、least_conn 最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接
5、hash key [consistent] 基于指定的key的hash表来实现对请求的调度
作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器
hash $request_uri consistent;
hash $remote_addr;
6、health_check [parameters];健康状态检测机制;只能用于location上下文
interval=time检测的频率,默认为5秒
fails=number:判定服务器不可用的失败检测次数;默认为1次
passes=number:判定服务器可用的失败检测次数;默认为1次
uri=uri:做健康状态检测测试的目标uri;默认为/
******match=NAME:健康状态检测的结果评估调用此处指定的match配置块****** / 注意:仅对nginx plus有效
实例1
stream {
upstream mysqlsrvs {
server 192.168.22.2:3306;
server 192.168.22.3:3306;
least_conn;
}
实例2
stream {
upstream mysqlsrvs {
server 192.168.0.10:3306;
server 192.168.0.11:3306;
hash $remote_addr consistent;
}
实例3
stream {
upstream mysqlsrvs {
server 192.168.0.10:3306;
server 192.168.0.11:3306;
hash $remote_addr consistent;
}
server {
listen 172.16.100.100:3306;
proxy_pass mysqlsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
>12. 实现Nginx高并发Linux内核优化
使Nginx支持更多并发请求, 修改/etc/sysctl.conf来更改内核参数
fs.file-max = 999999
表示单个进程较大可以打开的句柄数
net.ipv4.tcp_tw_reuse = 1
参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在
net.ipv4.tcp_keepalive_time = 600
当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接
net.ipv4.tcp_fin_timeout = 30
当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间
net.ipv4.tcp_max_tw_buckets = 5000
这个参数表示操作系统允许TIME_WAIT套接字数量的较大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢
net.ipv4.ip_local_port_range = 1024 65000
定义UDP和TCP链接的本地端口的取值范围
net.ipv4.tcp_rmem = 10240 87380 12582912
定义了TCP接受缓存的最小值、默认值、较大值
net.ipv4.tcp_wmem = 10240 87380 12582912
定义TCP发送缓存的最小值、默认值、较大值
net.core.netdev_max_backlog = 8096
当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值
注意:以下的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑
net.core.rmem_default = 6291456
表示内核套接字接受缓存区默认大小
net.core.wmem_default = 6291456
表示内核套接字发送缓存区默认大小
net.core.rmem_max = 12582912
表示内核套接字接受缓存区较大大小
net.core.wmem_max = 12582912
表示内核套接字发送缓存区较大大小
net.ipv4.tcp_syncookies = 1
与性能无关。用于解决TCP的SYN攻击
net.ipv4.tcp_max_syn_backlog = 8192
这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求
net.ipv4.tcp_tw_recycle = 1
这个参数用于设置启用timewait快速回收
net.core.somaxconn=262114
选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114
选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值