使用Nginx压缩文件、设置反向代理缓存提高响应速度

Gzip压缩:

最开始,这个竟然要6m多(大到不寻常),响应的速度3分多钟。

所以先对返回的文件进行gzip压缩。判断返回的资源是否有使用gzip压缩,观察响应头部里面,如果没有

Content-Encoding: gzip;这意味着文件是在没有压缩的情况下提供。

 

在nginx.conf中进行如下配置:

 1 http{
 2 ....
 3     #使用gzip压缩;
 4     gzip on ;
 5  
 6     #对大于1k的文件进行压缩;
 7     gzip_min_length: 1k; 
 8  
 9     #压缩的程度(1~10,数字越大压缩程度越大,对应消耗时间和cpu越多);
10     gzip_comp_level 5;
11  
12     #对特定文件进行压缩;
13     gzip_types text/plain application/javascript application/x-javascript text/css     application/xml text/javascript; 对以上文件进行压缩;
14 ...
15 }

配置好后reload Nginx,再次访问

从上图可以看到,压缩效果很明显,此时的vendor从原来的6mb压缩至980kb,体积小了响应时间也小了。开启的level为5,虽然越高压缩后体积就会越小,尝试将level调制9,试试压缩后体积大小:

 

调制为9后发现体积跟之前变化不是很大(按比例来说)。再试试8

查找资料发现以下回答:

 

发现其实1,2的时候变化较大,后续的压缩体积变化不大,而且压缩程度越高,会耗费更多的cpu和时间,所以这里一般不需要设置得太高;

代理缓存:

文件大小得到压缩了,此时在尝试使用缓存提高一下响应时间;压缩后vendor大小在1mb左右,响应时间大概需要1min,这跟原来比虽然快了很多,但还是太慢;

在nginx.conf中添加如下配置:

 1 http{
 2 ....
 3     proxy_buffering on;
 4     proxy_temp_path /usr/local/nginx-1.14.2/nginx-cache/temp;
 5     proxy_cache_path /usr/local/nginx-1.14.2/nginx-cache/cache levels=1:2 keys_zone=my-cache:100m inactive=600 max_size=2g;
 6 ....
 7                 location /ospf/ {
 8 ......
 9                         proxy_cache my-cache;
10                         proxy_cache_valid 200 304 301 302 8h;
11                         proxy_cache_valid 404 1m;
12                         proxy_cache_valid any 1d;
13                         proxy_cache_key $host$uri$is_args$args;
14                       ...
15                 }
16 }

配置说明:

proxy_buffering on:代理的时候,开启缓冲后端服务器的响应;

proxy_temp_path : 缓存临时目录。后端的响应并不直接返回客户端,而是先写到一个临时文件中,然后被rename一下当做缓存放在 proxy_cache_path 。

proxy_cache_path: 设置缓存目录,目录里的文件名是cache_key 的MD5值。

levels=1:2 表示采用2级目录结构,第一层目录只有一个字符

keys_zone=my-cache:100m Web缓存区名称为my-cache,内存缓存空间大小为100MB,这个缓冲zone可以被多次使用。

inactive=600m 表示600分钟没有被访问的内容自动清除

max_size=2g 硬盘最大缓存空间为2GB,超过这个大小将清除最近最少使用的数据。

 

proxy_cache my-cache; 定义用于缓存的共享内存区域。

proxy_cache_valid:缓存的有效期;指定对200、301或者302有效代码缓存的时间长度。特定参数any表示对任何响应都缓存一定时间长度。

proxy_cache_key 用来区分缓存文件的key,作为缓存key的一个字符串,用于存储或者获取缓存值。默认值为$scheme$proxy_host$uri$is_args$args

 然后再次访问(已访问过一次,使其有缓存文件) 

可以看到,开启了缓存,速度较之前又快了很多,没用缓存之前是1min,现在大约是10s的时间,其他较小的文件大部分都是ms级的响应速度。

总结:使用gzip压缩可以缩小文件体积,使用缓存可以不用直接访问源服务器,直接在Nginx代理缓存中返回资源,从而加快响应的速度,以上虽然从原来的3min到10s左右的提升,但是对应加载一个页面的速度来说还是太慢,还有一个关键的问题是如果缩小该文件的大小。

下面是我的一个配置demo

  1 #运行用户
  2 #user  nobody;
  3 
  4 #启动进程,通常设置成和cpu的数量相等
  5 worker_processes  1;
  6 
  7 #全局错误日志
  8 #error_log  logs/error.log;
  9 #error_log  logs/error.log  notice;
 10 #error_log  logs/error.log  info;
 11 
 12 #PID文件,记录当前启动的nginx的进程ID
 13 #pid        logs/nginx.pid;
 14 
 15 #工作模式及连接数上限
 16 events {
 17     worker_connections  1024;   #单个后台worker process进程的最大并发链接数
 18 }
 19 
 20 
 21 #设定http服务器,利用它的反向代理功能提供负载均衡支持
 22 http {
 23         #设定mime类型(邮件支持类型),类型由mime.types文件定义
 24     include       mime.types;
 25     default_type  application/octet-stream;
 26 
 27         #设定日志
 28     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 29     #                  '$status $body_bytes_sent "$http_referer" '
 30     #                  '"$http_user_agent" "$http_x_forwarded_for"';
 31 
 32     #access_log  logs/access.log  main;
 33         #rewrite_log     on;
 34 
 35         #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
 36     #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
 37     sendfile        on;
 38     #tcp_nopush     on;
 39 
 40         #连接超时时间
 41     keepalive_timeout  120;
 42         tcp_nodelay        on;
 43 
 44     #gzip压缩开关  负责压缩数据流
 45         gzip              on;
 46         #对于超过10k的数据进行压缩
 47         gzip_min_length   10k;
 48         #压缩的程度(0~9,数字越大压缩程度越大,对应消耗时间和cpu越多,其实1,2的时候变化较大,后续的压缩体积变化不大);
 49         gzip_comp_level 2;
 50         #对于以下类型数据进行压缩
 51         gzip_types        text/plain application/javascript application/x-javascript text/css application/xml text/javascript;
 52 
 53         #代理缓存
 54         proxy_buffering on;
 55         proxy_temp_path /usr/local/nginx-1.14.2/nginx-cache/temp;
 56         proxy_cache_path /usr/local/nginx-1.14.2/nginx-cache/cache levels=1:2 keys_zone=my-cache:100m inactive=600 max_size=2g;
 57 
 58 
 59         #设定实际的服务器列表  设定负载均衡的服务器列表
 60     upstream list_server{
 61                 #weigth参数表示权值,权值越高被分配到的几率越大
 62         server 127.0.0.1:8080   weight=1;
 63         server 127.0.0.1:8080   weight=2;
 64     }
 65 
 66     server {
 67                 #监听80端口,80端口是知名端口号,用于HTTP协议
 68         listen       80;
 69 
 70                 #定义使用localhost访问
 71         server_name  localhost;
 72 
 73                 #编码格式
 74         #charset utf-8;
 75 
 76                 #反向代理的路径(和upstream绑定),location 后面设置映射的路径
 77                 #对所有请求进行负载均衡请求
 78         location / {
 79                         #root        /u01;                 #定义服务器的默认网站根目录位置
 80                         root   html;
 81                         index       index.html index.htm;  #定义首页索引文件的名称
 82                         proxy_pass http://list_server;      #请求转向list_server 定义的服务器列表
 83 
 84                         #以下是一些反向代理的配置可删除
 85                         proxy_redirect             off;
 86                         #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
 87                         proxy_set_header           Host $host;
 88                         proxy_set_header           X-Real-IP $remote_addr;
 89                         proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
 90                         client_max_body_size       10m; #允许客户端请求的最大单文件字节数
 91                         client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
 92                         proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
 93                         proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
 94                         proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
 95                         proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
 96                         proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
 97                         proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
 98                         proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
 99 
100                         #代理缓存
101                         proxy_cache my-cache;
102                         proxy_cache_valid 200 304 301 302 8h;
103                         proxy_cache_valid 404 1m;
104                         proxy_cache_valid any 1d;
105                         proxy_cache_key $host$uri$is_args$args;
106         }
107 
108                 #静态文件,nginx自己处理
109         #location ~ ^/(images|javascript|js|css|flash|media|static)/ {
110         #   root D:1_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappviews;
111         #    #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
112         #    expires 30d;
113         #}
114 
115                 #禁止访问 .htxxx 文件
116         #location ~ /.ht {
117         #    deny all;
118         #}
119 
120                 #错误处理页面(可选择性配置)
121         #error_page  404              /404.html;
122 
123         # redirect server error pages to the static page /50x.html
124         #
125         error_page   500 502 503 504  /50x.html;
126         location = /50x.html {
127             root   html;
128         }
129 
130         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
131         #
132         #location ~ .php$ {
133         #    proxy_pass   http://127.0.0.1;
134         #}
135 
136         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
137         #
138         #location ~ .php$ {
139         #    root           html;
140         #    fastcgi_pass   127.0.0.1:9000;
141         #    fastcgi_index  index.php;
142         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
143         #    include        fastcgi_params;
144         #}
145 
146         # deny access to .htaccess files, if Apache's document root
147         # concurs with nginx's one
148         #
149         #location ~ /.ht {
150         #    deny  all;
151         #}
152     }
153 
154 
155     # another virtual host using mix of IP-, name-, and port-based configuration
156     #
157     #server {
158     #    listen       8000;
159     #    listen       somename:8080;
160     #    server_name  somename  alias  another.alias;
161 
162     #    location / {
163     #        root   html;
164     #        index  index.html index.htm;
165     #    }
166     #}
167 
168 
169     # HTTPS server
170     #
171     #server {
172     #    listen       443 ssl;
173     #    server_name  localhost;
174 
175     #    ssl_certificate      cert.pem;
176     #    ssl_certificate_key  cert.key;
177 
178     #    ssl_session_cache    shared:SSL:1m;
179     #    ssl_session_timeout  5m;
180 
181     #    ssl_ciphers  HIGH:!aNULL:!MD5;
182     #    ssl_prefer_server_ciphers  on;
183 
184     #    location / {
185     #        root   html;
186     #        index  index.html index.htm;
187     #    }
188     #}
189 
190 }
原文地址:https://www.cnblogs.com/weixupeng/p/11163961.html