nginx常用功能和配置
nginx常用功能和配置
1、nginx常用功能和配置
1.1 限流
- limit_conn_zone(限制连接数,针对客户端,即单一ip限流)
- limit_req_zone(限制请求数,针对客户端,即单一ip限流)
- ngx_http_unpstream_module(推荐,针对后台,如:有两台服务器,服务器A最大可并发处理10W条请求,服务器B最大可并发处理5W条请求,这样当12W请求按照负载均衡规则应当被分配给服务器A时,nginx为了防止A挂掉,所以将另外的2W分配给B)
1.2 压力测试工具——Ab
1.2.1安装
yum install httpd-tools -y
1.2.2 测试
// 10个用户,向 http://www.test.com/ 并发发送1000条请求(总请求数=1000)
ab -c 10 -n 1000 http://www.test.com/
1.2.3 返回值
- Document Path:测试的页面路径
- Document Length:页面大小(byte)
- Concurrency Level:并发数量,即并发用户数
- Time taken for tests:测试耗费时长
- Complete requests:成功的请求数量
- Failed requests:请求失败的数量
- Write errors:错误数量
- Requests per second:每秒钟的请求数量、吞吐率
- Timer per request:每次请求所需时间、响应时间
1.3 limit_conn_zone
http {
# 将请求客户端的IP($binary_remote_addr)存放到perip区域,区域大小为10M,一个IP占用32Byte(32位系统)或64Byte(64位系统)左右
# perip是区域的名字,可自定义
limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
# 每个IP最大并发1条连接
# 该语句还可直接放置到http模块下,这样下属的server都应用该配置
# 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
limit_conn perip 1;
# 每个连接限速300 k/s
limit_rate 300k;
}
}
1.4 limit_req_zone
http {
# 将请求客户端的IP存放到perip区域,区域大小为10M,并限制同一IP地址的请求每秒钟只处理一次
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
server {
# 当有大量请求爆发时,可以缓存2条请求
# 设置了nodelay,缓存队列的请求会立即处理,若请求数 > rate+burst 时,立即返回503;如果没设置,则会按照rate排队等待处理
# 该语句还可直接放置到http模块下,这样下属的server都应用该配置
# 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
limit_req zone=perip burst=2 nodelay;
}
}
1.5 limit_req_zone
http {
# 将请求客户端的IP存放到perip区域,区域大小为10M,并限制同一IP地址的请求每秒钟只处理一次
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
server {
# 当有大量请求爆发时,可以缓存2条请求
# 设置了nodelay,缓存队列的请求会立即处理,若请求数 > rate+burst 时,立即返回503;如果没设置,则会按照rate排队等待处理
# 该语句还可直接放置到http模块下,这样下属的server都应用该配置
# 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
limit_req zone=perip burst=2 nodelay;
}
}
- 测试:ab -c 1 -n 3 http://localhost/
- 3个请求全部成功,因为正在处理的请求数1加上缓存数2,没超过限制
Server Software: nginx/1.18.0
Server Hostname: 192.168.159.128
Server Port: 80
Document Path: /
Document Length: 612 bytes
Concurrency Level: 1
Time taken for tests: 0.001 seconds
Complete requests: 3
Failed requests: 0
Total transferred: 2535 bytes
HTML transferred: 1836 bytes
Requests per second: 2439.02 [#/sec] (mean)
Time per request: 0.410 [ms] (mean)
Time per request: 0.410 [ms] (mean, across all concurrent requests)
Transfer rate: 2012.67 [Kbytes/sec] received
- 测试:ab -c 3 -n 4 http://localhost/
- 3个请求成功,1个请求失败,因为正在处理的请求数1加上缓存数2,另外1条请求失败
Server Software: nginx/1.18.0
Server Hostname: 192.168.159.128
Server Port: 80
Document Path: /
Document Length: 612 bytes
Concurrency Level: 1
Time taken for tests: 0.002 seconds
Complete requests: 4
Failed requests: 1
(Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Non-2xx responses: 1
Total transferred: 3223 bytes
HTML transferred: 2330 bytes
Requests per second: 2504.70 [#/sec] (mean)
Time per request: 0.399 [ms] (mean)
Time per request: 0.399 [ms] (mean, across all concurrent requests)
Transfer rate: 1970.86 [Kbytes/sec] received
1.5 ngx_http_upstream_module
upstream MyName {
server 192.168.0.1:8080 weight=1 max_conns=10;
server 192.168.0.2:8080 weight=1 max_conns=10;
}
2、安全配置
2.1 版本安全
- 隐藏HTTP Response消息头Server中的版本号
- 隐藏前:Server: nginx/1.18.0
- 隐藏后:Server: nginx
http {
server_tokens off;
}
2.2 IP安全
- 白名单配置(适用于授权IP较少的情况),可配置在http、server、location中
location / {
allow 192.168.1.1;
deny all;
}
- 黑名单配置(适用于授权IP较多的情况),可配置在http、server、location中
location / {
deny 192.168.1.1;
allow all;
}
2.3 文件安全
location /logs {
autoindex on;
root/opt/nginx/;
}
location ^logs~*\.(log|txt)$ {
add_header Content-Type text/plain;
root/opt/nginx/;
}
3、进程数、并发数、系统优化
3.1 配置nginx.conf,增加并发量
# 与CPU逻辑核心数一致
worker_processes 12;
events {
# 单个worker最大并发连接数
worker_connection 65535;
}
3.2 调整内核参数
- 查看所有的属性值
ulimit -a - 临时设置硬限制(重启后失效)
ulimit -Hn 100000 - 临时设置软限制(重启后失效)
ulimit -Sn 100000 - 持久化设置(重启后仍生效)
vim /etc/security/limits.conf
接下来是文件中需要配置的内容
* soft nofile 100000
* hard nofile 100000
用户/组 软/硬限制 需要限制的项目 限制的值
4、GZIP
- 作用:启用gzip后,服务器将响应报文进行压缩,有效地节约了带宽,提高了响应至客户端的速度。当然,压缩会消耗nginx所在电脑的cpu
- 配置范围:http、server、location
http {
# 启用gzip
gzip on;
# 允许压缩的最小字节数(即如果response header中的content-length小于该值,就不压缩)
gzip_min_length 2k;
# 按照原数据大小以16k为单位的4倍申请内存用作压缩缓存
gzip_buffers 4 16k;
# 压缩级别,级别越大,压缩率越高,占用CPU时间更长
gzip_comp_level 5;
# 需要被压缩的响应类型,默认值是text/html
gzip_types text/plain application/x-javascript text/css application/xml;
# 配置最低版本的http压缩协议(即1.0时,1.0和1.1都会启用压缩;1.1时,仅1.1时才会启用压缩)
gzip_http_version 1.0;
# IE6及以下禁用压缩
gzip_disable "MSIE [1-6]\.";
}
5、、状态监控
5.1 配置访问地址
location /nginxstatus {
stub_status on;
// 禁止将监控信息写入访问日志
access_log off;
}
5.2 安装插件并重启
cd /usr/local/src/nginx-1.18.0
# 如果不是使用的默认路径,使用 --prefix 指定
./configure --with-http_stub_status_module
make && make install
/usr/local/nginx/sbin/nginx -s quit
/usr/local/nginx/sbin/nginx
5.3 访问地址,状态参数如下
- Active connections:活跃的连接数量
- server accepts handled requests:处理的总连接数 创建的握手数 处理的总请求数
- reading:读取客户端的Header信息的次数。这个操作仅读取头部信息,完成后立即进入writing状态
- writing:响应数据传到客户端的Header信息次数。这个操作不仅读取头部,还要等待服务响应
- waiting:开启keep-alive后等候下一次请求指令的驻留连接
6、负载均衡
6.1 轮询
upstream myserver {
# 默认所有服务器权重为 1
server 192.168.250.220:8080;
server 192.168.250.221:8080;
server 192.168.250.222:8080;
}
6.2 加权轮询
- 性能更好的服务器权重应更高
upstream myserver {
server 192.168.250.220:8080 weight=3;
server 192.168.250.221:8080; # default weight=1
server 192.168.250.222:8080; # default weight=1
}
6.3 最少连接
upstream myserver {
least_conn;
# with default weight for all (weight=1)
server 192.168.250.220:8080;
server 192.168.250.221:8080;
server 192.168.250.222:8080;
}
6.4 加权最少连接
- 性能更好的服务器权重应更高
upstream myserver {
least_conn;
server 192.168.250.220:8080 weight=3;
server 192.168.250.221:8080; # default weight=1
server 192.168.250.222:8080; # default weight=1
}
6.5 IP Hash
- 算法:根据客户端ip进行Hash得到一个数值,然后使用该数值对服务器个数取模,得到的结果就是映射的服务器序号
- (在服务器个数不变的情况下)可保证同一ip地址的请求始终映射到同一台服务器,解决了session共享问题
upstream myserver {
ip_hash;
# with default weight for all (weight=1)
server 192.168.250.220:8080;
server 192.168.250.221:8080;
server 192.168.250.222:8080;
}
6.6 uri Hash
- (在服务器个数不变的情况下)可保证同一uri始终映射到同一台服务器
- nginx在1.7.2之后支持uri_hash
upstream myserver {
hash $request_uri;
# with default weight for all (weight=1)
server 192.168.250.220:8080;
server 192.168.250.221:8080;
server 192.168.250.222:8080;
}
7、access日志切割
7.1 新建Shell脚本
脚本文件路径随意
vim /usr/local/nginx/nginx_log.sh
- 将以下内容添加到脚本中
#! /bin/bash
# 设置日志文件存放目录(nginx安装目录为/usr/local/nginx)
LOG_HOME="/usr/local/nginx/logs"
# 备份Log名称
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log
# 重命名日志文件
mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BAK}.log
# 向nginx主进程发信号重新打开日志
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
7.2 创建crontab定时作业
crontab -e
- 将以下内容添加到作业中去(任取一个)
- corn表达式生成器:http://cron.qqe2.com/
# 以每分钟切割一次为例
*/1 * * * * sh /usr/local/nginx/nginx_log.sh
# 以每天切割一次为例
0 0 0 1/1 * ? sh /usr/local/nginx/nginx_log.sh
8、动静分离
- 概念:将动态请求和静态请求分开
- 实现方式:
- (推荐)将静态文件存放在专门的服务器上,使用单独的域名
- 另一种是将动态和静态文件放在一起,使用nginx区分
8.1 以实现方式1为例
- 前提:将静态文件存放在代理服务器中
- 在ngnix中创建文件目录(如/usr/local/nginx/static),将所有静态文件发布到该目录中
- 在nginx.conf http server 中配置动静分离
server {
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /usr/local/nginx/static;
# 缓存30天
expires 30d;
}
}
在实际的后台服务器中发布的程序中,使用静态文件时,路径指向设置为静态文件服务器(这里是代理服务器)。
nginx常用功能和配置的更多相关文章
- 5.8 Nginx 常用功能的配置
- Nginx常用功能配置二
Nginx常用功能配置二 Nginx location匹配设置 location作用:可以根据用户请求的URI来执行不同的应用,根据用户请求的网站的地址URL匹配. location语法: locat ...
- Nginx常用功能配置一
Nginx常用功能配置 参数include配置 说明:如果日常工作中server标签存在太多,可以采用include配置模式,Nginx的主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目 ...
- 3.Nginx常用功能介绍
Nginx常用功能介绍 Nginx反向代理应用实例 反向代理(Reverse Proxy)方式是指通过代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并且从内部网络服 ...
- Nginx常用功能
3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...
- nginx常用功能配置
一.规范优化nginx配置文件 nginx的主配置文件为nginx.conf,主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目录中,虚拟主机的配置文件按照网站的域名或功能取名,例如www ...
- 前端开发掌握nginx常用功能之rewrite
上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解,这也是nginx实现控制访问和反向代理的基础.掌握请求的匹配规则算是对nginx有了入门,但是这些往往还是不能满足 ...
- nginx常用命令和配置
1.常用命令 查看版本号: ./nginx -v 启动nginx:在/usr/local/nginx/sbin 目录下执行 ./nginx 关闭nginx:在/usr/local/nginx ...
- Swiper 常用功能及配置清单
内容来源于Swiper中文在线(http://www.swiper.com.cn/),由于Swiper功能强大,这里只将常用的功能列出来,方便开发. 这里统一使用Swiper最新版 4.0做为演示! ...
随机推荐
- 这一次,彻底理解XSS攻击
希望读完本文大家彻底理解XSS攻击,如果读完本文还不清楚,我请你吃饭慢慢告诉你~ 话不多说,我们进入正题. 一.简述 跨站脚本(Cross-site scripting,简称为:CSS, 但这会与层叠 ...
- json 与 ajax
json类似与js中的对象,但是json中不能有方法,json相当于python中的字典,但是json中的键值如果是字符串的话,需要加上双引号:ajax是一个前后台配合的技术,它可以让js发送http ...
- .NET C#中处理Url中文编码问题
近些日子在做一个用C#访问webservise的程序,由于需要传递中文参数去请求网站,所以碰到了中文编码问题.我们知道像百度这种搜索引擎中,当用户输入中文关键字后,它会把中文转码,以确保在Url中不会 ...
- 推荐系统实践 0x13 Word2Vec
Word2Vec是谷歌团队提出的,让词向量在自然语言处理当中再度流行,并且推广到了广告.搜索.推荐等各个领域当中.Word2Vec顾名思义,就是一个生成对词的向量表达的模型.假设我们使用一组句子组成的 ...
- 大数据量查询容易OOM?试试MySQL流式查询
一.前言 程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM). 其实在 MySQL 数据库中提供了流式查询,允许把符 ...
- 第八章节 BJROBOT hector 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
1.把小车平放在地板上,用资料里的虚拟机,打开一个终端 ssh 过去主控端启动roslaunch znjrobot bringup.launch. 2.在虚拟机端打开一个终端,ssh 过去主控端启动r ...
- 微信小程序 - bilibili模仿
今天真是个大坑,onLoad => 写成了OnLoad 程序一直没法执行, 晚上下班的时候,在微信的小程序中,this不可以直接访问data中的值,得this.data才能访问..
- Eclipse 使用svn时出现 “Previous operation has not finished; run 'cleanup' if it was interrupted“问题
在执行svn操作的时候出现了下面的问题 commit -m "" E:/eclipse/workplace/BRobotAPP/blockly/googleDemo/blockly ...
- 七、Elasticsearch+elasticsearch-head的安装+Kibana环境搭建+ik分词器安装
一.安装JDK1.8 二.安装ES 三个节点:master.slave01.slave02 1.这里下载的是elasticsearch-6.3.1.rpm版本包 https://www.elastic ...
- 测试如何区分前后端bug
当我们测试到前后端分离的项目时,可能就会想这个bug我到底应该指给谁,是前端的问题还是后端的呢,为了让自己更专业,分清前后端问题还是很重要的. 1.如图商品详情中显示[件装:1,中包装:2 ]但是在后 ...