Nginx配置及优化

877 阅读6分钟

Ubuntu安装方式

  1. 在线方式

    sudo apt-get install nginx
    
  2. 源码方式

    安装依赖

    # 安装gcc g++
    sudo apt-get install build-essential
    sudo apt-get install libtool
    
    # 安装pcre依赖库(http://www.pcre.org/)
    sudo apt-get update
    sudo apt-get install libpcre3 libpcre3-dev
    
    # 安装zlib依赖库(http://www.zlib.net)
    sudo apt-get install zlib1g-dev
    
    # 安装SSL依赖库(16.04默认已经安装了)
    sudo apt-get install openssl
    

    下载源码启动:

    # 下载最新版本:
    # 下面的version可以改为对应的版本
    # http://nginx.org/download/nginx-1.17.0.tar.gz
    wget -O /tmp/nginx.tar.gz http://nginx.org/download/nginx-<version>.tar.gz
    
    # 解压:
    cd /tmp/
    tar -zxvf nginx.tar.gz
    
    # 进入解压目录:
    cd nginx-1.13.6
    
    # 配置:
    ./configure --prefix=/usr/local/nginx 
    
    # 编译:
    make
    
    # 安装:
    sudo make install
    
    # 启动:
    #注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过-h查看帮助命令。
    #查看进程:
    sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    
    # 查看进程启动状态
    ps -ef | grep nginx
    

Nginx配置及优化

  1. 配置文件结构
...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块--start
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块--end
}
  • 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • location块:配置请求的路由,以及各种页面的处理情况。
  1. 配置优化

    配置文件:

    user www-data;
    pid /run/nginx.pid;
    
    # worker_processes用来设置Nginx服务的进程数。推荐是CPU内核数或者内核数的倍数,推荐使用CPU内核数
    worker_processes 4;
    # 默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均
    worker_cpu_affinity 0001 0010 0100 1000;
    # 设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值
    worker_rlimit_nofile 65535;
    
    events {
    				# 设置事件驱动模型,是内核2.6以上支持
            use epoll;
            worker_connections 65535;
            accept_mutex off;
            multi_accept off;
    }
    
    http {
            ##
            # Basic Settings
            ##
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 60 50;
            send_timeout 10s;
            types_hash_max_size 2048;
            client_header_buffer_size 4k;
            client_max_body_size 8m;
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # Logging Settings
            ##
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            ##
            # Gzip Settings
            ##
            gzip on;
            gzip_disable "msie6";
            gzip_min_length 1024;
            gzip_vary on;
            gzip_comp_level 2;
            gzip_buffers 32 4k;
            gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    
            ##
            # Virtual Host Configs
            ##
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }
    

nginxs配置说明:

  • worker_connections

设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值。还有个问题,linux系统中有个指令open file resource limit,它设置了进程可以打开的文件句柄数量,可以用下面的指令查看你的linux系统中open file resource limit指令的值,cat /proc/sys/fs/file-max 可以将该指令设置为23900251

   echo "2390251" > /proc/sys/fs/file-max
   
   sysctl -p
  1. 压测工具Apache ab

    我们要测试 nginx 的负载能力,需要借助压力测试工具。本博客是使用 Apache 服务器自带的一个 web 压力测试工具 ApacheBench ,简称 ab。ab 是一个命令行工具,即通过 ab 命令行,模拟多个请求同时对某一 URL 地址进行访问,因此可以用来测试目标服务器的负载压力。

    yum -y install httpd-tools
    
    # 查看安装结果
    ab -V
    
    # 简单的使用
    # -c:一次并发请求的数量;-n:请求总次数
    ab -c 5000 -n 200000 http://10.211.55.6:80/index.html
    
  2. 其他优化

    net.ipv4.ip_forward = 0
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.default.accept_source_route = 0
    kernel.sysrq = 0
    kernel.core_uses_pid = 1
    
    # 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
    net.ipv4.tcp_syncookies = 1
    kernel.msgmnb = 65536
    kernel.msgmax = 65536
    kernel.shmmax = 68719476736
    kernel.shmall = 4294967296
    
    # timewait的数量,默认是180000
    net.ipv4.tcp_max_tw_buckets = 6000
    net.ipv4.tcp_sack = 1
    net.ipv4.tcp_window_scaling = 1
    net.ipv4.tcp_rmem = 4096        87380   4194304
    net.ipv4.tcp_wmem = 4096        16384   4194304
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # # 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
    net.core.netdev_max_backlog = 262144
    
    # web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义 的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值
    net.core.somaxconn = 262144
    
    # 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅 是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
    net.ipv4.tcp_max_orphans = 3276800
    
    # 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
    net.ipv4.tcp_max_syn_backlog = 262144
    
    # 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
    net.ipv4.tcp_timestamps = 0
    
    # 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
    net.ipv4.tcp_synack_retries = 1
    
    # 在内核放弃建立连接之前发送SYN包的数量。
    net.ipv4.tcp_syn_retries = 1
    
    # 启用timewait快速回收
    net.ipv4.tcp_tw_recycle = 1
    
    # 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_mem = 94500000 915000000 927000000
    
    # 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。 2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
    net.ipv4.tcp_fin_timeout = 1
    
    # 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
    net.ipv4.tcp_keepalive_time = 30
    
    # 允许系统打开的端口范围
    net.ipv4.ip_local_port_range = 1024   65000