zoukankan      html  css  js  c++  java
  • nginx 优化

    a. nginx安装

       参考: https://www.cnblogs.com/hcl1991/p/6270964.html

    b. 修改nginx.conf 配置文件

    #user  nobody;          # 运行用户
    worker_processes  2;    # 通常配置成cpu的总核数, 或者其2倍, 性能会更好, 可以减少进程间切换带来的消耗。
    
    pid  /var/run/nginx/nginx.pid;    # 进程id的存储位置
    worker_rlimit_nofile 65535;     # 一个nginx进程打开的最多的文件数目,设置为最大65535。
    
    # 工作模式及连接数上限
    events {
        use epoll;                  # nginx工作模式,epoll是linux平台下的高效模式
        worker_connections  65535;    # 单个后台worker process进程的最大并发链接数
    }
    
    # 设定http服务器
    http {
        
        include  mime.types;                        # 主模块指令, 实现对配置文件所包含的文件设定
        default_type  application/octet-stream;     # http核心模块指令,这里默认类型为二进制流,浏览器下载文件,避免直接打开
        
        charset  utf-8;
       
        server_names_hash_bucket_size  128;     # 服务器名字的hash表大小
        proxy_headers_hash_max_size 51200;   # 设置头部哈希表的最大值,不能小于你后端服务器设置的头部总数
        proxy_headers_hash_bucket_size 6400; # 设置头部哈希表大小
        client_header_buffer_size  32k;      # 用于指定来自客户端请求头headerbuffer大小
        client_header_timeout 3m;            # 设置客户端请求读取超时时间,如果超时,nginx将返回“request time out (408)”错误。
        client_body_timeout 3m;              # 设置客户端请求主体读取超时时间,默认值为60.如果超时,nginx将返回“Request time out(408)”
        client_max_body_size 365m;           # 上传文件大小
        large_client_header_buffers 4 32k;     # 指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
        
        autoindex  on;         # 开启目录列表访问,合适下载服务器,默认关闭。
        sendfile  on;        # 开启高效文件传输模式,将tcp_nopush和tcp_nodely两个指令设置为on,用于防止网络阻塞。
        #tcp_nopush  on;    # 防止网络阻塞
        #tcp_nodely  on;    # 防止网络阻塞
    
        keepalive_timeout  65;    # 用于设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。
        server_tokens   off;        # 修改或隐藏Nginx的版本号
    
    
        # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
        fastcgi_connect_timeout 300;  # 指定连接到后端fastCGI的超时时间
        fastcgi_send_timeout 300;     # 向fastCGI请求的超时时间,这个值是指已经完成两次握手后向fastCGI传送的超时时间
        fastcgi_read_timeout 300;     # 接收fastCGI应答的超时时间,这个值已经完成两次握手后接收fastCGI应答的超时时间
        fastcgi_buffer_size 64k;      # 指定读取fastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,一般设置为64k
        fastcgi_buffers 4 64k;        # 指定本地需要用多少和多大的缓冲区来缓冲fastCGI的应答
        fastcgi_busy_buffers_size 128k;     # 默认值是fastcgi_buffers的两倍
        fastcgi_temp_file_write_size 128k;  # 在写入fastcgi_temp_path是用多大的数据块,默认值是fastcgi_buffers两倍
        
        
        client_body_buffer_size 128k; # 客户端请求主体缓存区大小
        proxy_connect_timeout 120;    # 与后端服务器连接的超时时间
        proxy_send_timeout  120;      # 后端服务器的数据回传时间120s,120s内未传回,nginx将断开连接
        proxy_read_timeout  120;      # nginx从代理的后端服务器获取信息的时间120s
        proxy_buffer_size 64k;        # 缓冲区大小默认等于proxy_buffers设置的大小
        proxy_buffers 4 32k;          # 设置缓冲区的数量和大小
        proxy_busy_buffers_size 64k;     # 设置系统很忙时可以使用的proxy_buffers的大小,官方推荐位proxy_buffersX2
        proxy_temp_file_write_size 64k;  # 指定proxy缓存临时文件的大小
    
           
        # gzip模块设置
        gzip  on;  # 开启gzip压缩
        gzip_min_length 1k;     # 允许压缩的最小字节数,页面字节数从header头的content-length中获取,默认值是0
        gzip_buffers 4 16k;     # 申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
        gzip_http_version 1.1;  # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
        gzip_comp_level  2;     # 压缩等级,1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
        gzip_vary  on;          # 选项可让前端的缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。
        gzip_types text/plain application/x-javascript text/css application/xml;  # 压缩类型,默认就已经包含text/html
        #limit_zone crawler $binary_remote_addr 10m;  # 开启限制IP连接数的时候需要使用
    
    
        # nginx日志的默认输出格式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" '
                          '$request_time';  #加入request_time, 统计传输时间
    
        log_format access '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent"' ;
    
        # 自定义日志输出位置
        access_log /data/logs/nginx/access.log main;
        error_log /data/logs/nginx/error.log;    
    
        #简单的节点配置(当这些API都用到同一个Backend时,代码中的proxy_set_header传递的host就起到了关键性作用)
        upstream online {
           #ip_hash;  # 每个请求按访问ip的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决动态网页存在的session共享问题
           server 127.0.0.1:8080 weight=1;
           #server 127.0.0.1:8081 weight=1;
        }
        
        
        # 不同路径映射到不同项目上
        server {
           listen 80;
           server_name www.test.com;
    
           # jenkins访问路径
           location /jenkins {
               proxy_pass      http://127.0.0.1:8090/jenkins;
           }
           
           # nexus私服访问路径
           location /nexus {
               proxy_pass      http://127.0.0.1:8088/nexus;
           }
    
        }
        
        
        # online域名映射
        server {
           listen 80;
           server_name www.test.com;
           
           # 项目名访问
            location /dofun-console {
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                #Web服务器可以通过X-Forwarded-For获取用户真实IP
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                #以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上
    
                proxy_pass http://127.0.0.1:8080/dofun-console;
    
                #proxy_redirect 不加 出现js.css访问404错误, 这里意思是 
                #http://$hots(127.0.0.1):$server_port(80) 替换 http://127.0.0.1:8080 这样js,css就能访问了
                proxy_redirect http://127.0.0.1:8080 http://$host:$server_port;
            }
    
    
        }
        
    
        # goaccess 日志分析
        server {
            listen       83;
            server_name  127.0.0.1;
    
            location / {
                root   html;
                index  report.html;
            }
        }
    
    
        # 81端口监控用于图片下载  
        server {
           listen 82;
           server_name  localhost;
           root   /;      
     
           location / {
               #如果是图片就下载文件
               if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
                   add_header Content-Disposition: 'attachment;';
               }
           }
        }
    }
    
    

    c. 命令行分析nginx日志

    # nginx 默认日志格式
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                                 '$status $body_bytes_sent "$http_referer" '
                                 '"$http_user_agent" "$http_x_forwarded_for"';  

    $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.it300.com 192.168.100.100
    $status        HTTP请求状态 200
    $upstream_status   upstream状态 200
    $body_bytes_sent   发送给客户端文件内容大小 1547
    $http_referer url  跳转来源 https://www.baidu.com/
    $http_user_agent   用户终端浏览器信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
    $ssl_protocol      SSL协议版本 TLSv1
    $ssl_cipher        交换数据中的算法 RC4-SHA
    $upstream_addr     后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
    $request_time      整个请求的总时间 0.205
    $upstream_response_time 请求过程中,upstream响应时间 0.002

    # 统计独立IP访问量
        awk '{print $1}' access.log | sort -n | uniq | wc -l
    
    # 查看某一时间段IP访问量(4-5点)
        grep "09/May/2019:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l
    
    # 查看访问最频繁的前100 IP
        awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100
    
    # 查看访问100次以上的IP
        awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
    
    # 查询某个IP的详细访问情况,按访问频率排序
        grep '127.0.01' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100
    
    
    # 统计每秒的请求数,top100的时间点(精确到秒)
        awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100
    
    #  统计每分钟的请求数,top100的时间点(精确到分钟)  
        awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100         
    
    # 统计每小时的请求数,top100的时间点(精确到小时)
        awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100
    
    在nginx log中最后一个字段加入$request_time
    # 列出传输时间超过 3 秒的页面,显示前20条
        cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

    d. nginx 日志分析工具goaccess

       参考: https://www.cnblogs.com/hcl1991/p/10634711.html

    参考:

      百万并发下的nginx优化之道: https://baijiahao.baidu.com/s?id=1615824183355202778&wfr=spider&for=pc

      nginx log日志统计分析常用命令: https://www.cnblogs.com/gouge/p/7089939.html

      nginx location路径匹配问题: https://betakoli.iteye.com/blog/2431428

      nignx 的log_format用法梳理: https://www.cnblogs.com/kevingrace/p/5893499.html

      nginx 错误日志与优化专题: https://www.cnblogs.com/tinywan/p/6777592.html

      阿里云日志服务nginx: https://yq.aliyun.com/articles/365307

           nginx 响应超时 : https://blog.csdn.net/u014218983/article/details/81217032#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95

  • 相关阅读:
    ACM-ICPC 2018 南京赛区网络预赛
    我们
    2018 Multi-University Training Contest 7
    ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)
    BZOJ1834 [ZJOI2010] network 网络扩容
    BZOJ4415 [SHOI2013] 发牌
    BZOJ1257 [CQOI2007] 余数之和sum
    BZOJ3110 [ZJOI2013] K大数查询(加强数据)
    BZOJ1406 [AHOI2007] 密码箱
    BZOJ3110 [ZJOI2013] K大数查询
  • 原文地址:https://www.cnblogs.com/hcl1991/p/10838912.html
Copyright © 2011-2022 走看看