使用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;
        ...
    }
}

原文地址:https://www.cnblogs.com/yjc1605961523/p/12291061.html

时间: 2024-11-02 01:07:00

使用Nginx解决跨域,防盗链,宕机,DDOS攻击的相关文章

使用nginx解决跨域问题(flask为例)

背景 我们单位的架构是在api和js之间架构一个中间层(python编写),以实现后端渲染,登录状态判定,跨域转发api等功能.但是这样一个中间会使前端工程师的工作量乘上两倍,原本js可以直接ajax请求api,但是我们不得不ajax请求中间层,中间层再请求api.如图: 为了少敲代码,提高工作效率,我们当然希望将python中间层砍掉,但是如何解决以下三个问题,成为关键: 后端渲染 登录状态判定 跨域转发api 关于1,2我会在另外两篇博客中详细叙述,这篇文章主要解决3,也就是跨域问题.解决跨

Nginx解决跨域

一.静态页面服务器 nginx.conf 的配置(其实默认的也是如此,所以作为静态服务器只需要将静态文件移动到nginx下的html文件夹里就可以了) server {      listen       8094; #监听端口      server_name  localhost; # #charset koi8-r; #access_log  logs/host.access.log  main; location / {          root   html;#文件根目录      

nginx 解决跨域需要几行

在指定的主机location 下添加以下语句便可; 如: location / {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested- With,If-Modif

使用Nginx来解决跨域的问题

nginx的版本:(查看nginx命令: /usr/local/nginx/sbin/nginx -v) nginx/1.4.3 问题是:前端项目域名是 a.xxxx.com, 后端的接口域名是 b.xxx.com,然后后端接口没有设置跨域相关的响应设置头,因此就接口和我们域名就会存在跨域的情况,因此我们可以使用 nginx服务器来配置一下: 网上很多资料将 在nginx配置下 加如下代码就可以解决跨域的问题: add_header Access-Control-Allow-Origin *;

前端通过Nginx反向代理解决跨域问题

本文探讨了前端如何通过Nginx反向代理的方式解决跨域问题. 跨域 再次重申: 跨域是浏览器行为,不是服务器行为. 实际上,请求已经到达服务器了,只不过在回来的时候被浏览器限制了.就像Python他可以进行抓取数据一样,不经过浏览器而发起请求是可以得到数据,想到通过Nginx的反向代理来解决跨域问题. 代理 所谓代理就是在我们和真实的服务器之间有一台代理服务器,我们所有的请求都是通过它来进行转接的. 正向代理 正向代理就是我们访问不了Google,但是我在国外有一台vps,它可以访问Google

vue前后端分离解决跨域问题

用Vue-cli脚手架搭建了个demo,前后分离就有跨域问题的出现. vue-clie搭建demo步骤(传送门):https://www.cnblogs.com/wangenbo/p/8487764.html 我自己在网上找了2个接口做测试: CSDN:https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1524276761019196&first_view=false 掘金:https://

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

解决服务器宕机 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { proxy_connect_timeout 1; proxy_send_timeout 1; proxy_read_timeout 1; proxy_pass http://backserver; index index.html index.htm; } proxy_connect_timeout 1; :连接超时1秒 proxy_send_timeout 1; :请求超时1秒 pr

使用CORS解决跨域问题

1.什么是动静分离 "动"与"静" 在弄清动静分离之前,我们要先明白什么是动,什么是静. 在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指Html.img.js.css等文件. 动静分离就是将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离. 好处

前端开发如何独立解决跨域问题

背景 跨域是由浏览器同源策略引起的,是指页面请求的接口地址,必须与页面url地址处于同域上(即域名,端口,协议相同).这是为了防止某域名下的接口被其他域名下的网页非法调用,是浏览器对JavaScript施加的安全限制. 这个措施出发点是好的,但在项目开发的过程中,常常给前端开发者带来麻烦. 由于页面开发中,静态资源是放在本地电脑上的,访问这些资源通常通过IP方式(127.0.0.1)或者localhosts来访问,与线上服务器所在域名不符,不能顺利进行接口调用. 解决跨域问题常用的解决方案有两个