实用手册:https://wizardforcel.gitbooks…
1 nginx根底操作
1.1 nginx装置
# yum疾速装置
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 编译装置
wget http://nginx.org/download/nginx-1.14.1.tar.gz
tar -zxvf nginx-1.14.1.tar.gz
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module\
--with-http_realip_module\
--with-http_sub_module \
--with-http_ssl_module\
--with-http_realip_module \
--with-http_sub_module \
--with-http_gunzip_module\
--with-http_gzip_static_module\
--with-http_auth_request_module\
--with-http_random_index_module \
--with-http_slice_module \
--with-http_stub_status_module
make && make install
# 查看加载的模块及版本信息
nginx -V
1.2 nginx常用命令
# 查看Nginx的版本号
nginx -V
# 进行
nginx -s stop
# 退出
nginx -s quit
# 重启加载配置
nginx -s reload
# 配置文件启动
nginx -c </path/to/config>
# </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的
# 不运行,而仅仅测试配置文件
nginx -t
# nginx 将查看配置文件的语法的正确性,并尝试关上配置文件中所援用到的文件。
1.3 nginx管制信号
再次回过头看看nginx的原理图,咱们还能够通过信号去操作nginx
,默认状况下nginx
将其主过程的pid
写入到/usr/local/nginx/nginx.pid
文件中。
# nginx 进行命令,等所有申请完结后敞开服务。(从容敞开)
Kill -QUIT nginx 主过程号
# 从新载入配置。用新的配置开始新的工作过程,从容敞开旧的工作过程
kill -HUP nginx 主过程号
# 疾速敞开
kill -TERM nginx 主过程号
# 或
kill -INT nginx 主过程号
# 从新关上日志文件
kill -USR1 nginx 主过程号
# 平滑降级可执行程序
kill -USR2 nginx 主过程号
# 从容敞开工作过程
kill -WINCH nginx 主过程号
2 nginx配置阐明
2.1 根底配置阐明
配置语法阐明:
1、配置文件由指令与指令块形成
2、每条指令以;分号结尾,指令与参数间以空格符号分隔
3、指令块以{}大括号将多条指令组织在一起
4、应用#符号增加正文,进步可读性
5、include语句容许组合多个配置文件以晋升可维护性
6、应用$符号应用变量
7、局部指令的参数反对正则表达式
Nginx的各种指令以及配置繁多,有些配置能够在如下的链接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官网文档上查看
为了对配置性能进行可扩大化,并对相干配置能进行明确的辨别,让配置看见就能很明了。采纳了模块化配置。
nginx罕用模块
http模块
http规范外围模块,http服务的相应配置
server模块
接管申请的服务器须要将不同的申请按规定转发到不同的后端服务器上,在 nginx 中咱们能够通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。
server_name
因为IP地址的数量无限,因而常常存在多个主机域名对应着同一个IP地址的状况,这时在 nginx.conf
中就能够依照server_name(对应用户申请中的主机域名)
并通过server块来定义虚拟主机,每个server
块就是一个虚拟主机,它只解决与之绝对应的主机域名申请。这样,一台服务器上的 Nginx 就能以不同的形式解决拜访不同主机域名的HTTP
申请了。
语法:
主机名称
语法: server_name name[...];
默认: server_name"";
配置块: server
虚拟主机名能够应用确切的名字,通配符,或者是正则表达式来定义,在开始解决一HTTP
申请时, Nginx
会取出header
头中的Host
,与每个server
中的server_name
进行匹配,以此决定到底由哪一个server
块来解决这个申请。有可能一个Host
与多个server
块中的server_name
都匹配,这时就会依据匹配优先级来抉择理论解决的server
块。
留神:优先级问题,所导致的配置不失效
server_name与Host的匹配优先级如下:
1)首先抉择所有字符串齐全匹配的server_name,如 nginx.2367.com 。
2)其次抉择通配符在后面的server_name,如 *.2367.com。
3)再次抉择通配符在前面的server_name,如nginx.2367.* 。
4)最初抉择应用正则表达式才匹配的server_name,如 ~^\.testweb\.com$
如果都不匹配
1、优先选择listen配置项后有default或default_server的
2、找到匹配listen端口的第一个server块
location(URL匹配特定地位后的设置)
location
局部用于匹配网页地位(比方,根目录“/”,“/images”,等等),server
是对应一个域名进行的配置,而location
是在一个域名下对更精密的门路进行配置
语法:
语法: location[=|~|~*|^~|@]/uri/{...}
配置块: server
location会尝试依据用户申请中的URI来匹配下面的/uri表达式,如果能够匹配,就抉择
location{}块中的配置来解决用户申请。当然,匹配形式是多样的,上面介绍location的匹配
规定。
location表达式类型:
~ 示意执行一个正则匹配,辨别大小写;
~* 示意执行一个正则匹配,不辨别大小写;
^~ 示意一般字符匹配。应用前缀匹配。如果匹配胜利,则不再匹配其余location;
= 进行一般字符准确匹配。也就是齐全匹配;
@ 它定义一个命名的 location,应用在外部定向时,例如 error_page, try_files
优先级:
(location =) > (location 残缺门路) > (location ^~ 门路) > (location ~,~* 正则程序) > (location 局部起始门路)
等号类型(=)的优先级最高。一旦匹配胜利,则不再查找其余匹配项。
前缀一般匹配(^~)优先级次之。不反对正则表达式。应用前缀匹配,如果有多个location匹配的话,则应用表达式最长的那个。
正则表达式类型(~ ~*)的优先级次之。一旦匹配胜利,则不再查找其余匹配项。
惯例字符串匹配,如果有多个location匹配的话,则应用表达式最长的那个。
root(文件门路的定义)和alias(以别名形式设置资源门路)
以root形式设置资源门路
语法:
语法: root path;
配置块: http、server、location、if
以别名形式设置资源门路
语法:
语法: alias path;
配置块: location
alias也是用来设置文件资源门路的,它与root的不同点次要在于如何解读紧跟location前面的uri参数
留神: location中应用root指令和alias指令的意义不同
- root,相当于追加在root目录前面 。比方拜访的是 xxx/test=>/www/test
- alias,相当于对location中的uri进行替换,比方拜访的是 xxx/test,想要拜访到/www/test就必须设置 alias /www/test
2.2 nginx内置变量阐明
Nginx
同Apache
和Lighttpd
等其余 Web 服务器的配置记法不太雷同,Nginx
的配置文件应用语法的就是一门微型的编程语言。能够相似写程序个别编写配置文件,可操作性很大。既然是编程语言,个别也就少不了“变量”这种货色。
所有的Nginx
变量在Nginx
配置文件中援用时都须带上$
前缀在Nginx
配置中,变量只能寄存一种类型的值,有且也只存在一种类型,那就是字符串类型
应用 set 配置指令对变量 $a 进行了赋值操作set $hello "hello world" ;
Nginx
变量一旦创立,其变量名的可见范畴就是整个Nginx
配置,甚至能够逾越不同虚拟主机的server
配置块Nginx
变量名的可见范畴尽管是整个配置,但每个申请都有所有变量的独立正本,或者说都有各变量用来寄存值的容器的独立正本,彼此互不烦扰Nginx
内置变量寄存在ngx_http_core_module
模块中
3 罕用模块配置或者实际案例
3.1 IP和目录权限访问控制配置
IP访问控制模块
用来对特定IP的进行访问控制。默认是容许所有ip拜访,若局部容许需定义deny all
allow
语法: allow address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
容许某个ip或者一个ip段拜访
deny
语法: deny address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
allow、deny实例
-
对IP的拜访的管制
location / { deny 192.168.1.1; # 回绝IP拜访 allow 192.168.1.0/24; # 容许IP段拜访 allow 47.98.147.49; # 容许IP拜访 deny all; # 启用IP管制 }
-
对目录文件的拜访
比方能够限度某些目录下的某些文件的拜访,具体能够本人组合。# 禁止拜访所有目录下的 sql|log|txt|jar|sh|py 后缀的文件, location ~.*\.(sql|log|txt|jar|war|sh|py|php) { deny all; }
3.2 限流模块
场景:抢购的场景,下载限速下就会有波及使用
限流:次要是当访问量达到一个限度量的时候能够抉择以服务器为次要,而抉择对用户拜访申请的量做限度,对于超出限度的用户申请会采取抛弃或者提早解决等形式解决,来保障更多用户来拜访解决。
比方:某一服务器失常在高峰期上能反对的访问量是1w,然而忽然某一时刻在访问量上忽然暴增一下子超过3w,5w则可能会导致服务器宕机,这个时候咱们就能够通过设置最大的拜访如1分钟拜访8000次。
也能够避免攻打(对同一个ip每秒拜访多少次)如:30min/次
原理:令牌桶算法
对应模块:
ngx_http_limit_conn_module
限度连接数ngx_http_limit_reg_module
限度申请频率
3.2.1 ngx_http_limit_req_module限度申请频率
https://tengine.taobao.org/ng…
根本示例:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
# 应用$binary_remote_addr【这是一个二进制的信息记录 $remote_addr(非二进制的)】(nginx自身存在的,保留客户端的ip地址)变量,能够将每条状态记录的大小缩小到64个字节,这样1M的内存能够保留大概1万6千个64字节的记录。如果限度域的存储空间耗尽了,对于后续所有申请,服务器都会返回 503 (Service Temporarily Unavailable)谬误。
# zone=one:10m 示意设置了名为“one”,大小为10兆字节,也能够了解为设置的限流名为one
# rate=10r/s 的意思是容许1秒钟不超过10个申请。速度能够设置为每秒解决申请数和每分钟解决申请数,其值必须是整数。如果申请频录不到每秒1次,你能够设置每分钟几次(r/m)。比方每秒半次就是30r/m。
limit_req_log_level notice;
# 如果你说心愿的日志级别,当拜访因为频录过高回绝或提早解决申请时能够记下相应级别的日志。提早记录的日志级别比回绝的低一个级别;比方,如果设置“limit_req_log_level notice",提早的日志就是info级别。
# 语法:limit_req_log_level info | notice | warn | error;
# 默认值:limit_req_log_level error;
# 上下文:http、server、location
# 版本要求0.8.18+
...
server {
...
location /search /{
limit_req zone=one burst=5;
# 应用了上方名字为”one"的限流。
# burst=5 容许超过频率限度的申请数不多于5个,假如1、2、3、4秒申请为每秒9个,那么第5秒内申请15个是容许的,反之,如果第一秒内申请15个,会
将5个申请放到第二秒,第二秒内超过10的申请间接503,相似多秒内均匀速率限度。
这里多进去的5个申请是被放到10m的哪个缓存中,期待下一秒的解决。
# nodelay 超过的申请不被提早解决,设置后15个申请在1秒内解决。这里回有5个超出,超出的5个会间接503。写法:limit_req zone=one burst=5 nodelay;
}
}
}
3.2.2 ngx_http_limit_conn_module限度申请连接数
https://tengine.taobao.org/ng…
根本示例:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 区域名称为addr,大小为10m,键值是客户端IP。
# 用于限度每个已定义键的连接数,特地是来自单个IP地址的连接数。并不是所有的连贯都被计算在内。只有当服务器解决了一个申请,并且整个申请头曾经被读取时,才会计算连贯。
# 语法: limit_conn_zone $binary_remote_addr zone=addr:10m;
# 默认值: none
# 上下文:http
# 如果限度域的存储空间耗尽了,对于后续所有申请,服务器都会返回 503 (Service Temporarily Unavailable)谬误。
...
server {
...
location /download/{
limit_conn addr 1;
# 限度每个IP只能发动1个连贯。(addr 要跟 limit_conn_zone 的变量对应)
}
}
}
下载限速设置
http {
# ....
limit_conn_zone $binary_remote_addr zone=addr:10m;
# ....
server {
location / {
# root html;
autoindex on;
# 是限度每个IP只能发动1个连贯 (addr 要跟 limit_conn_zone 的变量对应)
limit_conn addr 1;
limit_rate 10k; #限速为 10KB/秒
root /redis_2004;
# index index.html index.htm;
}
}
}
测试下载文件
3.2.3 IP黑白名单
连贯限度跟申请限度,会对所有的ip进行限度,咱们不心愿本人的测试的ip,或者搜索引擎蜘蛛受到限制。
依据下面的速率限度的问题:
limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
目前的状况是针对于所有的申请均会有做限度,而在业务中可能会存在这对于某一些ip是不做限度的需要;在nginx的配置中并不能间接对于变量编辑相应的逻辑计算因而咱们不得不须要换一个形式。
3.2.3.1 ngx_http_geo_module
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_geo_module.html ngx_http_geo_module
模块创立变量,并依据客户端IP地址对变量赋值.
语法: geo [$address] $variable { ... }
默认值: —
上下文: http
其实这个操作就有点相似于枚举变量,会依据咱们传递的参数而后匹配并返回相应的参数。
根底体验:
http {
// ..
geo $whiteIpList {
default 1;
192.168.169.139 0;# 如果拜访IP=192.168.169.139,下方$whiteIpList就返回0
192.168.169.160 0;
include ip/whiteIp.conf;# 能够设置ip列表
}
server {
// ..
location /geo {
return 200 '$whiteIpList';
# 拜访http://xxxx/geo =》浏览器页面输入1或0
}
}
}
3.2.3.2 ngx_http_map_module
ngx_http_map_module
能够依据咱们传递的参数。
语法: map string $variable { ... }
默认值: —
上下文: http
应用方面和geo的形式相似.须要值得注意的是
limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
如果binary_remote_addr为空则限度失败。
操作测试:
map $whiteIpList $limit_ip {
0 "";
1 $remote_addr;
}
最初配合geo实现白名单的操作
http {
// ..
limit_req_zone $limit_ip zone=testz:10m rate=1r/s;
limit_conn_zone $limit_ip zone=addr:10m;
// ..
geo $whiteIpList {
default 1;
192.168.169.139 0;# 如果拜访IP=192.168.169.139,下方$whiteIpList就返回0
include ip/whiteIp.conf;# 能够设置ip列表
}
map $whiteIpList $limit_ip {
0 "";
1 $binary_remote_addr;
}
server {
// ..
location / {
root html;
limit_conn addr 1;
limit_rate 10k; #限速为 100KB/秒
index index.html index.htm;
# 这里192.168.169.139和whiteIp.conf中的都能够是白名单;如果是这些IP,geo返回的都是0,0在map中对应的值为"",所以上方的limit_req_zone和limit_conn_zone中设置的$limit_ip对应的值就是"",限度等性能无用,就实现了白名单性能了。
}
}
}
3.3 rewrite模块(ngx_http_rewrite_module)
rewrite
的次要性能是实现URL地址的重定向。Nginx
的rewrite
性能须要PCRE软件的反对,即通过perl兼容正则表达式语句进行规定匹配的。默认参数编译nginx
就会反对rewrite
的模块,然而也必须要PCRE的反对。
应用场景:
1、能够调整用户浏览的URL,看起来更标准,合乎开发及产品人员的需要。
2、为了让搜索引擎搜录网站内容及用户体验更好,企业会将动静URL地址伪装成动态地址提供服务。
3、网址换新域名后,让旧的拜访跳转到新的域名上。例如,拜访京东的360buy.com会跳转到jd.com
4、依据非凡变量、目录、客户端的信息进行URL调整等。
3.3.1 if指令
# 语法:if(condition){…}
# 上下文:server,location
# 该指令用于查看一个条件是否合乎,如果条件合乎,则执行大括号内的语句。if指令不反对嵌套,不反对多个条件&&和||解决。
# 其中,condition中能够蕴含的判断标识如下
# ~为辨别大小写匹配
# ~*为不辨别大小写匹配
# -f和!-f用来判断是否存在文件
# -d和!-d用来判断是否存在目录
# -e和!-e用来判断是否存在文件或目录
# -x和!-x用来判断文件是否可执行
if ($http_user_agent~*(mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
rewrite ^(.*) http://peter.23673.com$1 permanent;
}
3.3.2 return指令
# 语法:return code [text]
# return code URL;
# return URL;
# 上下文:server,location,if
# 该指令用于完结规定的执行并返回状态吗给客户端。
# 状态码包含:
# 204(No Content)、
# 400(Bad Request)、402(PaymentRequired)、403(Forbidden)、404(Not Found)、405(Method Not Allowed)、406(Not Acceptable)、408(Request Timeout)、410(Gone)、411(Length Required)、413(Request Entity Too Large)、416(Requested Range Not Satisfiable)、
# 500(Internal Server Error)、501(Not Implemented)、502(Bad Gateway)、503(Service Unavailable)和504(Gateway Timeout)。
# 例如,示例,如果拜访的URL以.sh .bash 结尾,返回状态码403
location ~ .*\.(sh|bash)?$ {
return 403;
}
3.3.3 Rewrite语法
# 语法:rewrite regex replacement [flag];
# 默认值:—
# 上下文:server, location, if
# rewrite是实现URL重写的要害指令,依据regex(正则表达式)局部内容,重定向到replacement,结尾是flag标记。
# 正则:perl兼容正则表达式语句进行规定匹配
# 代替内容:将正则匹配的内容替换成replacement
# flag标记:rewrite反对的flag标记[last...]
3.3.4 last、break、redirect、permane标记阐明
last
# 本条规定匹配实现后,持续向下匹配新的location URI规定。
# 完结以后的申请解决,用替换后的URI从新匹配location;
# 可了解为重写(rewrite)后,发动了一个新申请,进入server模块,匹配locaton;
# 如果从新匹配循环的次数超过10次,nginx会返回500谬误;
break
# 本条规定匹配实现即终止,不再匹配前面的任何规定
# 完结以后的申请解决,应用以后资源,不在执行location里余下的语句
redirect
# 返回302长期重定向,浏览器地址会显示跳转后的URL地址。
permane
返回301永恒重定向, 地址栏显示重定向后的url,爬虫更新url
4 图形化压测工具:jmeter在nginx中应用
4.1 下载安装
这个工具是须要jdk 1.8 以上。
自行百度下载。
下载后双击 apache-jmeter-5.3binjmeter.bat 即可运行
4.2 实现相似ab这种性能
测试计划->right click ->add ->线程(用户)->线程组
线程组->right click ->add ->取样器->http申请
http申请->right click ->add->监听器->查看后果树
http申请->HTTP申请栏目中填写门路(http://xxxx)
线程组->线程属性下->线程数填写(示意几个客户端发动申请)和Ramp-Up填写(0示意并发)
查看后果树->点击上方”三角形“启动
发表回复