nginx
一、基础
Nginx是一个高性能的HTTP和反向代理服务器
除了可以做反向代理还可以web容器直接处理请求。
1.安装
删除yum安装的文件,比如nginx
rpm -e `rpm -qa | grep nginx` --nodeps
提前安装一些依赖,依赖一般是:xxx-devel
yum -y install pcre-devel openssl-devel
上传至服务器
解压:tar -zxvf nginx-1.16.1.tar.gz
添加nginx用户,默认会添加一个同名的用户组(也可以不添加)useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
如果要ssl模块:./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
看到配置,表示configure成功
此时,/usr/local/下还没有nginx
解压目录新增
make的时候,都在执行的objs/Makefile文件里面的命令
执行编译和安装:make && make install
最好分开执行,方便看是否成功
make,下面表示make成功
此时,/usr/local/下还没有nginx
安装,make install,其实是创建目录、复制文件
添加软连接
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
,也可以软连接到/sbin下
ll /usr/sbin/ |grep nginx
nginx -v
启动
./nginx
ps -ef |grep nginx
2.特点
①支持高并发(单台nginx支持上万个并发)
②内存消耗小、
③处理静态文件效率高
④nginx是多进程单线程工作模式,一个进程下面一个线程
3.应用
反向代理、负载均衡(nginx+tomcat)、规则过滤(运维)、静态资源服务器(图片服务器)、自动化测试(放测试报告)
二、目录结构
Nginx http功能模块 模块说明
Ngx_http_core_module 包括一些核心的http参数配置,对应Nginx的配合为HTTP区块部分
Ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问
Ngx_http_gzip_module 压缩模块,对Nginx返回的数据压缩,属于性能优化模块
Ngx_http_fastcgi_module FastCGI模块,和动态应用相关的模块,例如PHP
Ngx_http_proxy_module Proxy 代理模块
Ngx_http_upstream_module 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
Ngx_http_rewrite_module URL地址重写模块
Ngx_http_limit_conn_module 限制用户并发连接数及请求数模块
Ngx_http_limit_req_module 根据定义的key限制Nginx请求过程的速率
Ngx_http_log_module 访问日志模块,以指定的格式记录Nginx客户访问日志等信息
Ngx_http_auth_basic_module web认证模块,设置web用户通过账号,密码访问Nginx
Ngx_http_ssl_module ssl模块,用于加密的http连接如https
Ngx_http_stub_status_module 记录Nginx基本访问状态信息等的模块
logs、conf、html、sbin
1)logs:日志
查看日志可以通过access.log文件进行查看
2)conf:配置文件
放配置文件的目录
主配置文件是nginx.conf
可以设置nginx的系统用户
worker_processes,工作进程的数量,可以根据cpu核数进行设置
user nobody;用户
全局配置:worker_processes,工作进程的数量,一般cpu核数,用多少使用多少,避免资源竞争
错误日志:
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
nginx服务启动的进程
#pid logs/nginx.pid;
可以看一下
nginx默认端口是80
66973通过端口·进程号看也是66973
events里有一个worker_connections
worker_connections,每个进程最大处理的连接数,默认是1024
HTTP配置:
include支持的媒体类型
mime.types是一个文件
mime.types;和conf同级下有一个这个文件
default_type默认的类型application/octet-stream;、二进制流
打开看一下
less mime.types
里面罗列出来了支持的类型
负载均衡配置
log_format日志格式
日志配置
access_log logs/access.log main(是指定日志格式)日志文件 路径 格式
main对应的是上面的og_format 的main
'$remote_addr远程IP地址
- $remote_user 客户端用户
- [$ time_local] “$ drequest” 请求的方法、url、http协议之类的
'$ status返回http状态码
$ body_bytes_sent发送给客户端的大小
“$ http_referer” 记录请求是从哪儿来的,从哪个页面过来的
‘“$ http_user_agent” 记录客户端浏览器的信息
“$ http_x_forwarded_for”’;
'$ request_time:$ upstream_response_time 监控时间,时间拆解会用到
'$ request_time整个请求时间,
$ upstream_response_time 请求时$upstream的响应时间
keepalive_timeout连接超时时间,默认65s
gzip是否开启gzip压缩,开启压缩网络占用带宽更小。
**server
这里面指定了监听端口,默认是80
之前讲linux调优时,tcp的全连接队列依赖应用的一个参数bank在这一行
tomcat的host类似于nginx的server,location和tomcat中的context类似**
server_name服务器域名
**location /**网站根目录配置
root html网站根目录
可以来看一下
如果nginx没有配置代理,默认访问的是index.html,即就是默认首页
而errorpage发生错误的时候,返回的页面就是50x.html
连接队列相关,若是nginx的话,要去配置他的 backlog=1024;
3)html:默认虚拟主机目录
50x.html 若发生错误时,就会返回错误页面。
4)sbin:可以执行文件
只有一个可执行文件
如果要启动或停止nginx,就需要用到此执行文件
三、常用命令
①查看版本nginx -v
②查看编译参数nginx -V
③帮助nginx -h
④查看进程netstat -lntp | grep 80
⑤启动./nginx
⑥停止nginx -s stop
send signal to a master process: stop, quit, reopen, reload
⑦平滑重启ginx -s reload
必须是启动的状态下执行
⑧nginx -t 改完看是否有问题,有问题继续改配置文件
改配置文件记得备份,改完需要测试配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
nginx -t -c xxxx 可以指定配置文件,默认就是conf/nginx.conf
-c filename : set configuration file (default: conf/nginx.conf)
四、负载均衡(重要)
负载均衡是nginx比较重要功能
1、负载均衡策略
1)轮询(默认的负载均衡策略)
适合服务器配置相近的情况下使用
请求轮流转发到配置的server上
此处配置了两个
可以配置多个,此处配置的是两个,请求就会轮流转发到配置的server上,一个是182上,一个是183上
②轮询配置
第一步:配置upstream**
在nginx.conf配置文件http{}里新增upstream 自定义服务名称
注意:自定义名称要与第二步中server中location /{ }配置的proxy_pass的自定义名称要一样
upstream 自定义名称{
server IP:port;
server IP:port;
}
意思是两台服务器端口,发请求时轮询发到这两服务器上。
第二步:进行引用**
在server{}中添加location,并且配置proxy_pass()
location /{
proxy_pass http://自定义名称
}
2)权重
如果是轮巡,权重是一样的,都是为1
权重的应用场景是后端服务器配置不同,性能就不同。可以把服务器性能好的服务器权重设置的大一点。
设置方式是后面加上weight,指定一下权重
应用场景:有多台服务,服务器配置不一样,有的服务器配置好,有的服务器差,配置好的服务器的权重设置大一点,这样获得请求更多一点
A.设置权重:
upstream 自定义名称{
server IP:port weight=x;
server IP:port weight=x;
}
weight=1—9
B.引用
自定义名称要与server中location /配置的proxy_pass的自定义名称要一样
location /{
root html;
index index.html index.htm;
proxy_pass http://自定义名称
}
3)hash
hash分为两种:url_hash、ip_hash
①url_hash
会按照访问的url的hash结果来分配请求到不同服务器上,某一个url定向到一个固定的后端服务器上。
hash $request_url;
会按照访问的url做一次hash将结果来把请求转发到对应的服务器上,根据hash来进行分配。
A、配置:在刚才轮询配置的地方第一行加上hash $request_url;
upstream 自定义名称{
hash $request_url;
server IP:port;
server IP:port;
}
B.引用
自定义名称要与server中location /配置的proxy_pass的自定义名称要一样
location /{
root html;
index index.html index.htm;
proxy_pass http://自定义名称
}
②ip_hash
ip是客户端的ip
会固定访问后端固定的服务器,可以解决session共享问题,访问的服务器挂了就访问不了
两种配置也给出了示例
应用场景:用户访问的服务器是固定的。
做了一个ip的绑定,某个用户是固定,可以解决session共享问题,缺点是访问的服务器挂了就访问不了
upstream 自定义名称{
server .200:860;
server .200.861;
ip hash;
}
4)fair
哪个服务器响应时间短,优先分配他,需要依赖额外模块。
这个链接有安装和使用说明
https://github.com/gnosek/nginx-upstream-fair
按响应时间分配
依赖其他模块:配置时就需要加上,如果要ssl模块:
./configure–with-http_ssl_module–add-moudle-/absolute/path/to/nginx-upstream-fair
https://github.com/gnosek/nginx-upstream-fair
make
make install
upstream mongrel{
fail;
sever 127.0.0.1:5000;
sever 127.0.0.1:5001;
sever 127.0.0.1:5002;
}
响应时间短的请求就分配多一点
2、负载均衡环境:nginx + 2tomcat
https://www.cnblogs.com/uncleyong/p/10751372.html
五、监控
1、通过stub_status模块(很少用这种方式)
1)安装
在安装config时需要加上,–with-http_stub_status_module
进入到/myfile/nginx-1.16.1
./configure --prefix=usr/local/nginx --with-http_stub_status_module
make
要把objs下的可执行文件nginx放到usr/local下的sbin目录下
cp nginx /usr/local/nginx/sbin
2)配置
vim /usr/local/nginx/conf/nginx.conf
在配置文件里先建一个location,加上最后要查看的监控路径。
location /nginx_status {
stub_status on;
access_log off;
}
nginx -t
启动
nginx
查看服务 netstat -lntp |grep 80
curl 127.0.0.1/nginx_status
3)访问
http://ip/nginx_status
不能访问,加一个配置 allow 0.0.0.0;
4)结果
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
5)含义
2、通过prometheus(重要)
2.1、安装第一个:nginx-module-vts
步骤一:下载
步骤二:配置
若已安装Nginx,添加模块
①配置./configure --prefix=usr/local/nginx --user=nginx --add-module=/myfile/nginx-module-vts(正确)**
错误的./configure --prefix=usr/local/nginx --user=nginx --add-module=/root/tools/nginx-module-vts
②make编译
执行make导致的错误make: *** No rule to make target build', needed by
default’. Stop.
发现安装了依赖也没解决,退回到上一步./configure --prefix=usr/local/nginx --user=nginx --add-module=/root/tools/nginx-module-vts的命令,首先自己没有这个目录,于是改成了 ./configure --prefix=usr/local/nginx --user=nginx --add-module=/myfile/nginx-module-vts
但是还是错,终于发现有错误信息./configure: error: no /myfile/nginx-module-vts/config was found,
因为我没有将nginx-module-vts放到对应目录下,将nginx-module-vts放到myfile目录解决
③复制nginx文件
cp objs/nginx /usr/local/nginx/sbin/
(前提是需要把nginx服务停掉)
提示是否覆盖,y,回车
步骤三:修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
①http中(server上面)添加
vhost_traffic_status_zone;
②server中添加
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
步骤四:.测试配置文件
nginx -t
出现的错误:
nginx: [emerg] unknown directive "vhost_traffic_status_zone" in /usr/local/nginx/conf/nginx.conf:34
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
暂未解决
问题分析:nginx -V
显示
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
安装依赖包
yum -y install gcc openssl openssl-devel pcre-devel zlib zlib-devel
步骤五:启动nginx
nginx
步骤六:访问
http://ip/status
2.2、 安装第二个:nginx-vts-exporter
步骤一:下载
步骤二:解压
tar -zxvf nginx-vts-exporter-0.9.1.linux-amd64.tar.gz -C /usr/local
步骤三:启动
nohup ./nginx-vts-exporter -nginx.scrape_uri http://ip/status/format/json &
步骤四:端口
9913
步骤五:访问
http://ip:9913/
展示了exporter收到的数据
可以搜索一下他的连接,如果这里有搜索结果的话,就代表安装成功
2.3、 安装第三个:prometheus
prometheus默认端口是9090
步骤一:配置
步骤二:启动
nohup ./prometheus --config.file=prometheus.yml &
步骤三:访问
http://ip:9090/
可以进行搜索connection
有数据表明安装成功
2.4、安装第四个:grafana
访问granafa
服务是已经启动好的
admin/admin
步骤一:添加模板2949
upstarm可以配置多个,此处只配置了一个
看一下展示的内容
3、指标说明
统计几种不同的连接数
server_connections(active、reading、writing、waiting)
active当前活动连接,包含等待
reading当前正在请求的连接
waiting当前正在响应客户端的连接数
writing当前空闲的连接数
统计各种状态的tps
server_requests
统计进出nginx的字节数
server_bytes
下面几个如果要有数据的话,需要配置负载均衡
配置upstream才会有数据
可以看到哪个负载均衡比较慢。
统计upstream的各个状态的qps
upstream requests
统计nginx的upstream的字节数
upstream bytes
后端server的响应时间
upstream backend response
也可以对响应时间做监控
4、日志监控
找到log_format
重点是后面两个参数,后面加的参数
request_time,整个请求总的时间单位是s,nginx从接收到用户的第一个字节到把响应返回给客户端这一段时间
upstream_response_time,可以理解为后端服务响应时间,是指nginx向后端,比如nginx转发请求给tomcat,,即就是nginx向tomcat建立连接开始到接收响应数据并关闭连接为止这一段时间
基础架构拆解时间就需要用到这两个参数
六、主要调优点
1、服务器内核优化
参考linux优化
2、gzip(配置文件中的)
①对数据进行压缩,压缩后节省带宽资源,
②提升传输效率。
③一般对html、css、js等进行压缩,视频图片不建议压缩.压缩时间比较长,同时会消耗cpu
④参数:
第一个:gzip_min_length(大小2k)
文件低于配置大小2k;不会压缩,大于等于这个2k就会进行压缩
第二个:zip_comp_level(压缩率、压缩级别,范围1-9)
数字越大,压缩率越大,耗费时间多,耗费cpu资源多,一般设置成中间值4或5
3、expire(缓存数据)
实现客户端的虚拟缓存数据
对图片、css、js更改几率比较小的可以设置浏览器本地缓存,可以提高用户访问速度,同时也可以节省带宽,要不然每次从服务端拉取静态资源,但是如果资源是频繁更新的,此处也用了缓存,就会影响用户的体验
不需要设置缓存场景:
那种频繁变更的内容、如果要做流量统计,统计一个文件访问多少次.若设置了,每次都到不了服务端,也统计不了.
场景:对改变很小的内容,可以设置浏览器的本地缓存(图片、css、js),提高用户的访问速度,第一次有缓存,第二次就很快,也是节省了服务端的带宽,每次来服务端拉资源(有的静态资源比较大,会造成带宽的瓶颈.
4、worker_processes
建议和cpu核数一致,可以和CPU核数一致,一般不会超过CPU核数的2倍,.,最多是CPU核数的两倍.即就是逻辑核数,通过top按1可以查看
5、worker_connections
每个work进程的连接数,单个进程的连接数,
一般设置比较大,设置上万以上,排队队列数,默认是1024,比如65535。
设置过少,请求会被拒绝;
nginx的最大并发连接数是worker_processesworker_connections的乘积,这台nginx的最大并发连接.
6、worker_rlimit_nofile
nginxj进程文件打开的文件数,调大一点,比如65535
7、sendfile
开启高效传输模式,默认on
8、事件处理模型
在linux下nginx一般使用 epoll,就是io多路复用模型。
在events区域下添加use epoll;
和worker_connections一个位置
9、keepalive_timeout
客户端访问nginx服务端的超时时间,根据实际情况调整
默认65s
10、keepalive_requests
开启http的长连接,可以减少握手次数。
相对于减少了tcp的拥塞,而且也可以通过减少并发连接数,来减低对服务器的资源消耗。
11.架构上
生产环境上nginx一般是多台,一般需要结合lvs或 实现高可用架构。
12、演示:
12.1、架构nginx+tomcat+MySQL
也就是nginx是需要配置负载均衡的,后面挂了两个tomcat,再加一个数据库
12.2、环境
①nginx(80)
第一点:nginx在180上
第二点:并且需要配置负载均衡
配置负载均衡182,186,端口是8096
第三点:nginx日志
(路径:logs/app)
在springboot已经做了配置
②应用(8096)
应用在182和183上
日志:/logs/app
③数据库
mysql(3306)在180上
建库:create database gifts charset utf8;
建表:SELECT COUNT(1) FROM gifts.users;
④监控
在180上
grafana(3000) + influxdb(8086)
⑤压力机
压力机用182
说明:各个技术栈的监控先不开启,定位到哪个服务有瓶颈后,再开对应的监控
要压测一个查询接口,这个接口会有性能瓶颈,所以按照之前的分析思路,先时间拆分,看一个服务耗时多
根据用户id查找用户
此处要实现拆分时间,对于nginx需要配置两个参数,一个是请求时间,一个是响应时间。
然后就是tomcat,如果springboot内置的tomcat,要在springboot的yml文件添加配置,patter处日志格式,%D和%F
检察服务
nginx(80)在180上
应用是在182和183上
182,183启动一下应用服务
监听端口都是8096
数据库在180上,端口3306
jmeter可视化监控也在180上
granafa是3000
influxdb是8086
jmeter监控打开
先调试脚本
首先直连一下182和183看是否能联通
先请求182上的
182这里会有日志文件
运行jmeter脚本,查询用户成功,同时打印了日志,传的id是456629
日志中传的是456629,对一下jmeter请求也是456629
证明182上没问题,切换到183上
启动服务就创建了日志文件,只是日志文件中还没有内容
,
同182验证方式一样
验证182183都可连通
之后通过nginx访问,通过nginx把请求转发到182或183上
用下面这个脚本调试
4个线程
负载均衡的策略就是轮巡,到时候把其中2个请求发到182上,另2个请求发到183上
看一下jmeter监控,配的是180
此处的请求ip是180,是通过nginx进行请求,nginx端口默认是80
不填也是80
请求一下,运行,4个请求,请求的都是180
请求响应结果,都是查询成功
看grafana,4个请求
再看182、183,
182上三个请求,183上一个请求
按理是轮巡,查看一下配置
重新发一下请求,6个线程
现在就是182和183是三个请求
脚本通了,就需要将脚本放到压力机上进行运行
先设置一下脚本的线程组
4个线程,每10s加一个,即40s,再让他持续运行60s,即就是100
禁用查看结果树
脚本传到182上
运行脚本
启动3个线程,tps才0.2
脚本运行结束,通过非gui执行脚本发现tps比较低,只有0.几
平均响应时间最大20多秒
看一下nginx统计的时间
过滤一下
脚本是放在182上跑的,所以nginx过滤客户端是182就可以,就记录了请求时间和响应时间
tomcat是在182上
记录了nginx转发过来的请求
这个183里的也是nginx转发过来的请求
先看jmeter这边
都是10多秒
nginx记录的时间也是10多秒
看tomcat里的,请求路径一样,182里找850071在nginx里也有
在nginx里请求时间和响应时间差不多
nginx记录的响应时间就包括tomcat以及mysql的
这里这个850071,也是20多秒,只比nginx记录的时间小一点
这里是哪里耗时多?
12.3、时间拆分
服务端的监控分析时基于nginx+tomcat+MySQL例子,微服务架构也是需要做时间拆解.
在压测时,针对各个技术栈,没必要开启整体监控以及深入监控,比较消耗资源…
在这个实例只需要看jmeter监控,
通过nginx\tomcat记录时间,判断是那一段慢,再针对是哪一段慢,再去针对慢的一段做深入监控分析.
根据服务端的时间拆解tomcat,一般需要看网络传输量是否大,若不大,没有网络阻塞就去关注mysql,mysql查询.慢查询开启,设置阈值(根据业务规定,100ms以内,设置好后,把mysql整体监控,也可以直接看是否有慢sql,一般就是慢sql,sql写的不合理,索引失效|mysql的一些配置.
通过时间拆解一般是拆解到数据库服务器\应用服务器.
对于一个项目中出现问题最多就是开发写的代码,sql语句
服务器上没有跑应用,资源是不高,
跑了mysql,若没有业务连接,资源也不会高,瓶颈开发写的代码,sql语句
其他技术栈redist\kafka\分布式集群提高应用的性能\实现高可用.
redis性能问题主要还是配置相关问题.
nginx负载均衡策略
反向代理、正向代理
https://www.cnblogs.com/Anker/p/6056540.html
https://cloud.tencent.com/developer/article/1418457
io模型:同步、异步、阻塞、非阻塞
https://zhuanlan.zhihu.com/p/386632638
nginx的优点?应用场景?