nginx优化配置
By skyshappiness Posted 2017-12-03 13:39:53 In

一、背景

    随着访问量的逐步上升,需要榨干单一服务器的性能,达到利益最大化

二、解决方案

    1)、linux 系统优化:

        nginx 每访问完一个文件后,linux系统将会对它的 Access,即访问时间进行修改
        /dev/sdb1 /data ext3 defaults,noatime,nodiratime 0 0
        要挂载的对象 挂载目录 系统类型 文件系统访问权限,禁止修改访问时间 开机后是否检测 出问题后是否转储

    2)、优化资源限制
        ulimit -n 查询单个用户对文件描述符的限制,即打开文件的个数,默认值为 1024
        ulimit -u 查询单个用户最多拥有的进程数,即一个用户能打开的最大进程数量,默认8040
        vi /etc/security/limits.conf
        soft nofile 65535
        hard nofile 65535
        soft nproc 65535
        hard nproc 65535
        重启系统后生效

    3)、优化内核TCP选项
        修改以下Linux内核参数(vi /etc/sysctl.conf):
        net.ipv4.tcp_max_tw_buckets = 6000 //设置 timewait 的值,默认:180000
        net.ipv4.ip_local_port_range = 1024 65000 //设置系统允许打开的端口范围
        net.ipv4.tcp_tw_recycle = 1 //设置是否启用 timewait 快速回收
        net.ipv4.tcp_tw_reuse = 1 //设置是否开启重新使用,即允许将 TIME-WAIT sockets 重新用于新的 TCP 连接
        net.ipv4.tcp_syncookies = 1 //设置是否开启 SYN Cookies,如果启用该功能,那么当出现 SYN等待队列溢出时,则使用cookie处理
        net.core.somaxconn = 262144 //web应用中listen函数的backlog默认会将内核参数的 net.core.somaxconn限制到128,而NGINX_LISTEN_BACKLOG默认为 511,所以必须要调整这个值
        net.core.netdev_max_backlog = 262144 //设置被输送到队列数据包的最大数目,在网卡接收数据包的速率比内核处理数据包的速率快时,那么就会出现排队现象,此参数即用来设置队列的大小
        net.ipv4.tcp_max_orphans = 262144 //设置Linux能够处理不属于任何进程的套接字数量(“孤儿”进程),在快速、大量的连接中这种进程会很多,因此要适当的设置改参数,如果这种孤儿进程套接字数量大于指定的值,那么在使用 dmesg 查看时,会出现 too many of orphaned sockets 的警告
        net.ipv4.tcp_max_syn_backlog = 262144 //用于记录尚未收到客户端确认信息的连接请求的最大值
        net.ipv4.tcp_timestamps = 0 //设置使用时间戳作为序列号,通过这样的设置可以避免序列号被重复使用。在高速、高并发环境中,这种情况是存在的,因此通过时间戳能够让这些被看作是异常的数据包被内核接收。参数为0,代表关闭。
        net.ipv4.tcp_synack_retries = 1 //设置 SYN 重试次数,在 TCP 的3次握手中的第2次握手,内核需要发送一个回应前面一个 SYN 的 ACK 的SYN,即 为了打开对方的连接,内核发出的 SYN 的次数。减小该参数的值有利于避免 DDos 攻击。
        net.ipv4.tcp_syn_retries = 1 //设置内核放弃建立连接之前发送 SYN 包的数量
        net.ipv4.tcp_fin_timeout = 1 //如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外宕机。可以按此设置,但即便是一个轻载的 web 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比 FIN-WAIT-1 要小,因为FIN-WAIT-2最多只消耗 1.5KB 内存,但是生存周期要长一些。
        net.ipv4.tcp_keepalive_time = 30 //设置 TCP 发送 keepalive 消息的频度

    4)、关闭不必要的日志记录(按照级别选择)

    5)、使用 epoll

    6)、服务配置优化
        worker_connections 65535
        keepalive_timeout 60
        client_header_buffer_size 8K
        worker_rlimit_nofile 65535

    7)、内存使用优化(TCMalloc)
        如果是64位系统,需要优先安装 libunwind : wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.2.tar.gz
        tar -zxvf libunwind-1.2.tar.gz
        cd libunwind....
        CFLAGS=-fPIC ./configure
        make CFLAGS=-fPIC
        make CFLAGS=-fPIC install
        在安装 google-perftools 时还需要添加 --enable-frame-pointers 选项
        安装 google-perftools : wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.6.1/gperftools-2.6.1.tar.gz
        tar -zxvf google-perftools-.....tar.gz
        cd google.....
        ./configure --prefix=/usr/local/google-perftools
        make;make install;
        安装 Nginx 时添加选项: --with-google_perftools_module
        添加粗体配置项:
        events{}
        google_perftools_profiles /tmp/tcmalloc
        http{}
        检查指令: lsof -n | grep tcmalloc
        nginx 11746 nobody 10w REG 253,0 0 11850490 /tmp/tcmalloc.11746 //代表生效

    8)、针对下载限制流量:
        server{
             limit_rate_after 3m;
             limit_rate 512K;
        }

    9)、限制用户并发连接数
        http{
            limit_conn_zone $binary_remote_addr zone=perip:10m; //存储会话状态
       }
       server{
           limit_conn perip 1; //限制并发数为1

       }


附:个人单机部分配置方案

user  nginx;                                    #配置用户

worker_processes  1;                            #允许进程数cpu * 核数 或者一般为 4/8,默认配置 1

error_log  /var/log/nginx/error.log;            #错误日志 error PATH [ debug | info | notice | warn | error | crit ]

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

pid        /var/run/nginx.pid;                  #进程号存放位置

worker_rlimit_nofile 65535;                     #一个nginx进程打开的最多文件描述符数目

events {

    use epoll;                                  #使用哪种事件模型:nginx 编译时 对内核版本高于 2.6.18的版本

    multi_accept on;                            #nginx得到一个新连接时,接收尽可能多的连接

    worker_connections  65535;                  #worker进程最大打开连接数ulimit -n

}

http {

    client_body_timeout 1s;                     #用户请求体超时时间

    client_max_body_size 12m;                   #判断请求体 Content-Length来判断请求体大小是否超过配置值

    include       mime.types;                   #引入MIME类型

    default_type  application/octet-stream;     #设置默认MIME类型

    server_tokens off;                          #关闭在错误页面以及服务器头部输出nginx 版本信息

    log_format  main  '$remote_addr - $uri - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';                             #日志格式

    #access_log  logs/access.log  main;

    access_log  /var/log/nginx/access.log  main;                                                #请求日志

    sendfile        on;                                                                         #是否开启高效文件传输模式

    sendfile_max_chunk 100k;                                                                    #每个进程每次调用传输数量的值不能大于设定值

    tcp_nopush      on;                                                                         #告诉nginx在一个数据包里发送所有头文件,而不是一个一个发送,仅对 sendfile 有效

    #keepalive_timeout  0;

    keepalive_timeout  65 20;                                                                   #设置与客户端长连接的超时时间

    limit_req_log_level warn;                                                                   #设置延时消息日志级别

    limit_req_zone  $binary_remote_addr zone=reqPerIp:10m rate=5r/s;                            #设置请求地址会话存储区域

    limit_conn_zone $binary_remote_addr zone=perip:10m;                                         #储存会话状态,用于限制用户并发连接数

    #gzip配置;

    gzip on;

    gzip_http_version 1.0;                                                                      #对指定的HTTP请求协议版本进行压缩

    gzip_disable "MSIE [1-6].";                                                                 #对一些特定的用户代理不使用压缩

    gzip_types   text/plain   application/x-javascript   text/css   text/javascriptimage/jpeg image/gif image/png;

    gzip_min_length 1024;                                                                       #设置响应体的最小长度

    gzip_comp_level 3;                                                                          #设定压缩级别1-9;1-最小压缩率,最快;9-最大压缩率,最慢,占用CPU资源最大

    gzip_vary on;                                                                               #设定是否响应数据包添加 Vary:Accept-Encoding HTTP 头(header)

    # Load config files from the /etc/nginx/conf.d directory

    # The default server is in conf.d/default.conf

    include /etc/nginx/conf.d/*.conf;

}




友情链接
联系方式
  • 邮箱 / E-mail:skyshappiness@gmail.com