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

     

    1、编译安装过程优化

    在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginx的debug模式,编译完成后Nginx只有几百千字节,因此可以在编译之前,修改相关源码,取消debug模式,具体方法如下:
    在Nginx源码文件被解压后,找到源码目录下的auto/cc/gcc文件,修改如下几行

    1
    sed -i 's@CFLAGS="$CFLAGS -g"@#CFLAGS="$CFLAGS -g"@' auto/cc/gcc

    为特定的CPU指定CPU类型编译优化

    在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两个参数:

    1
    2
    --with-cc-opt='-O3'
    --with-cpu-opt=CPU  #为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

    要确定CPU类型,可以通过如下命令:

    1
    cat /proc/cpuinfo | grep "model name"

    nginx配置参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    --prefix=/usr/local/nginx
    --error-log-path=/data/logs/error/error.log
    --http-log-path=/data/logs/access/access.log
    --pid-path=/var/run/nginx/nginx.pid 
    --lock-path=/var/lock/nginx.lock   
    --conf-path=/etc/nginx/nginx.conf
    --sbin-path=/usr/sbin/nginx
    --user=www
    --group=webgrp
    --vhost-domain=example.com
    --pro-language=php
    --with-http_ssl_module
    --with-http_realip_module
    --with-http_addition_module
    --with-http_image_filter_module
    --with-http_sub_module
    --with-http_dav_module
    --with-http_flv_module
    --with-http_mp4_module
    --with-http_gzip_static_module
    --with-http_concat_module
    --with-http_random_index_module
    --with-http_secure_link_module
    --with-http_degradation_module
    --with-http_sysguard_module
    --with-backtrace_module
    --with-http_stub_status_module
    --with-http_upstream_check_module
    --with-google_perftools_module
    --with-http_geoip_module
    --with-pcre=/usr/local/src/pcre-8.35
    --with-http_image_filter_module

    2、隐藏版本号

    在nginx配置文件的http标签内加入“server_tokens off; ”参数,也可以放大server标签和location标签中

    或者在源代码中更改

    src/core/nginx.h

    1
    2
    #define NGINX_VERSION  "1.6.2" // 修改为想要的版本号如2.4.3
    #define NGINX_VER "nginx/" 改为 Apache

    src/http/ngx_http_header_filter_module.c

    1
    static char ngx_http_server_string[] ="Server:nginx"  //改为apache

    src/http/ngx_http_special_response.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static u_char ngx_http_error_full_tail[] =
    "<hr><center>" NGINX_VER "</center>" CRLF
    "</body>" CRLF
    "</html>" CRLF
    ;
     
     
    static u_char ngx_http_error_tail[] =
    "<hr><center>nginx</center>" CRLF
    "</body>" CRLF
    "</html>" CRLF
    ;   
    //改为apache

    3、利用TCMalloc优化Nginx的性能

    TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。
    要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:

    centos 》 nginx 》gperftools》libunwind 依赖顺序, 先安装libunwind

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd /usr/local/src
     
    wget  -c http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz >libunwind-1.1.tar.gz
    tar zxf libunwind-1.1.tar.gz
    cd libunwind-1.1
     
    CFLAGS=-fPIC ./configure --prefix=/usr --enable-shared
    make CFLAGS=-fPIC
    make CFLAGS=-fPIC install

     安装google-perftools

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    cd /usr/local/src
     
    wget -c ftp://ftp.tw.freebsd.org/pub/ports/distfiles/gperftools-2.1.tar.gz
    #wget -c http://gperftools.googlecode.com/files/google-perftools-2.1.tar.gz(现在googlecode.com被封了)
     
    tar -vxzf gperftools-2.1.tar.gz
    cd gperftools-2.1
     
    ./configure
    --prefix=/usr/local/gperftools
    --disable-cpu-profiler
    --enable-shared
    --disable-heap-profiler
    --disable-heap-checker
    --disable-dependency-tracking
    --enable-frame-pointers
     
    or
     
    ./configure --prefix=/usr/local/gperftools  --enable-frame-pointers
     
    make && make install

     到这里安装google-perftools完成了但未生效,接下来需要使google-perftools生效

    1
    2
    3
    4
    5
    6
    7
    /sbin/ldconfig
    echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
    ldconfig
     
    or
    ln -s /usr/local/gperftools/lib/* /usr/local/lib
    ldconfig

    详见:http://www.cnblogs.com/chenpingzhao/p/4603437.html

    nginx配置文件修改 

    1
    google_perftools_profiles /data/www/tmp/tcmalloc;

    验证运行状态

    1
    2
    3
    4
    5
    6
    [root@dev http]# lsof -n | grep tcmalloc
    nginx     18292       www   13w      REG                8,2          0     660107 /data/www/tmp/tcmalloc.18292
    nginx     18293       www   15w      REG                8,2          0     660109 /data/www/tmp/tcmalloc.18293
    nginx     18294       www   23w      REG                8,2          0     660108 /data/www/tmp/tcmalloc.18294
    nginx     18295       www   25w      REG                8,2          0     660110 /data/www/tmp/tcmalloc.18295
    nginx     18296       www   30w      REG                8,2          0     660106 /data/www/tmp/tcmalloc.18296

    4、配置文件优化

    nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)

    1
    worker_processes 8;

    为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu

    1
    2
    worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;//8颗cpu
    worker_cpu_affinity  0001 0010 0100 1000; //4颗cpu

    这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致,可以限制为操作系统最大的限制65535

    1
    worker_rlimit_nofile 65535;

    客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小,但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数

    1
    2
    3
    4
    [root@dev http]# getconf PAGESIZE
    4096
     
    client_header_buffer_size 4k;

    这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。

    1
    open_file_cache max=65535 inactive=60s;

    这个是指多长时间检查一次缓存的有效信息

    1
    open_file_cache_valid 80s;

    open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

    1
    open_file_cache_min_uses 1;

    开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载

    1
    2
    sendfile on
    tcp_nopush on //只有在sendfile开启模式下有效

    长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

    1
    2
    3
    4
    5
    keepalive_timeout 60;#设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。
    tcp_nodelay on;#打开tcp_nodelay,在包含了keepalive参数才有效
    client_header_timeout 15;#设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
    client_body_timeout 15;#设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
    send_timeout 15;#指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

    允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值

    1
    client_max_body_size 10m

    缓冲区代理缓冲用户端请求的最大字节数

    1
    client_body_buffer_size 128k

    事件处理模型优化,根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];

    1
    2
    3
    4
    events {
        use epoll;
        worker_connections 65536;
    }

    Max_client=worker_processes*worker_connections

    fastcgi配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    fastcgi_connect_timeout 300;#指定链接到后端FastCGI的超时时间。
    fastcgi_send_timeout 300;#向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
    fastcgi_read_timeout 300;#指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
    fastcgi_buffer_size 64k;#指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为gastcgi_buffers选项指定的缓冲区大小。
    fastcgi_buffers 4 64k;#指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 16K”、“4 64k”等。
    fastcgi_busy_buffers_size 128k;#建议设置为fastcgi_buffer的两倍,繁忙时候的buffer
    fastcgi_temp_file_write_size 128k;#在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报502 Bad Gateway
    fastcgi_cache oldboy_ngnix;#表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误放生,但是开启缓存也可能会引起其他问题,要很据具体情况选择
    fastcgi_cache_valid 200 302 1h;#用来指定应答代码的缓存时间,实例中的值表示将2000和302应答缓存一小时,要和fastcgi_cache配合使用
    fastcgi_cache_valid 301 1d;#将301应答缓存一天
    fastcgi_cache_valid any 1m;#将其他应答缓存为1分钟
    fastcgi_cache_min_uses 1;#请求的数量
    fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m;#定义缓存的路径

    gzip配置

    1
    2
    3
    4
    5
    6
    7
    gzip on;#开启压缩功能
    gzip_min_length  1k;#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。
    gzip_buffers     4 32k;#压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
    gzip_http_version 1.1;#压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
    gzip_comp_level 9;#压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
    gzip_types  text/css text/xml application/javascript;#用来指定压缩的类型,‘text/html’类型总是会被压缩。
    gzip_vary on;#vary header支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。

    expires配置

    对于图片,CSS,JS等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,html等代码缓存10天,这样用户第一次打开页面后,会在本地缓存上述内容,提高了以后打开的页面加载速度,节省服务端大量贷款,此功能同apache的expires。这里通过location,将需要缓存的扩展名列出来,然后指定缓存时间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)(?[0-9]+)?$ {
        expires 30d;
        log_not_found off;
        access_log off;
    }
     
    location ~* .(js|css)$ {
        expires 7d;
        log_not_found off;
        access_log off;
    }  
     
    location = /(favicon.ico|roboots.txt) {
        access_log off;
        log_not_found off;
    }

    URL访问控制

    来就应该只是资源文件,禁止指定扩展名程序被执行,例如:.php,.sh,.pl,nginx下禁止访问资源目录下的php程序文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    location ~ ^/images/.*.(php|php5|.sh|.pl|.py)$
    {
        deny all;
    }
     
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
     
    location ~ ^/static/.*.(php|php5|.sh|.pl|.py)$
    {
        deny all;
    }
     
    location ~* ^/data/(attachment|avatar)/.*.(php|php5)$
    {
        deny all;
    }

    限制使用网站ip访问网站

    1
    2
    3
    4
    5
    server {
        listen 80 default_server;
        server_name _;
        return 444;
    }

    图片及目录防盗链

    1
    2
    3
    4
    5
    6
    location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
        valid_referers none blocked *.etiantian.org etiantian.org;
        if ($invalid_referer) {
            return 302  http://www.explam.com/img/nolink.jpg;
        }
    }

    优雅的错误提示

    1
    2
    error_page   500 501 502 503 504  http://www.example.com/error2.html;
    error_page 400 403 404 405 408 410 411 412 413 414 415 http://www.example.com/error1.html;

    爬虫优化,可以进行适当限速

    使用tmpfs文件系统给/tmp

    提高效率,部分程序切图片操作临时放到/tmp下,可以把tmp设置成内存文件系统,占用内存空间的,就是从内存里拿出一块来当磁盘用

    1
    mount -t tmpfs  -o size=16m tmpfs /tmp

    防DOS攻击

    限制单个ip的 req/s , conn

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    map $remote_addr $rt_filtered_ip {
            default $binary_remote_addr;
            1.2.3.4 "";
            4.4.4.4 "";
    }
     
    or
     
    geo $rt_filtered_ip {
        default        $binary_remote_addr;
     
        127.0.0.1      "";
        192.168.1.0/24 "";
        10.1.0.0/16    "";
     
        ::1            "";
        2001:0db8::/32 "";
     
        1.2.3.4        ""
    }
     
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    limit_conn_zone $host$uri zone=peruri:10m;
    limit_req_zone $rt_filtered_ip zone=qps:10m rate=1r/s;
     
    server {
     
     
            location = /wp-login.php {
                limit_req zone=qps burst=5 nodelay;
                limit_conn perip 10;
                limit_conn perserver 100;
                limit_rate 500k;
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
            }
    }
     
    ab -n 100 -c 10 example.com/wp-login.php
     
    $binary_remote_addr是限制同一客户端ip地址;
    $server_name是限制同一server最大并发数;
    limit_conn为限制并发连接数;
    limit_rate为限制下载速度;

    访问控制 allow/deny

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    location /nginx-status {
        stub_status on;
        access_log off;
        auth_basic   "NginxStatus";
        auth_basic_user_file   /usr/local/nginx/htpasswd;
     
        allow 192.168.10.100;
        allow 172.29.73.0/24;
        deny all;
    //htpasswd -c ht
  • 相关阅读:
    数据仓库中的几种数据模型
    数据仓库为什么要分层
    数据仓库的两种建模方法
    数据仓库之架构发展
    数据仓库是什么
    ETL 自动化测试框架
    大数据测试之ETL测试工具和面试常见的问题及答案
    Hadoop面试链接
    Hadoop 面试总结
    Spark 基本架构及原理
  • 原文地址:https://www.cnblogs.com/yoursoul/p/4988585.html
Copyright © 2011-2022 走看看