使用Nginx解决跨域,防盗链,宕机,DDOS攻击

Posted 天戈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Nginx解决跨域,防盗链,宕机,DDOS攻击相关的知识,希望对你有一定的参考价值。

一:负载均衡时服务器宕机轮询策略

在通过代理服务器nginx向真实的服务器发送请求时,如果有一个服务器集群,它们按照轮询或者权重的负载均衡策略运作下去,当轮到a(端口6060)服务器接受nginx的请求时,

a服务器突然宕机了,那么没有做任何措施的情况下,这个请求会一直请求下去,直到被响应或者响应超时报错,这种情况下需要添加一些配置,

当有服务器宕机的时候,在一定时间内他没有响应,就换另一个服务器去接受这个请求

在负载均衡的配置基础上添加新的配置,下面字体

upstream backserver { server www.eureka7001.com:6060 weight=20; server www.eureka7002.com:6061 weight=10; }
    server {
        listen       80;
        server_name  localhost;
        #note.java.itcast.cn
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
    
        location /myServlet {
            proxy_connect_timeout 1;//后端服务器连接的超时时间_发起握手等候响应超时时间(单位都为秒)
            proxy_send_timeout 1;  //后端服务器处理请求的时间
            proxy_read_timeout 1;  //后端服务器数据回传时间
            proxy_pass http://backserver/myServlet;
            index index.html index.htm;
        }

测试过程,在正常轮询策略中,当准备轮到6060的时候将服务器停掉,接下来的所有请求都会发送到6061,直到6060重新回到集群中

二:解决ajxa请求跨域问题

跨域场景:在当前域名请求网站中,默认不允许通过ajax请求发送其他域名。

当在a服务器的页面中发生ajax请求其他域(这里指http://eureka7002.com:6061/)的资源时,浏览器的控制台就会抛出异常信息

方法一:在nginx配置里添加请求头

  server {
        listen       80;
        server_name  www.eureka7003.com;
        #note.java.itcast.cn
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
        location /B {
            add_header \'Access-Control-Allow-Origin\' $http_origin;
            add_header \'Access-Control-Allow-Credentials\' \'true\';
            add_header \'Access-Control-Allow-Methods\' \'GET, POST, OPTIONS\';
            add_header \'Access-Control-Allow-Headers\' \'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range\';
            add_header \'Access-Control-Expose-Headers\' \'Content-Length,Content-Range\';
            if ($request_method = \'OPTIONS\') {
                add_header \'Access-Control-Max-Age\' 1728000;
                add_header \'Content-Type\' \'text/plain; charset=utf-8\';
                add_header \'Content-Length\' 0;
                return 204;
            }
            proxy_pass http://www.eureka7002.com:6061/B/;
            index index.html index.htm;
            #proxy_pass http://note.java.itcast.cn;
            #proxy_redirect default;
            #root   html;
            #index  index.html index.htm;
        }

方法二:在nginx中进行转发

server {
                listen       80;
                server_name  www.eureka7003.com;

                #charset koi8-r;

                #access_log  logs/host.access.log  main;

                location /a {
                    proxy_pass http://www.eureka7002.com:6061/a/;
                    index index.html index.htm;
                }
                location /b {
                    proxy_pass http://www.eureka7001.com:6060/b/;
                    index index.html index.htm;
                }
            }

浏览器请求:

    $("#button").click(function () {
                    $.ajax({
                        url:"http://www.eurker7003.com/B/myServlet?username="+$("#username").val(),
                        type:"GET",
                        success:function (result) {
                            alert(result);
                        }
                    })
                });

三:防盗链

场景:在A工程中有一张houzi.jpg的图片,在不做任何处理的时候,不但当前工程可以访问到这张图片,其他的工程和直接访问图片路径都是可以请求到的

为了让其它的不属于A工程的方式请求到该资源,我们可以通过添加防盗链的方式进行处理

hosts文件

    127.0.0.1       www.eureka7001.com
    127.0.0.1       www.eureka7002.com
    127.0.0.1          www.fdl.com

B工程中的请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>welcome</h1>
<img src="http://www.fdl.com/A/images/houzi.jpg">
</body>
</html>

nginx.conf

    server {
        listen       80;
        server_name  www.fdl.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #拦截请求中以这些格式结尾的请求
        location ~ .*\\.(jpg|jpeg|JPG|png|gif|icon)$ {    
            #为空或者不包含
            valid_referers blocked http://www.fdl.com www.fdl.com;
                    if ($invalid_referer) {
                        rewrite ^/ http://www.eureka7001.com:6060/A/images/error.png;  #返回图片资源
                        #return 403; 返回状态码
                    }    
        }
    #先将所有请求A工程的作反向代理 location
/A { proxy_pass http://www.eureka7001.com:6060/A/; index index.html index.htm; }

 B工程中请求

 

 直接请求

 

 四:防止DDOS流量攻击

 分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个

1.限制请求率

#允许一个地址一秒只能请求一次
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen       80;
        server_name  www.fdl.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
        location /A {
            limit_req zone=one;
            proxy_pass http://www.eureka7001.com:6060/A/;
            index index.html index.htm;
                }        

}

2.限制连接次数

#某个IP对A的请求连接不超过十个
limit_conn_zone $binary_remote_addr zone=addr:10m;
 
server {
    ...
    location /A {
        limit_conn addr 10;
        ...
    }
}

以上是关于使用Nginx解决跨域,防盗链,宕机,DDOS攻击的主要内容,如果未能解决你的问题,请参考以下文章

Nginx----跨域,防盗链

Nginx 跨域和防盗链支持

09Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域

Nginx反向代理负载均衡动静分离缓存压缩防盗链跨域访问

nginx的优化和防盗链

通过Nginx和Nginx Plus阻止DDoS攻击