Nginx简介
一个高性能的HTTP和反向代理服务器;
一个IMAP/POP3/SMTP代理服务器;
由lgor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发;
源代码以类BSD许可证的形式发布;
以稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
2. 为什么选择Nginx
在高连接并发的情况下,Nginx是Apache服务器不错的替代品; Nginx作为负载均衡服务器; 作为邮件代理服务器; Nginx是一个安装非常的简单,配置文件非常简洁,Bug非常少的服务器。
市场份额

Nginx架构
一个master进程和多个worker进程; master进程用于管理worker进程; worker进程处理基本网络事件; worker进程是对等的,同等竞争来自客户端的请求; worker进程相互无影响,无需加锁,且崩溃后可以快速重启; Nginx采用异常非阻塞方式处理请求(高并发的关键); 模块静态编译。

每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
模块化
核心+扩展; KISS(Keep it simple,stupid); 更好的扩展性。
2. 模块分类
event module---独立于 OS的时间处理机制的框架,及提供了各具体事件处理; phase handler---handler模块,负责处理客户端请求并产生待响应内容; output filter---filter模块,负责对输出的内容进行处理; upstream---实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端; load-balancer---负载均衡模块。
模块化安装
./configure --prefix=/data/nginx --with-http_realip_module -
-with-http_sub_module --with-http_flv_module --with-
http_dav_module --with-http_gzip_static_module --with-
http_stub_status_module --with-http_addition_module --with-
http_ssl_module
2. 模块化
--with-http_realip_module 主要功能是在nginx访问日志中去除代理IP,显示客户的真实IP;一般用于统计客户地域,以及是否有流量攻击。 --with-http_sub_module 该模块是一个过滤器,通过将一个指定的字符串替换为另一个字符串来修改响应。
--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)。
--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)。
--with-http_gzip_static_module 在线实时压缩输出数据流。
--with-http_stub_status_module 用于日常nginx运行状态监控,如:当前活动连接数,请求、响应、空闲等连接数。
--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)。
--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)。
--with-ipv6 启用ipv6支持。
配置文件
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info
2. events 模块
Events {
use epoll; #Nginx事件驱动器模型:linux采用epoll类型, kqueue一般用于FreeBSD系统
worker_connections 8192; #Nginx每个进程的最大连接数,即接收前端的最大请求数
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #定义nginx能识别的网络资源类型,默认为text/plain
log_format main '$remote_addr|$remote_user|[$time_local]|"$request"|'
'$status|$body_bytes_sent|"$http_referer"|'
'"$http_user_agent"|"$http_x_forwarded_for"|'
‘$upstream_addr|$upstream_response_time|$request_time’; #设置输出日志格式,各参数之间采用竖线隔离,方便后期对日志检索,设置为main类型
access_log logs/access.log main; #采用main类型来记录access日志
server_tokens off; #隐藏nginx的版本信息
sendfile on; #开启高效文件传输模式
keepalive_timeout 65; # http连接超时时间,经观察文件上传一般在60s内完成
gzip on; #开启文件压缩,大幅提高页面加载速度
}
server {
listen 8003;
#虚拟主机IPV4服务端口
listen [::]:8003 ;
#虚拟主机IPV6服务端口
server_name 10.113.158.219;
#虚拟主机名称
server_name [2409:8062:0804::0:3:0:0066];
#虚拟主机对应IPV6名称
location iotportal {
#表示匹配访问的目录
proxy_buffer_size 256k;
#代理缓冲区大小
proxy_buffers 32 64k;
#代理缓冲区数量
proxy_busy_buffers_size 256k;
#同时传输到客户端的buffer数量
#避免写入磁盘
proxy_connect_timeout 120;
# nginx连接到后端服务器的连接超时时间
proxy_send_timeout 120;
#发送请求给upstream服务器的超时时间
proxy_read_timeout 240;
#从后端服务器读超时时间
proxy_pass http://iotportal;
#被代理服务器的地址,包含传输协议、主机名称或IP地址、端口号等要素
proxy_set_header Proxy-Client-IP
$remote_addr;
#代理服务器客户端地址
proxy_set_header Host
$host:$server_port;
#转发服务器地址及端口
}
location api {…….}
location dist {…….}
}
Log_format日志格式输出
$remote_addr 客户端地址 211.28.65.253
$remote_user 客户端用户名称 --
$time_local 访问时间和时区 18/Jul/2012:17:00:01 +0800
$request 请求的URI和HTTP协议 "GET article-10000.html HTTP/1.1"
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.wang.com 218.205.252.13
$status HTTP请求状态 200
$upstream_status upstream状态 200
$body_bytes_sent 发送给客户端文件内容大小 1547
$http_referer url跳转来源 http://218.205.252.13:8003/iotportal/frm/template/cs
s/template-iot.css
$http_user_agent 用户终端浏览器等信息
例如:浏览器、手机客户端等 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$http_x_forwarded_for 当前端有代理服务器时
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 218.205.252.13:8003
$request_time 整个请求的总时间 0.031
$upstream_response_time 请求过程中,upstream响应时间 0.035
access日志输出内容

日志分析
1. remote_addr字段统计分析

cat access.2020-10-27.log |grep -v "200" |awk -F '|' '{print $5,$10}' | sort | uniq -c |sort -n -r
分析结果:
48 499 10.113.158.216:28191
46 499 10.113.158.217:28191
6 404 10.113.158.217:28191
3 404 10.113.158.216:28191
2 500 10.113.158.216:28191
2 404 -
2 403 -
1
根据访问趋势图,重点保障业务高峰期资源使用状态,提前有效防范故障发生。

本文作者:高智飞(上海新炬王翦团队)
本文来源:“IT那活儿”公众号





