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目录的访问才能降低网站被入侵的风险

nginx异步日志 nginx日志优化_Nginx

 

 

服务器角色

权限处理

安全系数

动态Web集群

目录权限755,文件权限644,所用目录,以及文件用户和组都是root。环境为Nginx+PHP

文件不能被改,目录不能被写入,安全系数10

static图片集群

目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。环境为Nginx

文件不能被改,目录不能被写入,安全系数10

上传upload集群

目录权限755,文件权限644,所用的目录,以及文件用户和组都是root。特别:用户上传的目录设置为755,用户和组使用Nginx服务配置的用户

文件不能被改,目录不能被写入,但是用户上传的目录允许写入文件且需要通过Nginx的其他功能来禁止读文件,安全系数8