Nginx 生产推荐配置以及日志切割清理

2,176 阅读5分钟

Nginx 建议生产配置


#如果不使用root用户运行,就不能把目录放在 /root/ 目录下了,可以选择放在 /home/www 下,并设置 www 的权限 777
user                 www;
# nginx pid 存储路径
pid                  /run/nginx.pid;

# 推荐是CPU内核数或者内核数的倍数
worker_processes     4;

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

# 事件驱动
events {
    #  epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型
    use epoll;
    # 一个工作进程可以同时接受所有的新连接
    multi_accept       on;
    # 防止惊群问题
    accept_mutex on;
    # connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”
    worker_connections 65535;
}

http {
    charset                utf-8;
    # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载
    sendfile               on;
    # 必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。)
    tcp_nopush             on;
    # 也是防止网络阻塞,不过要包涵在keepalived参数才有效
    tcp_nodelay            on;

    #隐藏版本号
    server_tokens          off;

    #types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。
    types_hash_max_size    2048;

    types_hash_bucket_size 64;
    # 客户端上传的body的最大值。超过最大值就会发生413(Request Entity Too Large)错误。如果有大文件上传的需求可以适当修改
    client_max_body_size   100M;

    #HTTP连接的持续时间。设的太长会使无用的线程变的太多。这个根据自己服务器访问数量、处理速度以及网络状况方面考虑。
    keepalive_timeout  65;

    # MIME 浏览器当中可以显示的内容有HTML/GIF/XML/Flash等内容,浏览器为取得这些资源需要使用MIMEType,即MIME是网络资源的媒体类型,Nginx作为Web服务器必须要能够识别全都请求的资源类型,在nginx.conf文件中引用了一个第三方文件,
    include                mime.types;
    default_type           application/octet-stream;

    # Log Format 日志格式
    log_format             cloudflare '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_cf_ray $http_cf_connecting_ip $http_x_forwarded_for $http_x_forwarded_proto $http_true_client_ip $http_cf_ipcountry $http_cf_visitor $http_cdn_loop';

    # 日志配置 可以在服务器上做日志切割
    access_log             logs/access.log cloudflare;
    error_log              logs/error.log warn;

# 负载均衡
upstream gateway {
       # 不配置为轮循

       # 根据IP Hash
       # ip_hash;

       #  将请求分配到连接数最少的服务上。
       #  least_conn;

       # 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
       # fair;

       # weight 为权重配置
       server    localhost:8001 weight=1;
       server    localhost:8002 weight=1;
}


# 静态资源 + 反向代理配置
server {
    listen      80;
    server_name  localhost;
    root /home/www;

   # 启用gzip,对响应数据进行在线实时压缩,减少数据传输量
   gzip            on;
   # 用于设置在使用Gzip功能时是否发送带有“Vary:Accept-Encoding”头域的响应头部,该头域的主要功能是告诉接收方发送的数据经过了压缩处理,开启后端效果是在响应头部Accept-Encoding: gzip,对于本身不支持Gzip的压缩的客户端浏览器是有用的。
   gzip_vary       on;

   # 设置请求者代理服务器,该如何缓存内容
   #off – 关闭所有的代理结果数据压缩
   #expired – 如果header中包含”Expires”头信息,启用压缩
   #no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
   #no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
   #private – 如果header中包含”Cache-Control:private”头信息,启用压缩
   #no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
   #no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
   #auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
   #any – 无条件压缩所有结果数据
   gzip_proxied    any;

   # 设置压缩程度,包括级别1到级别9,级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间
   gzip_comp_level 6;

   # Nginx服务器可以根据MIME类型选择性开启Gzip压缩功能
   gzip_types      text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

    # 反向代理配置
    # 匹配优先级
    # = 要求请求字符与其精确匹配 成功则立即处理 , ^~ 前缀匹配 匹配到立即处理 , ~ 区分大小写的正则匹配 匹配到立即处理 ,~* 不区分大小写的正则匹配 匹配到立即处理 遵循最大匹配原则 正则匹配相同按文件排序优先级处理
    # /a 普通前缀匹配 所有正则未匹配 选择普通前缀匹配 ,/ 没有任何匹配成功处理

     location ^~ /api/ {
        # Proxy headers
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        #
        proxy_set_header Host    $host:$server_port;

        # Proxy timeouts
        proxy_connect_timeout              60s;
        proxy_send_timeout                 60s;
        proxy_read_timeout                 60s;
        # 后缀带上 / 会删除匹配符,没有 / 则不删除匹配符
        proxy_pass http://gateway/;
    }



    # 静态资源
     location / {
        try_files $uri $uri/ /index.html;
    }

     # 错误页面配置
     error_page 500 502 503 504 /50x.html;
     location = /50x.html {
        root html;
     }
  }
}

日志切割以及定时清理

日志切割&清理脚本


#!/bin/bash
LOGS_PATH=$1
DAYS=$2
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按天切割日志
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
#向 Nginx 主进程发送 USR1 信号,重新打开日志文件,否则会继续往mv后的文件写内容,导致切割失败.
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
#删除配置的N天前的日志
cd ${LOGS_PATH}
find . -mtime +${DAYS} -name "*20[1-9][3-9]*" | xargs rm -f
exit 0

创建日志切割以及清理脚本
sudo vi /usr/local/nginx/logs/cut_nginx_log.sh

附予执行权限
sudo chmod +x cut_nginx_log.sh

添加定时任务
crontab -e

#每天0时1分进行日志分割 参数一: 日志路径 参数二: 日志保留天数
01 00 * * * /usr/local/nginx/logs/cut_nginx_log.sh /usr/local/nginx/logs/ 30