nginx
About 8 minlinuxnginx
日志分析
# 统计所有的PV数(页面浏览量)
cat access.log | wc -l
# 获取访问IP数
cat access.log | awk '{print $1}' | sort -k1 -r | uniq | wc -l
# 查看日志中访问次数最多的前10个IP
cat access.log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 sed -n '/2019:21:[0-9][0-9]:[0-9][0-9]/,/2019:22:[0-9][0-9]:[0-9][0-9]/p' access.log_2019-12-18 |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10
# 查看日志中访问次数超过1000次的前10个IP
cat access.log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{if($1>1000) print $0 }' | head -n 10
# 查看日志中访问url的次数
awk '{print $7}' access.log_2019-12-25|sort | uniq -c |sort -n -k 1 -r > test.txt
常用命令
# 重启nginx
./nginx -s reload
# 启动nginx
./nginx
# 关闭nginx
./nginx -s stop
# 查看nginx并发连接数
# TIME_WAIT表示处理完毕,等待超时结束的请求数 Linux默认的TIME_WAIT时长一般是60秒 TIME_WAIT数量较大时会出现访问很慢的情况,如网办
# CLOSE-WAIT: 等待从本地用户发来的连接中断请求
# SYN_SENT:应用已经开始,打开一个连接
# FIN_WAIT1:应用说它已经完成
# FIN_WAIT2:另一边已同意释放
# ESTABLISHED:表示正常数据传输状态 or 当前并发连接数
# SYN_RECV:表示正在等待处理的请求数
# LAST_ACK:等待所有分组死掉
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
nginx配置生成网站https://nginxconfig.io/
nginx.conf 配置详解
#nginx进程数
worker_processes 8;
# 0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推;worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit) 与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 655350;
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
error_log /home/log/nginx/nginx_error.log crit;
#单个进程最大连接数
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections实际我们填入一个65535,足够了,这些都算并发值
worker_connections 40960;
#告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
multi_accept on;
#最大连接数,默认为512
#worker_connections 1024;
}
#http服务器配置
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
#允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#防止网络阻塞
tcp_nopush on;
#防止网络阻塞
tcp_nodelay on;
#隐藏版本号
server_tokens off;
#设定服务器名称(即server_name指令所设置)哈希表的框大小,值越大能设置的server_name可以越多。参数哈希框大小总是等于哈希表的大小,即处理器高速缓存区(32)的倍数,这将加速处理器中key的搜索速度,减少内存的存取数。
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
#客户端请求头部的缓冲区大小
client_header_buffer_size 2k;
#设置客户端请求的Header头缓冲区大小,默认为4K。客户端请求行不能超过设置的第一个数,请求的Header头信息不能大于设置的第二个数,否则会报"Request URI too large"(414)或“Bad request”(400)错误。如果客户端的Cookie信息较大,则需增加缓冲区大小
large_client_header_buffers 4 4k;
#设置nginx允许接收的客户端请求内容的最大值,及客户端请求Header头信息中设置的Content-Lenth大最大值。如果超出该指令设置的最大值,nginx将返回“Request Entity Too Large”的错误信息(HTTP的413错误码)
client_max_body_size 500m;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后***缓存。
open_file_cache max=655350 inactive=20s;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
#设置nginx读取客户端请求Header头信息的超时时间,如果超过该指令设置的时间,nginx将返回"Requet time out"错误信息(HTTP的408错误码)
client_header_timeout 15s;
#设定nginx读取客户端请求内容的超时时间,如果超过该指令设置的时间,nginx将返回"Request time out"错误信息(HTTP状态码408)
client_body_timeout 15s;
#设置发送给客户端的应答超时时间。指两次tcp握手,还没有转为established状态的时间。如果这个时间,客户端没有响应,Nginx则关闭连接
send_timeout 60s;
#开启gzip压缩功能,对用户请求的页面进行压缩处理,以达到节省网络带宽,提高网站速度的作用。
gzip on;
#允许压缩的页面最小字节数。建议值为大于1024字节,小于1K的压缩可能无效果
gzip_min_length 1k;
#设置系统获取几个单位的缓存用于存储gzip压缩结果数据流。此设置为:按照原始数据大小以16K为单位的4倍大小申请内存空间。如果不设置的话,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩的结果。
gzip_buffers 4 16k;
#识别http协议的版本,只有1.1版本的压缩,因为可能早期的浏览器或http客户端可能不支持gzip压缩
gzip_http_version 1.0;
#设置压缩比,值为1-9,压缩比最大,处理速度会越慢
gzip_comp_level 2;
#指定需要被压缩的文件媒体类型
gzip_types text/plain text/javascript application/x-javascript application/json application/javascript text/css application/xml;
#gzip_vary的作用是在http响应中增加一行“Vary: Accept-Encoding”,目的是改变反向代理服务器的缓存策略,反向代理服务器会根据后端服务器是否带Vary头采用不同的缓存策略。
gzip_vary on;
#log日志配置
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#用来设置日志格式
access_log /home/log/nginx/access.log access;
#虚拟主机的配置
server {
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name test;
#rewrite ^ https://$http_host$request_uri? permanent;
# proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改
proxy_redirect off;
# 问产生405 503的时候给用户的返回状态是200,设置一个@405,在里边做对应的处理
error_page 405 503 =200 @405;
location @405{
root /opt/htdocs;
}
location / {
#禁止某个ip或者一个ip段访问.如果指定unix:,那将禁止socket的访问.注意:unix在1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
deny 127.0.0.1;
deny 127.0.0.2;
# 客户端主动断掉连接之后,Nginx 会等待后端处理完(或者超时),然后 记录 「后端的返回信息」 到日志。所以,如果后端 返回 200, 就记录 200 ;如果后端放回 5XX ,那么就记录 5XX 。
proxy_ignore_client_abort on;
# 代理转发
proxy_pass http://inspur;
# 定项目的根目录,适用与server和location。可以指定多个,如果locaiton没有指定,会往其外层的server或http中寻找继承。
root html;
# 在前后端分离的基础上,通过Nginx配置,指定网站初始页
index index.html index.htm;
# 允许重新定义或添加字段传递给代理服务器的请求头
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 客服端最大上传文件大小
client_max_body_size 100m;
}
}
#upstream负载均衡配置,配置路由到tomcat的服务地址以及权重
upstream test{
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
ip_hash;
# weight设置权重,多个服务器ip进行负载均衡分发
server 192.168.0.1:80 weight=5;
server 192.168.0.2:80 weight=10;
}
}