Nginx日志相关优化与安全
日志切割脚本如下:
#!/bin #日志切割脚本 Date=`date +%Y%m%d` Bdir="/usr/local/nginx" Nginxlogdir="$Bdir/logs" Logname="access" [ -d $Nginxlogdir ] && cd $Nginxlogdir ||exit 2 [ -f "$Logname".log ] ||exit 3 /bin/mv "$Logname".log "$Date"_"$Logname".log $Bdir/sbin/nginx -s reload find "$Nginxlogdir" -name "$Logname*" -type f -mtime +7|xargs /bin/rm
将脚本放入定时任务完成切割
不记录不需要的访问日志
在实际工作中,对于负载均衡器健康节点检查或某些特定文件(比如图片,JS,CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入太频繁会消耗大量磁盘I/O,降低服务的性能。
location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
access_log off;
}
#这里用location标签匹配不记录日志的元素扩展名,然后关闭日志
访问日志的权限设置
假如日志目录为/app/logs,则授权方法如下:
chown -R root.root /app/logs chown -R 700 /app/logs
#不需要在日志目录上给Nginx用户读或写许可,但很多网友都没注意这个问题,他们把该权限直接给了Nginx或Apache用户,这就成为了安全隐患。
Nginx站点目录及文件URL访问控制
配置Nginx,禁止解析指定目录下的指定程序:
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; } #对上述目录的限制必须写在Nginx处理PHP服务配置的前面,如下: location ~ .*.(php|php5)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; }
Nginx下配置禁止访问*.txt和*.doc文件
location ~* .(txt|doc)$ { if (-f $request_filename) { root /data/www/www; #rewrite ...可以重定向到某个URL #URL重写 break; } }
或 location ~* .(txt|doc)$ { root /data/www/www; deny all; #权限拒绝 }
禁止访问指定目录下的所有文件和目录
配置禁止访问指定的单个或多个目录
#禁止访问单个目录的命令如下: location ~ ^/static { deny all; } #禁止访问多个目录的命令如下: location ~ ^/(static|js) { deny all; }
禁止访问目录并返回指定的HTTP状态码,命令如下:
server { listen 80; server_name www.wk.com wk.com; root /data/www/www; index index.html index.htm; access_log logs/www_access.log commonlog; location /admin/ { return 404; } location /tmplates/ { return 403; } }
限制网站来源IP访问
禁止某目录让外界访问,但允许某IP访问该目录,且支持PHP解析,命令如下:
location ~ ^/wk/ #此为 改域名下禁止访问的目录 { allow 202.111.12.211; deny all; } location ~ .*.(php|php5)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }
限制指定IP或IP段访问,命令如下:
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; }
企业问题案例: Nginx做反向代理的时候可以限制客户端IP吗?
if ($remote_addr = 10.0.0.7) { return 403; } if ($remote_addr = 218.247.17.130) { set $allow_access_root 'ture'; #我也不知道什么意思 }
利用deny和allow只允许IP访问
location / { root html/blog; index index.php index.html index.htm; allow 10.0.0.7; deny all; }
只拒绝某些IP访问,命令如下:
location / { root html/blog; index index.php index.html index.htm; deny 10.0.0.7; allow all; }
配置Nginx,禁止非法域名解析访问企业网站
Nginx如何防止用户IP访问网站(恶意域名解析,也相当于是直接IP访问企业网站)
(1)让使用IP访问网站的用户,或者恶意解析域名的用过户,收到501错误,命令如下:
server { listen 80 default_server; server_name _; return 501; } #说明:直接报501错误,从用户体验上不是很好
(2)通过301跳转到主页,命令如下:
server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.wk.com/$1 permanent; }
(3)发现某域名恶意解析到公司的服务器IP,在server标签里添加以下代码即可,若有多个server则要多处添加。
if ($host ! ~ ^www.wk.com$) { rewrite ^(.*) http://www.wk.com/$1 permanent; } #说明:代码含义为如果header信息的host主机名字非www.yunjisuan.com,就301跳转到www.yunjisuan.com
Nginx图片及目录防盗链解决方案
盗链的影响
最直接的影响就是网络带宽占用加大了,带宽费用多了,网络流量也可能忽高忽低,Nagios/Zabbix等报警服务频繁报警最严重的情况就是网站的资源被非法使用,使网站带宽成本加大和服务器压力加大,这有可能导致数万元的损失,且网站的正常用户访问也会受到影响。
如何及时发现
(1)对IDC及CDN带宽做监控报警
(2)作为高级运维或运维经理,每天上班的重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量.
(3)对访问日志做分析,迅速定位异常流量,并且和公司市场推广等保持较好的沟通,以便调度带宽和服务器资源,确保网站正常的访问体验。
常见防盗链解决方案的基本原理
(1)根据HTTP referer实现防盗链
在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示是哪里的链接用了当前网页的资源。通过referer可以检测访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站,马上进行阻止或返回指定的页面。
HTTP referer是header的一部分,当浏览器向Web服务器发送请求时,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器借此获得一些信息用于处理。Apache,Nginx,Lighttpd三者都支持根据HTTP referer实现防盗链,referer是目前网站图片,附件,html等最常用的防盗链手段。下图是referer防盗链的基本原理图。
(2)根据cookie防盗链
(3)通过加密变换访问路径实现防盗链
实现防盗链
(1)利用referer,并且针对扩展名rewrite重定向
#下面的代码为利用referer且针对扩展名rewrite重定向,即实现防盗链的Nginx配置。 location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { valid_referers none blocked *.wk.com wk.com; # if ($invalid_referer) { rewrite ^/ http://www.wk.com/img/nolink.jpg; } } #提示:要根据自己公司的实际业务(是否有外链的合作)进行域名设置。
(2)利用referer,并且针对站点目录过滤返回错误码
针对目录的方法如下:
location /images { root /data/www/www; valid_referers none blocked *.yunjisuan.com yunjisuan.com; if ($invalid_referer) { return403; } }
Nginx错误页面的优雅显示
生产环境常见的HTTP状态码列表
200 #服务器成功返回网页,这是成功的http请求返回的标准状态码
301 #永久跳转,所有请求的网页将永久跳转到被设定的新位置,例如:从etiantian.org跳转到www.etiantian.org
403 #禁止访问,这个请求是合法的,但是服务器端因为匹配了预先设置的规则而拒绝响应客户端的请求,此类问题一般为服务器权限配置不当所致
404 #服务器找不到客户端请求的指定页面,可能是客户端请求了服务器不存在的资源所导致的
500 #内部服务器错误,服务器遇到了意料不到的情况,不能完成客户的请求。这是一个较为笼统的报错,一般为服务器的设置或内部程序问题所致
502 #坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成响应网关服务器。一般为代理服务器下面的节点出了问题所致
503 #服务当前不可用,可能为服务器超载或停机维护所致,或者是代理服务器后面没有可以提供服务的节点
504 #网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定的时间内完成处理请求,一般为服务器过载所致,没有在指定的时间内返回数据给代理服务器
为什么要配置错误页面优雅显示
在网站的运行过程中,可能因为页面不存在或系统过载等原因,导致网站无法正常响应用户的请求,此时Web服务会返回系统默认的错误码,或者很不友好的页面
我们可以将404,403等的错误信息页面重定向到网站首页或其他事先指定的页面,提升网站的用户访问体验。
优雅显示
(1)对错误代码403实行本地页面跳转,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; } error_page 403 /403.html; #当出现403错误时,会跳转到403.html页面 } #上面的/403.html是相对于站点根目录html/www的。
(2)对错误代码404实行本地页面优雅显示,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; error_page 404 /404.html; #当出现404错误时,会跳转到404.html页面 } } #代码中的/404.html是相对于站点根目录html/www的
(3)50x页面放到本地单独目录下,进行优雅显示
error_page 500 502 503 504 /50x.html; location = /50x.html { root /data/www/html; } #这里指定单独的站点目录存放到50x.html文件中。
(4) 错误状态码URL重定向,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; error_page 404 http://bbs.wk.com; #当出现404错误时,会跳转到指定的URL http://bbs.wk.com页面显示给用户,这个URL一般是企业另外的可用地址。 access_log /usr/local/nginx/logs/bbs_access.log commonlog; } } #代码中的/404.html是相对于站点根目录html/www的。
(5)将错误状态码重定向到一个location,命令如下:
location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; }
Nginx站点目录文件及目录权限优化
单机LNMP环境目录权限严格控制措施
为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有的目录权限是755;所有的文件权限是644.
chmod -R 777 /directory chmod -R nginx.nginx /directory
Nginx企业网站集群超级安全设置
结合Linux权限体系及Nginx大型集群架构进行配置,严格控制针对Nginx目录的访问才能降低网站被入侵的风险
服务器角色 | 权限处理 | 安全系数 |
---|---|---|
动态Web集群 | 目录权限755,文件权限644,所用目录,以及文件用户和组都是root。环境为Nginx+PHP | 文件不能被改,目录不能被写入,安全系数10 |
static图片集群 | 目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx | 文件不能被改,目录不能被写入,安全系数10 |
上传upload集群 | 目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。特别:用户上传的目录设置为755,用户和组使用Nginx服务配置的用户 | 文件不能被改,目录不能被写入,但是用户上传的目录允许写入文件且需要通过Nginx的其他功能来禁止读文件,安全系数8 |