nginx优化的一些总结

一.压缩

gzip on; 启用 gzip 压缩功能
gzip_min_length 1k; 不压缩临界值,大于1K的才压缩
gzip_http_version; 设置对指定http协议版本进行压缩
gzip_buffers 设置缓冲区的数量和大小,如果大小没有设置,那么默认是一个页码的大小,依赖所在系统平台
gzip_comp_level 1~9 指定压缩率,数值越大,压缩率是最大的,但是消耗CPU资源多,而且慢;而小的数值是最快的,消耗资源少,但是压缩率小。这个根据需要自己权衡
gzip_proxied 根据响应的类型,来设置是否压缩,匹配的前提是后端服务器返回Via Header头
gzip_types 指定需要压缩类型
gzip_vary 该指令用于设定是否向响应数据包添加Vary:Accept-Encoding HTTP头

      gzip    on;
      gzip_comp_level  6;    # 压缩比例,比例越大,压缩时间越长。默认是1
      gzip_types    text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml;     # 哪些文件可以被压缩
      gzip_disable    "MSIE [1-6]\."; 

测试:
用curl测试Gzip是否成功开启(-H/–header 自定义头信息传递给服务器)
curl -I -H “Accept-Encoding: gzip, deflate” “http://www.slyar.com/blog/

二.缓存

1.nginx通过expires指令来设置浏览器的Header

      #图片缓存30天
      location ~.*\.(jpg|png|jpeg)$  
      {  
        expires 30d;  
      }

      #js css缓存一小时
      location ~.*\.(js|css)?$  
      {  
        expires 1h;  
      }

2.nginx自带的内置缓存模块proxy_cache

proxy_temp_file_write_size 128k;  
proxy_temp_path   /usr/local/nginx/proxy_temp; 
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;   
levels设置目录层次 keys_zone设置缓存名字和共享内存大小 inactive在指定时间内没人访问则被删除 max_size最大缓存空间

 location /  
 {  
 proxy_cache content; //根keys_zone后的内容对应  
 proxy_cache_valid  200 304 301 302 10d;   //哪些状态缓存多长时间  
 proxy_cache_valid  any 1d;    //其他的缓存多长时间  
 proxy_cache_key $host$uri$is_args$args;   //通过key来hash,定义KEY的值 
 }

缓存的文件名和key为代理URL的MD5 码。

三.其他

worker_processes 定义了nginx对外提供web服务时的worker进程数。
worker_rlimit_nofile 102400;
更改worker进程的最大打开文件数限制,这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数(worker_processes)相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

Events模块

multi_accept on 告诉nginx收到一个新连接通知后接受尽可能多的连接。
worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile。最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。
use epoll; 使用epoll的I/O模型

HTTP 模块

server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的

sendfile 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(处理静态文件时有效)。
tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送–当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。通过设置套接字的TCP_NODELAY = on 选项来完成,这样就禁用了Nagle 算法。

limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
limit_conn 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;

ngx_http_limit_conn_module 模块
服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。

include /etc/nginx/mime.types;
default_type text/html;
charset UTF-8;
include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。
default_type 设置文件使用的默认的MIME-type。
charset 设置我们的头文件中的默认的字符集

open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
open_file_cache 指令会对以下信息进行缓存:
* 打开文件描述符的文件大小和修改时间信息
* 存在的目录信息
* 搜索文件的错误信息:文件不存在无权限读取等信息

#指定一个request可接受的body大小,即请求头里的Content-Length. 如果请求body超过该值,nginx返回413(“Request Entity Too Large”),大文件需要适当调大
client_max_body_size 10M;
#客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k
client_header_buffer_size 4k;
#指定允许为客户端请求头最大分配buffer个数和大小.
large_client_header_buffers 8 128k;

四.内核优化

# vim /etc/sysctl.conf

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#客户端为NAT网络模式下,服务器会主动丢包,表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
#开启TCP时间戳
net.ipv4.tcp_timestamps = 1
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_fin_timeout = 20

# netstat -s|grep timestamp
timeout数量不大的时候,不用调整tcp_tw_recycle参数,虽然服务器端没有使用nat,但是客户端使用snat的情况很多,如果后发现packets rejects in established connections because of timestamp增长很快

net.ipv4.tcp_max_tw_buckets = 6000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
net.ipv4.ip_local_port_range = 1024 65000
允许系统打开的端口范围
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.core.somaxconn = 262144
web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。
net.core.netdev_max_backlog = 262144
该参数决定了, 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目, 不要设的过大
net.ipv4.tcp_synack_retries = 1
syn-ack握手状态重试次数,默认5,遭受syn-flood攻击时改为1或2
为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
net.ipv4.tcp_syn_retries = 1
外向syn握手重试次数,默认4
在内核放弃建立连接之前发送SYN 包的数量。
net.ipv4.neigh.default.gc_stale_time=120 ARP参数,检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。

net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
arp_ignore:定义了网卡在响应外部ARP请求时候的响应级别
0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
1:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应。
net.ipv4.conf.default.arp_announce =2
net.ipv4.conf.all.arp_announce =2
net.ipv4.conf.lo.arp_announce = 2
定义了网卡在向外宣告自己的MAC-IP时候的限制级别
有三个值:
0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
1:尽量避免响应ARP请求中MAC不是本网卡的,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就尽量避免响应
2:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应。

执行sysctl-p使修改生效

# sysctl-p

完整配置

worker_processes  1;

error_log  logs/error.log;

events {
    worker_connections  1024;
    multi_accept on;
    use epoll;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush     on;
    server_tokens   off;

    keepalive_timeout  65;

    gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    open_file_cache max=102400 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2; 

    client_max_body_size 20m;
    client_body_buffer_size 128k;

    #proxy_redirect off;
    #proxy_set_header Host $host;
    #proxy_set_header X-Real-IP $remote_addr;
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #proxy_ignore_client_abort on;
    #proxy_connect_timeout 60s;
    #proxy_send_timeout 60s;
    #proxy_read_timeout 60s;
    #proxy_buffer_size 64k;
    #proxy_buffers 4 64k;
    #proxy_busy_buffers_size 128k;
    #proxy_intercept_errors on;

    #proxy_temp_path   /etc/nginx/proxy_temp;
    #proxy_cache_path /etc/nginx/proxy_cache levels=1:2 keys_zone=one_cache:20m inactive=1d max_size=100m;
    #proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #location ~ .*\.(html|htm|ico|jpeg|git|jpg|png|bmp|swf)$ {
        #   root ;
        #   proxy_pass http://www.demo.com:8080;
        #   proxy_cookie_path /demo/ /;
        #
        #   proxy_cache one_cache;
        #   proxy_cache_valid  200 304 301 302 1d;
        #   proxy_cache_valid  any 6h;
        #   proxy_cache_key $host$uri$is_args$args;
        #   add_header X-Cache '$upstream_cache_status from $host';
        #   expires 7d;
        #}
        #
        #location ~ .*\.(css|js)$ {
        #   root ;
        #   proxy_pass http://www.demo.com:8080;
        #   proxy_cookie_path /demo/ /;
        #
        #   proxy_cache one_cache;
        #   proxy_cache_valid  200 304 301 302 1d;
        #   proxy_cache_valid  any 6h;
        #   proxy_cache_key $host$uri$is_args$args;
        #   add_header X-Cache '$upstream_cache_status from $host';     
        #   expires 1d;
        #}
        #
        #location ~ .*$ {
        #   proxy_pass http://www.demo.com:8080;
        #   proxy_cookie_path /demo/ /;
        #}
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值