• Nginx优化之日志优化,URL访问控制,防盗链,及站点文件目录优化


    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
  • 相关阅读:
    AngularJS(17)-Angular小程序
    AngularJS(16)-路由
    AngularJS(15)-依赖注入
    AngularJS(14)-动画
    AngularJS(13)-包含
    AngularJS(12)-BootStrap集成
    AngularJS(11)-API
    AngularJS(10)-数据验证
    Mysql 备份和恢复.sql文件,导入.csv文件
    Mysql group_concat()
  • 原文地址:https://www.cnblogs.com/ywrj/p/9392600.html
Copyright © 2020-2023  润新知