zoukankan      html  css  js  c++  java
  • 架构师的成长之路初片~nginx优化篇

    1:开启对页面的压缩处理

    gzip on;                            //开启压缩
    gzip_min_length 1000;                //小文件不压缩
    gzip_comp_level 4;                //压缩比率
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
                                        //对特定文件压缩,类型参考mime.types

    2:服务器内存缓存

    http { 
    open_file_cache          max=2000  inactive=20s;
            open_file_cache_valid    60s;
            open_file_cache_min_uses 5;
            open_file_cache_errors   off;
    //设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
    //文件句柄的有效时间是60秒,60秒后过期
    //只有访问次数超过5次会被缓存
    } 

    3:通过location实现动静分离,一个location匹配动态,一个location匹配其他所有页面

    ###修改默认首页为index.php###

    location / {
                root   html;
                index  index.php index.html index.htm;
            }
    ...省略部分配置文件内容...
    location ~ .php$ {
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                include        fastcgi.conf;

    4:修改版本信息,并隐藏具体的版本号

    http{
         server_tokens off;                            #在http下面手动添加这么一行
         … …
    }

    5:限制并发量,降低DDOS的攻击,但需要提供一个模块:

    模块名: ngx_http_limit_req_module 

    http{
    … …
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
        server {
            listen 80;
            server_name localhost;
            limit_req zone=one burst=5;
                }
    }
    解释:
    1. #备注说明:
    2. #limit_req_zone语法格式如下:
    3. #limit_req_zone key zone=name:size rate=rate;
    4. #上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
    5. #1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
    6. #每秒中仅接受1个请求,多余的放入漏斗
    7. #漏斗超过5个则报错

    6:拒绝非法的请求:由于网站使用的是http协议,协议中定义了N中方法,可以放用户连接服务器,获取的资源。但实际应用中,常用到的只是get和post

    配置:

    http{
           server {
                     listen 80;
    #这里,!符号表示对正则取反,~符号是正则匹配符号
    #如果用户使用非GET或POST方法访问网站,则retrun返回错误信息
                  if ($request_method !~ ^(GET|POST)$ ) {
                         return 444;
                   }    
            }

    7:防止buffer溢出

      --当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。

      --如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)

     修改Nginx配置文件,调整各种BUFFER参数,可以有效降低溢出风险。

    http{
    client_body_buffer_size  1k;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
     … …
    }

    8:线程和ulimit的优化

    worker_processes 8;    nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
    worker_connections 65535;    这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
    修改ulimit
    echo ulimit -n 65535 >>/etc/profile
    source /etc/profile              #加载修改后的profile
    验证: ulimit -n    //如若显示65536,则表示修改成功



    ulimit -HSn 65536 #硬资源和软资源同时限制为最大打开文件描述符数65546 ulimit -v ulimited #将虚拟内存限制改为无限制
    ulimit命令
    -H 使用硬资源控制
    -S 使用软资源控制
    -a 查看所有的当前限制
    -n 能打开的最大文件描述符数
    -t 限制最大的 CPU 占用时间(每秒)
    -u 限制最大用户进程数
    -v 限制虚拟内存大小(kB

    优化官网有详细的解释:

    http://nginx.org/en/download.html

     ------------------------------------

    上面优化是工作中经常使用的优化手段,具体的参数可根据服务器具体情况来写相应的参数。

    内核优化,是借鉴下面链接,详细参数点击下方链接即可。 

    8:内核的优化(具体看服务器的状况来决定是否进行相应的优化)

    sysctl.conf文件

    https://blog.51cto.com/yangrong/1321594

    # 内核panic时,1秒后自动重启
    
    kernel.panic = 1
    
    
    
    # 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768
    
    kernel.pid_max = 32768
    
    
    
    # 内核所允许的最大共享内存段的大小(bytes)
    
    kernel.shmmax = 4294967296
    
    
    
    # 在任何给定时刻,系统上可以使用的共享内存的总量(pages)
    
    kernel.shmall = 1073741824
    
    
    
    # 设定程序core时生成的文件名格式
    
    kernel.core_pattern = core_%e
    
    
    
    # 当发生oom时,自动转换为panic
    
    vm.panic_on_oom = 1
    
    
    
    # 表示强制Linux VM最低保留多少空闲内存(Kbytes)
    
    vm.min_free_kbytes = 1048576
    
    
    
    # 该值高于100,则将导致内核倾向于回收directory和inode cache
    
    vm.vfs_cache_pressure = 250
    
    
    
    # 表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换
    
    vm.swappiness = 20
    
    
    
    # 仅用10%做为系统cache
    
    vm.dirty_ratio = 10
    
    
    
    # 增加系统文件描述符限制 2^20-1
    
    fs.file-max = 1048575
    
    
    
    # 网络层优化
    
    # listen()的默认参数,挂起请求的最大数量,默认128
    
    net.core.somaxconn = 1024
    
    
    
    # 增加Linux自动调整TCP缓冲区限制
    
    net.core.wmem_default = 8388608
    
    net.core.rmem_default = 8388608
    
    net.core.rmem_max = 16777216
    
    net.core.wmem_max = 16777216
    
    
    
    # 进入包的最大设备队列.默认是300
    
    net.core.netdev_max_backlog = 2000
    
    
    
    # 开启SYN洪水攻击保护
    
    net.ipv4.tcp_syncookies = 1
    
    
    
    # 开启并记录欺骗,源路由和重定向包
    
    net.ipv4.conf.all.log_martians = 1
    
    net.ipv4.conf.default.log_martians = 1
    
    
    
    # 处理无源路由的包
    
    net.ipv4.conf.all.accept_source_route = 0
    
    net.ipv4.conf.default.accept_source_route = 0
    
    
    
    # 开启反向路径过滤
    
    net.ipv4.conf.all.rp_filter = 1
    
    net.ipv4.conf.default.rp_filter = 1
    
    
    
    # 确保无人能修改路由表
    
    net.ipv4.conf.all.accept_redirects = 0
    
    net.ipv4.conf.default.accept_redirects = 0
    
    net.ipv4.conf.all.secure_redirects = 0
    
    net.ipv4.conf.default.secure_redirects = 0
    
    
    
    # 增加系统IP端口限制
    
    net.ipv4.ip_local_port_range = 9000 65533
    
    
    
    # TTL
    
    net.ipv4.ip_default_ttl = 64
    
    
    
    # 增加TCP最大缓冲区大小
    
    net.ipv4.tcp_rmem = 4096 87380 8388608
    
    net.ipv4.tcp_wmem = 4096 32768 8388608
    
    
    
    # Tcp自动窗口
    
    net.ipv4.tcp_window_scaling = 1
    
    
    
    # 进入SYN包的最大请求队列.默认1024
    
    net.ipv4.tcp_max_syn_backlog = 8192
    
    
    
    # 打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。 
    
    net.ipv4.tcp_tw_recycle = 1 
    
    net.ipv4.tcp_tw_reuse = 0  
    
    
    
    # 表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项
    
    net.ipv4.tcp_timestamps = 0
    
    
    
    # 表示本机向外发起TCP SYN连接超时重传的次数
    
    net.ipv4.tcp_syn_retries = 2
    
    net.ipv4.tcp_synack_retries = 2
    
    
    
    # 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。 
    
    net.ipv4.tcp_fin_timeout = 10  
    
    
    
    # 减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。 
    
    # 如果某个TCP连接在idle 300秒后,内核才发起probe.如果probe 2次(每次2秒)不成功,内核才彻底放弃,认为该连接已失效.
    
    net.ipv4.tcp_keepalive_time = 300 
    
    net.ipv4.tcp_keepalive_probes = 2
    
    net.ipv4.tcp_keepalive_intvl = 2
    
    
    
    # 系统所能处理不属于任何进程的TCP sockets最大数量
    
    net.ipv4.tcp_max_orphans = 262144
    
    
    
    # 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
    
    net.ipv4.tcp_max_tw_buckets = 20000 
    
    
    
    # arp_table的缓存限制优化
    
    net.ipv4.neigh.default.gc_thresh1 = 128
    
    net.ipv4.neigh.default.gc_thresh2 = 512
    
    net.ipv4.neigh.default.gc_thresh3 = 4096
  • 相关阅读:
    [转] 程序集和Dll的区别
    [转载] 节选自:2005年件我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训总结
    [分享]屏幕取色工具
    LINQ学习笔记
    XP系统 mscorsvw.exe进程 占CPU资源 开机加载网络连接很慢 解决方法
    [原创] ASP.NET中事件执行顺序
    CHARINDEX, INSTR
    [转载]如何为自己的网站设置二级域名?
    [转载] System.Threading.Timer类的TimerCallback 委托
    [转载]ASP.NET 2.0 页面事件执行顺序
  • 原文地址:https://www.cnblogs.com/ahaocloud/p/14823944.html
Copyright © 2011-2022 走看看