Nginx日志相关优化与安全

日志切割脚本如下:

#!/bin
#日志切割脚本
Date=`date +%Y%m%d`
Bdir="/usr/local/nginx"
Nginxlogdir="$Bdir/logs"
Logname="access"
[ -d $Nginxlogdir ] && cd $Nginxlogdir ||exit
[ -f "$Logname".log ] ||exit
/bin/mv "$Logname".log "$Date"_"$Logname".log
$Bdir/sbin/nginx -s reload
find "$Nginxlogdir" -name "$Logname*" -type f -mtime +|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 /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:;
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 ;
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 ;
}
location /tmplates/
{
return ;
}
}

限制网站来源IP访问

禁止某目录让外界访问,但允许某IP访问该目录,且支持PHP解析,命令如下:

    location ~ ^/wk/             #此为 改域名下禁止访问的目录
{
allow 202.111.12.211;
deny all;
}
location ~ .*\.(php|php5)$
{
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
include fastcgi.conf;
}

限制指定IP或IP段访问,命令如下:

    location /
{
deny 192.168.1.1;
allow 192.168.1.0/;
allow 10.1.1.0/;
deny all;
}

企业问题案例: Nginx做反向代理的时候可以限制客户端IP吗?

    if ($remote_addr = 10.0.0.7)
{
return ;
}
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 default_server;
server_name _;
return ;
}
#说明:直接报501错误,从用户体验上不是很好

(2)通过301跳转到主页,命令如下:

    server {
listen 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 ;
server_name www.wk.com;
location / {
root html/www;
index index.html index.htm;
}
error_page /.html; #当出现403错误时,会跳转到403.html页面
}
#上面的/403.html是相对于站点根目录html/www的。

(2)对错误代码404实行本地页面优雅显示,命令如下:

    server {
listen ;
server_name www.wk.com;
location / {
root html/www;
index index.html index.htm;
error_page /.html;
#当出现404错误时,会跳转到404.html页面
}
}
#代码中的/404.html是相对于站点根目录html/www的

(3)50x页面放到本地单独目录下,进行优雅显示

    error_page      /50x.html;
location = /50x.html {
root /data/www/html;
}
#这里指定单独的站点目录存放到50x.html文件中。

(4) 错误状态码URL重定向,命令如下:

    server {
listen ;
server_name www.wk.com;
location / {
root html/www;
index index.html index.htm;
error_page 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 = @fallback;
}
location @fallback {
proxy_pass http://backend;
}

Nginx站点目录文件及目录权限优化

单机LNMP环境目录权限严格控制措施

为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有的目录权限是755;所有的文件权限是644.

    chmod -R  /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

Nginx优化之日志优化,URL访问控制,防盗链,及站点文件目录优化的更多相关文章

  1. Nginx作为静态资源web服务之防盗链

    Nginx作为静态资源web服务之防盗链 首先,为什么需要防盗链,因为有些资源存在竞争对手的关系,比如淘宝的商品图片,不会轻易的让工具来爬虫爬走收集.但是如果使用防盗链,需要知道上一个访问的资源,然后 ...

  2. 用Nginx给网站做一个简单的防盗链

    目录结构 Nginx防盗链配置 有些时候,大家不想让别人调用自己的图片,一是因为个人版权的问题,再一点就是会增加服务器的负载.还会产生一些没必要的流量. 其实在Nginx里面,很容易就做到防盗链的,在 ...

  3. Nginx跨域访问场景配置和防盗链

    跨域访问控制 跨域访问 为什么浏览器禁止跨域访问 不安全,容易出现CSRF攻击! 如果黑客控制的网站B在响应头里添加了让客户端去访问网站A的恶意信息,就会出现CSRF攻击 Nginx如何配置跨域访问 ...

  4. nginx之旅(第二篇):nginx日志管理、nginx防盗链、nginx虚拟主机

    一.nginx日志管理 Nginx访问日志主要有两个参数控制 1) log_format #用来定义记录日志的格式(可以定义多种日志格式,取不不同名字即可) log_format log_name s ...

  5. 使用NGINX+LUA实现WAF功能 和nginx 防盗链

    使用NGINX+LUA实现WAF功能 一.了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: WAF) ...

  6. nginx实现防盗链

    有时候在浏览网页的时候,会遇到某些文件(图片等)无法访问的情况,这是因为图片的所有方做了防盗链机制 了解防盗链之前先了解下http referer这个属性,http referer是请求头中的一部分, ...

  7. Nginx学习之如何搭建文件防盗链服务

    前言 大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢? 这里推荐一款比较容易上手的神器,Nginx本身提供了secure_ ...

  8. nginx解决服务器宕机、解决跨域问题、配置防盗链、防止DDOS流量攻击

    解决服务器宕机 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { proxy_connect_timeout 1; proxy_send_timeout ...

  9. javaWeb 使用jsp标签进行防盗链

    /** * 1.新建类继承SimpleTagSupport * 新建2个属性, 添加对应的set方法 * 覆盖doTag()方法 */ import java.io.IOException; impo ...

随机推荐

  1. springboot Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

    报错如下: 在请求目标中发现无效字符.有效字符在RFC 7230和RFC 3986中定义. 原因是Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证. 就是 ...

  2. select * 和 select 字段的速度对比

    拿WordPress的数据库做一个对比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: ...

  3. Centos7.4安装RabbitMQ

    1.1 安装RabbitMQ 1.1.1 系统环境 [root@rabbitmq ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 ( ...

  4. 在DjangoAdmin中使用KindEditor(上传图片)

    一.下载 http://kindeditor.net/down.php 删除asp.asp.net.php.jsp.examples文件夹 拷贝到static目录下 二.配置 kindeditor目录 ...

  5. Linux 下升级Android Studio失败

    在Linux下进行升级的时候,会弹出一个窗口,有一个表格,从表中发现在进行某些更新某些包是没有权限,解决方法很简单,将Android Studio安装文件夹改成当前Linux登陆用户即可. 1.找到A ...

  6. Ubuntu打开系统监视器查看进程&资源等信息

    Ubuntu打开系统监视器查看进程&资源等信息 类似于Windows的任务管理器,Ubuntu也提供了系统监视器供用户管理进程及查看系统占用资源等 打开方式,终端输入如下命令: gnome-s ...

  7. c++中lambda表达式的用法

    #include <iostream> using namespace std; int main(){ ; auto func1 = [=](;}; auto func2 = [& ...

  8. html5shiv主要解决IE6-8 无法识别HTML5的新标签,父节点不能包裹子元素,以及应用CSS样式

    html5shivehtml5shiv主要IE6-8解决:1,HTML5提出的新的元素不被IE6-8识别.2,这些新元素不能作为父节点包裹子元素,3,并且不能应用CSS样式.让CSS 样式应用在未知元 ...

  9. java.util.Queue

    转载于:https://www.runoob.com/java/data-queue.html 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList ...

  10. java+http文件夹上传

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...