资讯专栏INFORMATION COLUMN

Nginx日常应用

IT那活儿 / 3354人阅读
Nginx日常应用
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

Nginx简介


1. 什么是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采用异常非阻塞方式处理请求(高并发的关键);
  • 模块静态编译。
Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,不需要加锁,所以省掉了锁带来的开销, 但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使处理千上万个请求。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker.上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

模块化

1. 模块化体系结构
  • 核心+扩展;
  • KISS(Keep it simple,stupid);
  • 更好的扩展性。

2. 模块分类

  • event module---独立于 OS的时间处理机制的框架,及提供了各具体事件处理;
  • phase handler---handler模块,负责处理客户端请求并产生待响应内容;
  • output filter---filter模块,负责对输出的内容进行处理;
  • upstream---实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端;
  • load-balancer---负载均衡模块。

模块化安装

1. 编译安装
./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支持。

配置文件

1. Main模块
#user  cmpweb;
worker_processes  4; #worker进程的数量,每个worker都可以并发处理多个请求,与CPU核数一致即可发挥最大性能。
worker_cpu_affinity 00000001 00000010 00000100 00001000; #该参数表示开启四个进程(默认没有开启),每个进程对应每一个CPU内核,以充分利用多核CPU资源。
#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每个进程的最大连接数,即接收前端的最大请求数
}
3. http模块
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; #开启文件压缩,大幅提高页面加载速度
}
4. server模块

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字段统计分析

2. upstream_status字段统计分析
分析方法:
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
结论:
10.113.158.216/217两台服务器上的api存在大量主动断连现场,经排查nginx认为是不安全的连接,主动拒绝了客户端的连接;配置参数 proxy_ignore_client_abort on;让代理服务端不主动关闭客户端连接。
3. upstream_addr字段统计(后端服务访问量)
根据访问趋势图,重点保障业务高峰期资源使用状态,提前有效防范故障发生。
4. request_time字段统计(后端服务请求时间)
根据请求趋势图,及时处理后端超时服务。

本文作者:高智飞(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129338.html

相关文章

  • Docker构建程序员的日常

    摘要:前言抛开那些强大的功能,今天我们来部署下本地的开发环境。提升开发效率和质量是每位程序员必备的技能。这并不是一个非常认真的操作,请勿使用到生产环境。 showImg(https://segmentfault.com/img/bVbg72t?w=800&h=528); 前言 抛开Docker那些强大的功能,今天我们来部署下本地的开发环境。并写上几个脚本来提高开发效率。 本章以MacOs系统...

    RyanQ 评论0 收藏0
  • Docker构建程序员的日常

    摘要:前言抛开那些强大的功能,今天我们来部署下本地的开发环境。提升开发效率和质量是每位程序员必备的技能。这并不是一个非常认真的操作,请勿使用到生产环境。 showImg(https://segmentfault.com/img/bVbg72t?w=800&h=528); 前言 抛开Docker那些强大的功能,今天我们来部署下本地的开发环境。并写上几个脚本来提高开发效率。 本章以MacOs系统...

    zorpan 评论0 收藏0
  • 日常使用指令总结

    摘要:各种日常命令一点一点学习总结生成中选出一列里不重复的值列名表名后台执行一个脚本,并且写到文件中在配置的路由规则,的配置查看状态打包为全系统设定为单用户设定下,略有不同 各种日常命令一点一点学习总结 Git生成KEY ssh-keygen -t rsa -C youremail@example.com MySQL中选出一列里不重复的值 SELECT DISTINCT 列名 FROM...

    CoderStudy 评论0 收藏0
  • 日常使用指令总结

    摘要:各种日常命令一点一点学习总结生成中选出一列里不重复的值列名表名后台执行一个脚本,并且写到文件中在配置的路由规则,的配置查看状态打包为全系统设定为单用户设定下,略有不同 各种日常命令一点一点学习总结 Git生成KEY ssh-keygen -t rsa -C youremail@example.com MySQL中选出一列里不重复的值 SELECT DISTINCT 列名 FROM...

    darryrzhong 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<