nginx gzip压缩功能介绍
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
nginx gzip压缩模块提供了对文件内容压缩的功能,nginx服务器将用户请求的内容在发送给用户客户端之前会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快了数据数据传输效率,提升了用户访问体验
nginx gzip压缩的优点
1、提升网站用户体验
由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验提升了,网站口碑就好了。
2、节约网站带宽成本
由于数据是压缩传输的,因此,此举节省了网站的带宽流量成本,不过压缩时会稍微消耗些CPU资源,这个一般可以忽略
此功能既让用户舒服了,公司也少花钱了,一举多得,对于所有web服务器来说,这是个非常重要的功能
需要(大于1k的纯文本)和不需要压缩的对象1、 纯文本内容压缩比很高,因此纯文本的内容最好要压缩,例如html、js、css、xml、shtml等各式的文件2、 被压缩的纯文本文件必须大于1kb,由于压缩算法的特殊原因,极小的文件压缩可能反而变大3、 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很多,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源
完整的配置如下gzip on;
gzip_min_length 1k; # 1k以上进行压缩
gzip_buffers 4 32k; # 4个32k的buffer
gzip_http_version 1.1; #压缩版本
gzip_comp_level 9; #压缩级别9最大,传输速度最快,但处理最慢,也比较消耗cpu资源。
gzip_types text/css/ test/html text/xml application/javascript; #cat mime.types
gzip_vary on; #vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据
使用firefox 安装yslow firebug检验
简单的说,nginx expires功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容的时,会把这些内容存储在用户浏览器本地,
这样用户第二次以后继续访问网站,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。
深入一点理解,expires功能就是允许通过nginx配置文件控制HTTP的“Expires”和“Cache-Control”响应头部内容,告诉客户端浏览器是否缓存以及缓存多久访问内容,
这个expire模块控制nginx服务器应答时的Expires头内容和Cache-Control头max-age指令。缓存的有效期可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
这些HTTP头向客户端表明了内容的有效性和持久性,如果客户端本地有内容缓存,则内容可以从缓存(除非已经过期)而不是从服务器读取,然后客户端会检查缓存中的副本,看看是否过期或者失效,以决定是否重新从服务器获得内容更新
nginx expires作用介绍
在网站开发和运营中,对于视频、图片、CSS、JS等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户浏览器本地缓存365天或3650天,而将CSS、JS、html等代码缓存10-30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存相应的上述内容,下次用户再打开类似的页面,重复的元素就无需下载了,从而加快了用户访问速度,由于用户访问请求和数据减少了,因此节省了服务期端大量的带宽。此功能同apache的expires。
1、expires 可以降低网站的带宽,节约成本。
2、加快用户访问网站的速度,提升了用户访问体验。
3、服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以节约人力成本。
对于几乎所有web服务来说,这都是非常重要的功能之一,Apache服务也有此功能
Server {
listen 80;
root html/www;
server_name www.gmts.org;
location / {
index index.html index.htm;}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{expires 10y;}
location ~ .*\.(js|css)$
{expires 30d;}
}
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d
} #也可以针对目录
root@test80 ~]# curl -I http://d1.leju.com/ia/2016/10/14/f580042c2895a2img.gifHTTP/1.1 200 OK
Date: Sat, 22 Oct 2016 17:28:08 GMT
Content-Type: image/gif
Content-Length: 15073Connection: keep-aliveExpires: Thu, 12 Jan 2017 02:37:09 GMT 缓存过期时间
Server: Apache
Last-Modified: Fri, 14 Oct 2016 02:28:18 GMT
Accept-Ranges: bytesCache-Control: max-age=7776000 缓存的总时间(毫秒)
X-Ser: BC18_dx-hebei-shijiazhuang-1-cache-1, BC26_dx-jiangsu-xuzhou-1-cache-3
nginx expire 功能的缺点及解决方法
几乎所有事物都有两面性,没有十全十美的人和事。
nginx expire也会给企业带来一些困惑
当网站被缓存的页面或数据更新了,此时用户看到的可能还是旧的已经缓存的内容,这样会影响用户体验
解决办法有如下几个:
1、对于经常需要变动的图片等文件,可以缩短对象缓存时间,例如谷歌和百度的图片经常根据不同的日期换成一些节日的图,所以这里可以将这个图片设置为缓存期1天
2、当网站改变或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)。
a、对于网站的图片、附件,一般不会被用户直接修改,用户层面上修改的图片实际上是重新传到服务器,虽然内容一样但是是个新的图片名了
b、网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端需要的重新缓存内容
企业网站缓存日期曾经的案例参考
不同的企业的业务和网站访问量不同,网站的缓存期时间设置也是不同的,比如,如下企业所用的缓存日期就是不一样的
51cto 1周 sina 15天 京东 25年 淘宝 10年
企业网站有可能不希望被缓存的内容
1、广告图片,用于广告服务,都缓存了就不好控制展示了
2、网站流量统计工具(js代码),都缓存了流量统计就不准了
3、更新频繁的文件(goole的logo),如果这个按天,缓存效果还是显著的
nginx没有类似Apache的cronolog日志分割处理的功能,但是,可以通过Nginx的信号控制功能或者reload重载,然后利用脚本来实现日志的自动切割。
:
mkdir -p /server/scripts/ cd /server/scripts/cat cut_nginx_log.shcd /application/nginx/logs && \/bin/mv www_access.log www_access_$(date +%F -d -1day).log/application/nginx/sbin/nginx -s reload
提示:实际上脚本的功能很简单,就是更名日志,然后重新加载nginx,重新生成文件记录日志
2、将这段脚本保存后加入到Linux的crontab守护进程,让此脚本在每天凌晨0点执行,就可以实现日志的每天分割功能了
操作结果如下:
crontab -l |tail -2#cut nginx log on 00:00 everynight00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1不记录不需要的访问日志
在实际工作中,对于负载均衡器健康检查节点或某些特定文件(图片,js,css)的日志,一般不需要记录下来,因为在统计PV时时按照页面计算的。而且日志写入太频繁会大量消耗磁盘I/O,降低服务的性能
具体配置方法为:
location ~ .*\.(js|jpg|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
假如日志目录为/app/logs,则授权方法为:chown –R root.root /app/logschmod –R 700 /app/logs
#不需要在日志目录上给nginx用户读或者写许可,没必要给大权限,nginx有master进程root用户,控制可以写入日志
根据扩展名限制程序和文件访问
Web2.0时代,绝大多数网站都是以用户为中心
例如:bbs、blog、sns产品,这几个产品有个共同的特点,就是不但允许用户发布内容到服务器,还允许用户发图片甚至附件到服务器上,由于为用户开了上传功能,因此给服务器带来了很大的安全风险,虽然很多程序。
但是,如果一不小心就会被***钻了空子,上传了***程序;以上权限的设置可以做到防止***上传***,以及修改站点文件,但是,合理的用户上传内容也被拒之门外了,那么如何解决可以让合法的用户上传文件又不至于被***利用***呢?
这就是,在比较好的网站业务架构中,应该把资源文件,包括用户上传的图片,附件等的服务和程序分离。
大多数公司的不安全的授权如下:
1)chmod -R 777 /sitedir(最不安全)
2) chmod -R nginx.nginx /sitedir(最不安全)
如果大多数公司授权一般的授权,会给网站带来最大的安全隐患。
下面是,这样用户即使上传了***文件也没法去执行,从而加强了网站的安全。
范例1: 配置nginx限制指定目录下的指定程序被解析,需要写在PHP配置的前面
location ~ ^images/.*\.(php|php5|.sh|.pl|.py)$
{ deny all; }
location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$
{ deny all; }
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{ deny all; }
范例2:Nginx下配置禁止访问*.txt文件,实际配置信息如下:
location ~* \.(txt|doc)$if (-f $request_filename) {
root /data/www/www;
#rewrite …… 可以重定向到某个URL
break;
}
location ~* \.(txt|doc)$ {
root /data/www/www;
deny all;
}
配置禁止访问指定的单个或多个目录。单目录
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
多个目录:
location ~ ^ /(static|js){
deny all;
}
范例3:禁止访问目录并返回指定的http状态码
server {
listen 80;
server_name www.gmts.org
root /data0/www/www;
index index.html index.htm;
access_log /app/logs/www_access.log commonlog;
location /admin/
{
return 404;
}
location /templates/
{
return 403;
}
}
下面介绍如何使用ngx_http_access_module限制网站来源ip访问
案例环境:phpmyadmin数据库的web客户端,内部开发人员用的。
范例1:禁止某目录让外界访问,但是允许某IP访问该目录,且支持PHP解析
location ~ ^/gtms/ {
allow 202.111.12.211;
deny all;
}
方法1:使用if来控制if ($remote_addr = 10.0.0.7 )
{
return 403;
}
if ($remote_addr = 218.247.17.130 )
{
set $allow_access_root `true`;
}
注意事项:通过防火墙 效率高1、deny 一定要加一个ip,否则403,不往下执行了,如在同一域名下,会造成死循环2、ip段 127.0.0. 10.10.10.0/163、以deny all;结尾,表示除了上面allow的,其他都禁止,如
location /
{
deny 192.168.1.1;
allow 127.0.0.0/24allow .......
deny all;
}
Nginx如何防止用户IP访问网站(恶意域名解析,也相当于是直接IP访问企业网站)
说明:直接报501错误,从用户体验上不是很好
上述代码放到第一个虚拟主机前面
server {
listen 80 default_server;
server_name _;
return 501;
#通过ip访问返回
501 Not Implemented
#nginx
#rewrite ^(.*) http://blog.gtms.org/$1 permanent}
方法3:发现某域名恶意解析到公司的服务器IP,在server标签里添加以下代码即可,若有多个server要多处添加。
if ($host !~ www/.gtms/.com$)
{
rewrite ^(.*) http://www.gtms.com/$1 permanent;
}
|