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

Gzip压缩:

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

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

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

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

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

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

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

配置好后reload Nginx,再次访问

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

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

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

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

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

查找资料发现以下回答:

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

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

代理缓存:

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

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

 http{
....
proxy_buffering on;
proxy_temp_path /usr/local/nginx-1.14.2/nginx-cache/temp;
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;
....
location /ospf/ {
......
proxy_cache my-cache;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
...
}
}

配置说明:

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

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

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

levels=: 表示采用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

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

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

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

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

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

下面是我的一个配置demo

 #运行用户
#user nobody; #启动进程,通常设置成和cpu的数量相等
worker_processes 1; #全局错误日志
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #PID文件,记录当前启动的nginx的进程ID
#pid logs/nginx.pid; #工作模式及连接数上限
events {
worker_connections 1024; #单个后台worker process进程的最大并发链接数
} #设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型(邮件支持类型),类型由mime.types文件定义
include mime.types;
default_type application/octet-stream; #设定日志
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main;
#rewrite_log on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on; #连接超时时间
keepalive_timeout 120;
tcp_nodelay on; #gzip压缩开关 负责压缩数据流
gzip on;
#对于超过10k的数据进行压缩
gzip_min_length 10k;
#压缩的程度(0~9,数字越大压缩程度越大,对应消耗时间和cpu越多,其实1,2的时候变化较大,后续的压缩体积变化不大);
gzip_comp_level 2;
#对于以下类型数据进行压缩
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript; #代理缓存
proxy_buffering on;
proxy_temp_path /usr/local/nginx-1.14.2/nginx-cache/temp;
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; #设定实际的服务器列表 设定负载均衡的服务器列表
upstream list_server{
#weigth参数表示权值,权值越高被分配到的几率越大
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8080 weight=2;
} server {
#监听80端口,80端口是知名端口号,用于HTTP协议
listen 80; #定义使用localhost访问
server_name localhost; #编码格式
#charset utf-8; #反向代理的路径(和upstream绑定),location 后面设置映射的路径
#对所有请求进行负载均衡请求
location / {
#root /u01; #定义服务器的默认网站根目录位置
root html;
index index.html index.htm; #定义首页索引文件的名称
proxy_pass http://list_server; #请求转向list_server 定义的服务器列表 #以下是一些反向代理的配置可删除
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 #代理缓存
proxy_cache my-cache;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
} #静态文件,nginx自己处理
#location ~ ^/(images|javascript|js|css|flash|media|static)/ {
# root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
# #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
# expires 30d;
#} #禁止访问 .htxxx 文件
#location ~ /\.ht {
# deny all;
#} #错误处理页面(可选择性配置)
#error_page 404 /404.html; # redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#} # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
} # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # location / {
# root html;
# index index.html index.htm;
# }
#} }
上一篇:Nginx 反向代理功能-实现http反向代理


下一篇:Web服务器的反向代理nginx