【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域
写在前面的话
上一节我们谈了关于 nginx 服务器的一些简单的安全优化问题,能够帮助我们解决一部分线上服务存在的安全隐患。但是想要提升用户体验这是原因不够的,我们还需要从服务的优化方面入手。
本节更多的还是偏理论的东西,会给出相应的配置。可能有些就无法立即做测试。
访问优化:静态压缩
我们知道一个网站总会有一些 CSS/JS 等静态文件需要加载,如果用户每次请求都需要去服务器下载一遍,比如 Jquery 这种根本不会变的。明显会造成带宽的浪费。同时由于用户可能本身网速还不好,就容易给用户带来不好的体验。且不说每次都下载,就是直接以文件形式从服务器下载,传输速度也是问题。
在 nginx 编译的时候我们增加了模块:http_gzip_static_module
这个模块的作用在于将静态文件压缩后传输给用户。
| 参数 | 说明 |
|---|---|
| gzip on|off | 打开或者关闭 gzip 压缩的功能,默认 off |
| gzip_buffers numner|size |
指定 gzip 功能压缩文件时使用的缓存空间的大小。 number:向服务器申请缓存空间个数。size:每个缓存空间大小。 默认 number * size 的值为 128,size 一般为 4k 或者 8k |
| gzip_comp_level number |
gzip 压缩级别,级别为 1-9,默认为 1。 级别越高压缩率越高,压缩后文件越小,但越占用 CPU |
| gzip_disbale | 对不同客户端的请求进行选择性打开 gzip,后面跟浏览器名称 |
| gzip_http_verson | 早期客户端可能因不支持 gzip 而无法解压出现乱码,可根据不同 http 协议版本选择性的打开 gzip |
| gzip_min_length | 最少压缩的数据包大小,小于此值的数据包将不被压缩,默认 20,建议 1KB,0 则表示全压缩 |
| gzip_proxine off|any | 作为反向代理时有效,设置是否对后端返回的结果进行 gzip 压缩 |
| gzip_types | 根据响应页面的类型选择性打开 gzip |
| gzip_vary | 是否在头部发送压缩标识告诉客户端,默认 off |
配置模板如下:
gzip on;
gzip_static on;
gzip_disable "MSIE [1-6] .";
gzip_vary on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types application/x-javascript application/javascript text/javascript text/css application/xml;
gzip_http_version 1.1;
但是单纯是这样子配置还不是很完善,我们需要在 location 中配置本地静态文件保存时间:
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
access_log off;
}
通过 expires 配置保存时间!
管理优化:日志切割
在日常很多服务中是不具备日志切割能力的,所以对待这样的服务,我们一般采用的是系统的 logrotate 进行日志切割。虽然 nginx 没有明显看到关于日志切割的说明,但是我们可以换着方法实现。
我们添加配置文件:
server {
listen 10009;
server_name localhost;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
}
access_log /data/logs/nginx/access-cut-$year-$month-$day-$hour-$minutes.log mylog;
location / {
root /data/files/share;
}
}
为了测试方便,我们这里使用按照分钟切割,重载访问测试:

生产环境中建议按照小时或者天切割,这样便于我们排查问题。
访问优化:防盗链
在我们的服务上面可能存在一些图片或者其它文件能够被别人拿来放到自己的网站上面显示,这样照成的坏处就是被人的网站占用了我们的带宽,用于居然还不知道这个东西是我们的,等于免费给别人打广告。
对于这样的问题,专业的名词就叫盗链,就是偷你的链接。
比如我们配置当前网站的图片静态文件如果不是我们允许的来源的请求都返回 403:
location ~* \.(gif|jpg|png|bmp)$ {
valid_referers none blocked *.test.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
}
}
我们通过判断 referer 的来源判断请求是不是我们限制的域名来源,以此来拒绝其他网站直接请求我们的图片的访问。
none:代表请求的 refer 为空,也就是直接访问图片地址,这个我们允许的
blocked:来源不为空,但是里面的值被代理或者防火墙删除了
server_names:来源包含当前 server_name 的值
字符串:定义服务器名称,比如 *.test.com 配置后,来源 test.com 都允许
正则表达式:匹配合法请求来源, 如匹配百度 ~\.baidu\.
安全优化:防止恶意域名解析
域名的公网 IP 我们都可以采取一定的方法获取到,然后我们就可以通过域名解析,将我们的域名解析到那个公网 IP 上面。
这时候可能还是有些疑问,解析就解析呗,又不影响我们的业务。
但是这样想,假设有人恶意将一个非法域名解析到你的服务器,然后这个域名被运营商揪了出来,以为是你自己解析的。然后为了所谓的干净的网络环境,把你服务器的端口给你封了。这时候你怎么办。所以防止恶意域名解析还是很有必要的。
server {
listen 80 default_server;
server_name _;
access_log off;
return 444;
}
server {
listen 443 default_server;
server_name _;
ssl on;
ssl_certificate 随便设置一个ssl证书;
ssl_certificate_key 随便设置一个ssl证书的key;
return 444;
}
我们只需要添加这样一个配置就能防止没有配置 server_name 的域名解析到我们服务器了。
访问优化:AJAX 跨域提交
限制前后端分离成为了市场的大趋势,我们都在尽可能的让服务之间解耦,所以前端有一个域名,后端有一个域名其实是一个很正常的事情了。
但是就是因为如此,导致我们前端可能在使用 ajax 请求后端的时候报错:
'Access-Control-Allow-Origin' header is present on the requested resource
对于此类的问题,我们可以在后端 nginx 配置中增加:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
当然,可能由于代码原因,可能这样还不能解决,那么就只能使用最狠的方法:
在前端的 server 中新增 location 匹配,proxy_pass 后端的访问地址,ajax 直接提交当前域名的 location,就不会跨域了。
小结
当然还存在其它的优化项目,我们后续会继续加上去。另外接下来准备添加一个我们这整个分类下来关于 nginx 安装,初始化的一键脚本。
【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域的更多相关文章
- centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课
centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 ...
- Nginx入门及如何反向代理解决生产环境跨域问题
1.Nginx入门与基本操作篇 注:由于服务器是windows系统,所以本文主要讲解Nginx在windows下的操作. 首先下载Nginx 解压缩,我们所有的配置基本都在万能的 nginx/conf ...
- nginx实践(四)之静态资源web服务(防盗链)
防盗链目的 防止资源被盗用 http_refer 主要是判断refer信息,判断请求来源是不是合法身份 语法 实例 参数说明: none表示允许没有代理的头信息过来,blocked表示refer信息不 ...
- SpringBoot集成FastDFS+Nginx整合基于Token的防盗链
为什么要用SpringBoot? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- Nginx 十大优化 与 防盗链
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Ngin ...
- Nginx修改配置实现图片防盗链
一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...
- nginx 的访问日志切割
1. 高级用法–使用 nginx 本身来实现 当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志这时候当然就需要从 nginx ...
- nginx做反向代理并防盗链
nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...
- Nginx 学习笔记(八)http和https跨域问题解决
今天在做网易云信的时候,修改了一下源码,使用自己的服务端进行登陆, 注意:这里是使用http域名访问https域名 1.下载源码,配置了IM的域名,im.tinywan.com 没有开启https,具 ...
随机推荐
- c# Winform 继承窗体 无法拖动修改控件大小
问题描述: 一个窗体集成父窗体,发现无法直接拖动修改的控件,比如修改大小等 特征: 不禁使父窗体控件,就算新加一个控件也会这样:鼠标放到控件移动手方块上会出现一个“继承的控件”的tooptip, 异常 ...
- Python 内置函数补充匿名函数
Python3 匿名函数 定义一个函数与变量的定义非常相似,对于有名函数,必须通过变量名访问 def func(x,y,z=1): return x+y+z print(func(1,2,3)) 匿名 ...
- 资深程序员:学Python我推荐你用这几款编辑器
Python使用什么编辑比较好,Python编辑器推荐 各位 Pythoner 好啊!在这个烦躁的时代,相聚就是缘分,很高兴各位 Pythoner 能相聚于此,希望接下来的路,我们一起走下去,使用 P ...
- python 计算 对象 占用大小
# 这里主要是计算文件内容(str)的大小即: 统计空间占用情况, 并转换宜读单位 K,M def gen_atta_size(con): # 参数可以是任意数据类型 if con: size_b = ...
- Android应用打开外部文件
我们有时候遇到要打开一个文件,我们可以选择用其他应用打开,这时弹出来的应用列表,那么我们如何让自己开发的应用也能出现在里面呢? 第一步:设置启动Activity的intent-filter,给data ...
- Centos7下安装配置keepalived
这里用的是两台设备做高可用 master服务器ip地址:192.168.12.78 slave服务器ip地址:192.168.12.79 虚拟ip(VIP,一个尚未占用的内网ip即可)地址:192.1 ...
- python爬虫(2)——urllib、get和post请求、异常处理、浏览器伪装
urllib基础 urlretrieve() urlretrieve(网址,本地文件存储地址) 直接下载网页到本地 import urllib.request #urlretrieve(网址,本地文件 ...
- hibernate之主键生成策略
1. hibernate的主键生成器: generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 . 连接数据库的xml hibernate.cfg.xml <?xml ...
- idea插件(mybatis框架下mapper接口快速跳转对应xml文件)亲测好用!
我相信目前在绝大部分公司里,主要使用的框架是S(spring)S(spring MVC)M(mybatis),其中mybatis总体架构是编写mapper接口,框架扫描其对应的mapper.xml文件 ...
- day82_10_31celery的使用
1.缓存 当一些数据需要固定地且频繁访问数据库时,需要使用到接口缓存. 以轮播图为例,每个用户都会访问首页,首页的轮播图长时间不会改变,所以可以使用cache,将固定数据保存到缓存中(redis),第 ...