存档

作者存档

一文详解负载均衡和反向代理的真实区别(转)

2020年9月25日 没有评论

一、SLB 产生背景

 

SLB(服务器负载均衡):在多个提供相同服务的服务器的情况下,负载均衡设备存在虚拟服务地址,当大量客户端从外部访问虚拟服务IP地址时,负载均衡设备将这些报文请求根据负载均衡算法,将流量均衡的分配给后台服务器以平衡各个服务器的负载压力,避免在还有服务器压力较小情况下其他服务达到性能临界点出现运行缓慢甚至宕机情况,从而提高服务效率和质量。
因此对客户端而言,RS(real server 实际服务器)的IP地址即是负载均衡设备VIP(虚拟服务地址IP)地址,真正的RS服务器IP地址对于客户端是不可见的。

 

二、SLB 的三种传输模式

 

七层SLB和四层SLB的区别:
四层SLB:配置负载均衡设备上服务类型为tcp/udp,负载均衡设备将只解析到4层,负载均衡设备与client三次握手之后就会和RS建立连接;
七层SLB:配置负载均衡设备服务类型为 http/ftp/https 等,负载均衡设备将解析报文到7层,在负载均衡设备与client三次握手之后,只有收到对应七层报文,才会跟RS建立连接。
在负载均衡设备中,SLB主要工作在以下的三种传输模式中:

 

  • 反向代理模式
  • 透传模式
  • 三角模式

 

根据不同的模式,负载均衡设备的工作方式也不尽相同,但无论在哪种模式下,客户端发起的请求报文总是需要先到达负载均衡设备进行处理,这是负载均衡设备正常工作的前提。模拟网络拓扑环境:

 

  • Client:10.8.21.40
  • 负载均衡设备:172.16.75.83
  • VIP:172.16.75.84
  • RS1IP:172.16.75.82
  • RS2IP:172.16.75.85

 

在整个报文交互过程中,采用 Tcpdump 和 Wireshark 分别在 RS 和 Client 处抓包,然后使用 Wireshark 进行报文解析。

 

三、 反向代理模式

 

反向代理:普通的代理设备是内网用户通过代理设备出外网进行访问,而工作在这种模式下的负载均衡设备,则是外网用户通过代理设备访问内网,因此称之为反向代理。
在反向代理模式下:
当负载均衡设备收到客户端请求后,会记录下此报文( 源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引),将报文目的地址更改为优选后的RS设备的IP地址,目的端口号不变,源地址修改为负载均衡设备下行与对应RS设备接口的IP地址,源端口号随机发送给RS;
当RS收到报文后,会以源为RS接口IP地址,目的IP设备地址回复给负载均衡设备,负载均衡设备将源修改为VIP,目的端口号修改为客户端的源端口号,目的IP修改为Client的源IP回复报文。
查看报文解析结果:
配置完成后,Client 访问 RS 服务器,返回成功,整个报文交互过程如下 :
Client和负载均衡设备之间的报文交互过程
RS和负载均衡设备之间报文交互过程
结果分析
分析整个报文交互过程:
TCP握手过程:首先Client向负载均衡设备发送TCP SYN报文请求建立连接,源IP为Client的IP 10.8.21.40,源端口号50894,目的IP为VIP地址172.16.75.84,目的端口号80;
收到请求报文后,负载均衡设备会以源IP为VIP地址172.16.75.84,端口号80,目的IP 10.8.21.40,目的端口号50894回应SYN ACK报文;
Client收到报文后回复ACK报文,TCP三次握手成功。
HTTP报文交互过程:
当负载均衡设备与client完成三次握手后,因为配置的七层SLB,如果收到HTTP请求,就会根据负载均衡算法和服务器健康状态优选出对应的RS(在这次过程中选择的RS设备为172.16.75.82),然后与RS建立TCP连接:
负载均衡设备发送 TCP SYN 报文请求连接,源IP为负载均衡设备与RS相连接口IP 172.16.75.83,源端口号随机4574,目的IP为RS的IP 172.16.75.82,目的端口号80;
RS 收到报文后,以源 IP 172.16.75.82,端口号80,目的IP 172.16.75.83,目的端口号4574回复SYN ACK报文,负载均衡设备回复ACK报文建立三次握手;
之后,负载均衡设备再将收到的HTTP报文源IP修改为与RS相连下行接口IP地址172.16.75.83,源端口号为随机端口号,将报文发送给RS;当RS收到报文后,使用源为本地IP 172.16.75.82,目的IP为172.16.75.83进行回复,所以报文直接回复给负载均衡设备;
当负载均衡设备收到RS的回应报文后,将报文的源修改为VIP地址172.16.75.84,目的IP为10.8.21.40发送回 Client,再将目的端口号修改为HTTP请求报文中的源端口号,服务器访问成功。
由上述的过程可以看出,在RS端上,client的真实IP地址被负载设备修改成与RS相连接口的IP地址,所以RS无法记录到Client的访问记录,为了解决这个问题,可以采用在HTTP报文头中添加X-Forwarded-For字段,本文不做赘述,可以自行查询。

 

四、透传模式

 

当负载均衡设备工作在透传模式中时,RS无法感知到负载均衡设备的存在,对于Client来说,RS的IP地址就是负载均衡设备的VIP地址。
在这种模式下,当负载均衡设备收到源为 Client 的 IP,目的 IP 为本地 VIP 地址的报文时,会将报文根据负载均衡策略和健康状况发送给最优的 RS 设备上,继而RS设备会收到目的为本地IP,源为Client实际IP的请求报文;
然后RS将会直接回应此请求,报文的目的 IP 地址为 Client 的 IP 地址,当负载均衡设备收到此报文后,将源 IP 地址修改为 VIP 地址,然后将报文发送给 Client。
报文解析结果:
同样在 RS 端和 Client 端抓取交互报文:
Client 和负载均衡设备之间的报文交互过程

 

RS和负载均衡设备之间的报文交互过程

结果分析:

TCP握手过程:同反向代理模式交互过程

HTTP报文交互过程:

Client向负载均衡设备的VIP地址172.16.75.84以源IP 10.8.21.40发送HTTP请求,当负载均衡设备收到报文后,与优选后的RS进行TCP三次握手,过程同反向代理模式,然后将收到的HTTP报文,不改变报文的源IP地址和源/目的端口号,只修改目的IP修改为优选后的RS地址172.16.75.82;

当RS收到源来自IP 10.8.21.40的报文后,回复报文给IP地址10.8.21.40,此时要注意,必须在RS上配置回复报文经过负载均衡设备,负载均衡设备会将源IP修改为VIP地址172.16.75.84,然后转发给Client,否则Client将会收到源IP为172.16.75.82的HTTP报文,服务器访问失败。

 

 

五、 三角模式

 

在三角模式下,当客户端发送请求到负载设备上时,负载均衡设备会计算出最优RS,然后直接根据MAC地址将报文转发给RS,在RS上配置报文的源IP为VIP地址(一般配置在loopback口上),因此在这种情况下,RS会直接将报文发送给Client,即使回复报文经过负载均衡设备,此设备不做任何处理。由于报文在整个过程中传输途径类似于三角形,因此称之为三角模式。
报文解析结果
分别在Client端和RS端抓包,内容如下:
Client和负载均衡设备之间的报文交互过程
RS 和负载均衡设备之间的报文交互过程

 

结果分析

 

TCP握手过程:
由于采用了4层SLB,所以在TCP握手过程中与上述的7层SLB有些不同,当Client和RS完成三次握手之后,此时负载均衡设备会直接选择RS,然后跟RS建立TCP三次握手;
在三角模式环境中,由于RS的Loopback口和负载均衡设备上都存在着VIP地址172.16.75.84,当负载均衡设备经过负载均衡算法选择出对应的RS后,会根据实际配置的RS的IP地址对应的mac地址,将报文以目的mac为RS,目的IP为VIP的方式建立TCP连接。
HTTP报文交互过程:
首先Client向负载均衡设备的VIP发送HTTP请求,源为10.8.21.40,当负载均衡设备收到报文后,将报文直接转发给RS,当RS收到源IP为10.8.21.40,目的IP为本地Loopback口IP地址172.16.75.84的报文后,直接将报文回复给10.8.21.40,同样源为IP地址172.16.75.84,由此访问服务器成功。
在三角模式中,由于回复报文负载均衡设备不做任何处理,所以非常适合于RS到Client方向流量较大或者连接数目较多的组网环境。
采用三角模式时,必须注意RS有路由可以到达Client,并且在RS的Loopback接口上必须有负载均衡设备的VIP地址,否则即使RS设备收到Client的请求报文也会直接丢弃报文,不作回应。

 

六、总结

 

由于反向代理模式中在RS侧只能收到源为负载均衡设备IP的报文,因此可以使用防火墙增加安全性,只允许源IP为负载均衡设备的IP地址的报文通过,同时增加X-Forwarded-For字段也可以让RS只允许有此字段的报文进行访问,因此安全性相对较高。
作者:蹦蹦啪
链接:https://www.zhihu.com/question/20553431/answer/130698230

 

cisco 2960升级iso步骤

2020年8月3日 没有评论

手上有一台老的WS-C2960-48TT-L 交换机。要配置一些策略。还有ssh2、acl,发现无法进行命令不支持。查了下。原因是自己的iso太旧。不带k9的rom是不支持更多指令和相关功能的。

决定升级iso。步骤记录下来了。希望对大家有帮助。要用到一个工具。网上也有的下。主要就是bin的iso文件比较麻烦。

找了下,还是有好心人存了百度网盘。共享给大家:

https://yun.baidu.com/s/1gdCpCXX?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=

工具Cisco TFTP Server 建议在win7 win2008 win2012下使用。win10不支持

1、 配置IP地址好上传iOS和config.text文件

Switch#conf t

Switch(config)#int vlan 1

Switch(config)#ip add 192.168.0.254 255.255.0.0

Switch(config)#no shut

Switch(config)#end

Switch#ping 192.168.0.100 //电脑上配置的IP,要和上面的地址在一个网段

//ping通后说明网络没问题了,可以上传iOS和配置文件了

//把网线插入交换机的任意口,因为默认都在vlan1里

2、 上传iOS和配置文件

Switch#copy tftp: flash:

提示输入远程主机 192.168.0.100

提示输入要传的文件名(要注意带上后缀)c2960-lanbasek9-mz.122-50.SE10.bin

提示目的地文件名c2960-lanbasek9-mz.122-50.SE10.bin

传输开始,同上在把config.text文件也上传

3、 修改引导镜像

Switch#config t

Switch(config)#boot system flash: c2960-lanbasek9-mz.122-50.SE10.bin

Switch(config)#end

Switch#wr

Switch#reload

重启后进入查看是否启动新iOS,show version

确认后,copy flash:config.text system:running-config

Wr保存,至此升级和跟新配置完毕

分类: 解决方案 标签: ,

ubuntu18.04配置静态ip

2020年7月10日 没有评论

注意: 18.04和16.04不一样了,配置静态ip的方法有很大差异!

查找netplan目录下默认的网络配置文件,文件后缀为.yaml,我的是叫01-network-manager-all.yaml的文件。如果没有可以使用sudo gedit 01-network-manager-all.yam自己创建。

编辑网络配置文件01-network-manager-all.yaml,内容如下:
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
enp3s0: #配置的网卡名称,使用ifconfig -a查看得到
dhcp4: no #dhcp4关闭
addresses: [192.168.202.36/24] #设置本机IP及掩码
gateway4: 192.168.202.1 #设置网关
nameservers:
addresses: [192.168.202.1] #设置DNS

使用命令,使静态ip生效。
$ sudo netplan apply

误删/usr文件夹解决办法

2020年6月10日 没有评论

几个参考资料:

http://blog.chinaunix.net/uid-2623904-id-3044156.html

http://blog.csdn.net/xyw_blog/article/details/12996969

一般用光盘的救援模式解决,救援模式有什么作用:

◆可以更改root密码;
◆恢复硬盘、文件系统操作;
◆系统启动不来的时候,只能通过救援模式来启动;

进入resume模式。在进入resume模式过程中,会提示你的系统挂载在哪个位置。
一般挂载在/mnt/sysimage目录下。在/mnt/sysimage下有你系统的所有目录和文件,你可以根据你的需要将这些数据拷贝下来。

最后,进入bash模式.由于我是覆盖了我usr下得数据,我只需要覆盖/mnt/sysimage/下得usr目录即可。
cp -r /usr/ /mnt/sysimage/
ls /mnt/sysimage/usr (查看是否复制成功)
重启虚拟机,设置启动顺序。系统就成功修复了。(能使用基本命令)

在另一台与机器A相同的机器B上,使用tar命令将/usr目录打包。然后通过scp传给机器A,在A上将其解压,删除之前用Rescue模式拷贝进来的/usr目录,使用传递过来的usr目录,重启系统,现在可以正常进入系统了。但是存在的问题是,之前在系统中安装的软件需要重新编译安装。

分类: Linux, 解决方案 标签: ,

宝塔等Nginx环境添加允许跨域Header头问题补充

2020年5月2日 没有评论

宝塔等Nginx环境添加允许跨域Header头

我已宝塔面板为例:
点击站点修改
点击配置文件
在 39 行下面添加
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS’;
然后重启 nginx.
下面是通用 nginx 添加允许跨域header头

使用ngx_http_headers_module中的add_header指令,在响应头中添加允许跨域。

Syntax: add_header name value [always];
Default: —
Context: http, server, location, if in location
一般地,我们把允许跨域的头加在动态接口后面,比如 php,就加在解析 php 后面

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST;
注意,在实际中 Allow-Origin 不要指定为*,要设置为允许访问的域名,比如 http://abc.com

nginx通过CORS实现跨域

2020年4月10日 没有评论

1.CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
当前几乎所有的浏览器(Internet Explorer 8+, Firefox 3.5+, Safari 4+和 Chrome 3+)都可通过名为跨域资源共享(Cross-Origin Resource Sharing)的协议支持AJAX跨域调用。
Chrome,Firefox,Opera,Safari都使用的是XMLHttpRequest2对象,IE使用XDomainRequest。
简单来说就是跨域的目标服务器要返回一系列的Headers,通过这些Headers来控制是否同意跨域。跨域资源共享(CORS)也是未来的跨域问题的标准解决方案。
CORS提供如下Headers,Request包和Response包中都有一部分。

2.HTTP Response Header

Access-Control-Allow-Origin
Access-Control-Allow-Credentials
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Expose-Headers
Access-Control-Max-Age
HTTP Request Header

Access-Control-Request-Method
Access-Control-Request-Headers
其中最敏感的就是Access-Control-Allow-Origin这个Header, 它是W3C标准里用来检查该跨域请求是否可以被通过。(Access Control Check)。如果需要跨域,解决方法就是在资源的头中加入Access-Control-Allow-Origin 指定你授权的域。
启用CORS请求

假设您的应用已经在example.com上了,而您想要从www.example2.com提取数据。一般情况下,如果您尝试进行这种类型的AJAX调用,请求将会失败,而浏览器将会出现源不匹配的错误。利用CORS后只需www.example2.com 服务端添加一个HTTP Response头,就可以允许来自example.com的请求。

将Access-Control-Allow-Origin添加到某网站下或整个域中的单个资源

Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Credentials: true (可选)
将允许任何域向您提交请求

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true (可选)
3.提交跨域请求

如果服务器端已启用了CORS,那么提交跨域请求就和普通的XMLHttpRequest请求没什么区别。例如现在example.com可以向www.example2.com提交请求。

var xhr = new XMLHttpRequest();
// xhr.withCredentials = true; //如果需要Cookie等
xhr.open(‘GET’, ‘http://www.example2.com/hello.json’);
xhr.onload = function(e) {
var data = JSON.parse(this.response);

}
xhr.send();选)
对于简单请求,如GET,只需要在HTTP Response后添加Access-Control-Allow-Origin。
对于非简单请求,比如POST、PUT、DELETE等,浏览器会分两次应答。第一次preflight(method: OPTIONS),主要验证来源是否合法,并返回允许的Header等。第二次才是真正的HTTP应答。所以服务器必须处理OPTIONS应答。
流程如下

首先查看http头部有无origin字段;
如果没有,或者不允许,直接当成普通请求处理,结束;
如果有并且是允许的,那么再看是否是preflight(method=OPTIONS);
如果是preflight,就返回Allow-Headers、Allow-Methods等,内容为空;
如果不是preflight,就返回Allow-Origin、Allow-Credentials等,并返回正常内容。
用伪代码表示

location /pub/(.+) {
if ($http_origin ~ <允许的域(正则匹配)>) {
add_header ‘Access-Control-Allow-Origin’ “$http_origin”;
add_header ‘Access-Control-Allow-Credentials’ “true”;
if ($request_method = “OPTIONS”) {
add_header ‘Access-Control-Max-Age’ 86400;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS, DELETE’;
add_header ‘Access-Control-Allow-Headers’ ‘reqid, nid, host, x-real-ip, x-forwarded-ip, event-type, event-id, accept, content-type’;
add_header ‘Content-Length’ 0;
add_header ‘Content-Type’ ‘text/plain, charset=utf-8′;
return 204;
}
}
# 正常nginx配置
……
}
Nginx配置实例
实例一:允许example.com的应用在www.example2.com上跨域提取数据

在nginx.conf里找到server项,并在里面添加如下配置

location /{

add_header ‘Access-Control-Allow-Origin’ ‘http://example.com’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Headers’ ‘Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With’;
add_header ‘Access-Control-Allow-Methods’ ‘GET,POST,OPTIONS’;

}
如果需要允许来自任何域的访问,可以这样配置

add_header Access-Control-Allow-Origin *;
注释如下

第一条指令:授权从example.com的请求(必需)

第二条指令:当该标志为真时,响应于该请求是否可以被暴露(可选)

第三条指令:允许脚本访问的返回头(可选)

第四条指令:指定请求的方法,可以是GET, POST, OPTIONS, PUT, DELETE等(可选)

重启Nginx

$ service nginx reload
测试跨域请求

$ curl -I -X OPTIONS -H “Origin: http://example.com” http://www.example2.com
成功时,响应头是如下所示

HTTP/1.1 200 OK
Server: nginx
Access-Control-Allow-Origin: example.com
实例二:Nginx允许多个域名跨域访问

由于Access-Control-Allow-Origin参数只允许配置单个域名或者 * ,当我们需要允许多个域名跨域访问时可以用以下几种方法来实现。

方法一
如需要允许用户请求来自www.example.com、m.example.com、wap.example.com访问www.example2.com域名时,返回头Access-Control-Allow-Origin,具体配置如下

在nginx.conf里面,找到server项,并在里面添加如下配置

map $http_origin $corsHost {
default 0;
“~http://www.example.com” http://www.example.com;
“~http://m.example.com” http://m.example.com;
“~http://wap.example.com” http://wap.example.com;
}

server
{
listen 80;
server_name www.example2.com;
root /usr/share/nginx/html;
location /
{
add_header Access-Control-Allow-Origin $corsHost;
}
}
方法二
如需要允许用户请求来自localhost、www.example.com或m.example.com的请求访问xxx.example2.com域名时,返回头Access-Control-Allow-Origin,具体配置如下

在Nginx配置文件中xxx.example2.com域名的location /下配置以下内容

set $cors ”;
if ($http_origin ~* ‘https?://(localhost|www\.example\.com|m\.example\.com)’) {
set $cors ‘true’;
}

if ($cors = ‘true’) {
add_header ‘Access-Control-Allow-Origin’ “$http_origin”;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, PUT, DELETE, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With’;
}

if ($request_method = ‘OPTIONS’) {
return 204;
}
方法三
如需要允许用户请求来自*.example.com访问xxx.example2.com域名时,返回头Access-Control-Allow-Origin,具体配置如下

在Nginx配置文件中xxx.example2.com域名的location /下配置以下内容

if ( $http_origin ~ http://(.*).example.com){
set $allow_url $http_origin;
}
#CORS(Cross Orign Resource-Sharing)跨域控制配置
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin $allow_url;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers ‘x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp’;
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods ‘POST,GET,OPTIONS,PUT,DELETE’;
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers ‘WWW-Authenticate,Server-Authorization’;
#P3P支持跨域cookie操作
add_header P3P ‘policyref=”/w3c/p3p.xml”, CP=”NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC”‘;
方法四
如需要允许用户请求来自xxx1.example.com或xxx1.example1.com访问xxx.example2.com域名时,返回头Access-Control-Allow-Origin,具体配置如下

在Nginx配置文件中xxx.example2.com域名的location /下配置以下内容

location / {

if ( $http_origin ~ .*.(example|example1).com ) {
add_header Access-Control-Allow-Origin $http_origin;
}
}
实例三:Nginx跨域配置并支持DELETE,PUT请求

默认Access-Control-Allow-Origin开启跨域请求只支持GET、HEAD、POST、OPTIONS请求,使用DELETE发起跨域请求时,浏览器出于安全考虑会先发起OPTIONS请求,服务器端接收到的请求方式就变成了OPTIONS,所以引起了服务器的405 Method Not Allowed。

解决方法

首先要对OPTIONS请求进行处理

if ($request_method = ‘OPTIONS’) {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
#其他头部信息配置,省略…
return 204;
}
当请求方式为OPTIONS时设置Allow的响应头,重新处理这次请求。这样发出请求时第一次是OPTIONS请求,第二次才是DELETE请求。

# 完整配置参考
# 将配置文件的放到对应的server {}里

add_header Access-Control-Allow-Origin *;

location / {
if ($request_method = ‘OPTIONS’) {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
return 204;
}
index index.php;
try_files $uri @rewriteapp;
}
实例四:更多配置示例

示例一

The following Nginx configuration enables CORS, with support for preflight requests.

#
# Wide-open CORS config for nginx
#
location / {
if ($request_method = ‘OPTIONS’) {
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS’;
#
# Custom headers and headers various browsers *should* be OK with but aren’t
#
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;
#
# Tell client that this pre-flight info is valid for 20 days
#
add_header ‘Access-Control-Max-Age’ 1728000;
add_header ‘Content-Type’ ‘text/plain charset=UTF-8′;
add_header ‘Content-Length’ 0;
return 204;
}
if ($request_method = ‘POST’) {
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;
}
if ($request_method = ‘GET’) {
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;
}
}
示例二

if ($request_method = ‘OPTIONS’) {
add_header ‘Access-Control-Allow-Origin’ ‘https://docs.domain.com’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, PUT, DELETE, PATCH, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,token’;
return 204;
}
if ($request_method = ‘POST’) {
add_header ‘Access-Control-Allow-Origin’ ‘https://docs.domain.com’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, PUT, DELETE, PATCH, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,token’;
}
if ($request_method = ‘GET’) {
add_header ‘Access-Control-Allow-Origin’ ‘https://docs.domain.com’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, PUT, DELETE, PATCH, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,token’;
}
其它技巧
Apache中启用CORS

在httpd配置或.htaccess文件中添加如下语句

SetEnvIf Origin “^(.*\.example\.com)$” ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin “%{ORIGIN_SUB_DOMAIN}e” env=ORIGIN_SUB_DOMAIN
PHP中启用CORS

通过在服务端设置Access-Control-Allow-Origin响应头

允许所有来源访问

header("Access-Control-Allow-Origin: *");
?>
允许来自特定源的访问

header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
?>
配置多个访问源
由于浏览器实现只支持了单个origin、*、null,如果要配置多个访问源,可以在代码中处理如下

$allowed_origins = array(
"http://www.example.com" ,
"http://app.example.com" ,
"http://cms.example.com" ,
);
if (in_array($_SERVER['HTTP_ORIGIN'], $allowed_origins)){
@header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
}
?>
HTML中启用CORS

CentOS6.x升级到7

2020年3月13日 没有评论

1、查看当前CentOS版本
cat /etc/redhat-release

2、更新源
vim /etc/yum.repos.d/upgrade.repo 并输入以下内容:
[upgrade]
name=upgrade
baseurl=https://buildlogs.centos.org/centos/6/upg/x86_64/
enable=1
gpgcheck=0

3、卸载6.x自带的较新的助手,并安装老版[否则会报错]
yum erase openscap -y
yum install http://dev.centos.org/centos/6/upg/x86_64/Packages/openscap-1.0.8-1.0.1.el6.centos.x86_64.rpm -y

4、安装助手
yum install redhat-upgrade-tool preupgrade-assistant-contents -y

5、检测版本升级的风险,如果控制台输出了错误信息,则需要查询下解决方案并解决
preupg -s CentOS6_7

6、导入CentOS7的key
rpm –import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7

7、开始升级
centos-upgrade-tool-cli –network 7 –instrepo=http://vault.centos.org/centos/7.2.1511/os/x86_64/

8、国内服务器需经过漫长的等待

8、更新完后,重启服务器
reboot

升级完成后遇到的问题:

1、ssh、yum不可用问题:
vi /root/start.sh #输入以下内容:
#!/bin/bash
ln -s /usr/lib64/libsasl2.so.3.0.0 /usr/lib64/libsasl2.so.2
ln -s /usr/lib64/libpcre.so.1.2.0 /usr/lib64/libpcre.so.0
service sshd restart
rm -rf /etc/rc.d/rc.local?
mv /etc/rc.d/rc.local.bak /etc/rc.d/rc.local #恢复原始文件
rm -rf /root/start.sh #删除自身

#执行以下命令
chmod +x start.sh
chmod +x /etc/rc.d/rc.local
cp /etc/rc.d/rc.local /etc/rc.d/rc.local.bak #创建备份
echo ‘bash /root/start.sh’ >>/etc/rc.d/rc.local #添加脚本为开机自启动

#重启,后看下ssh是否可以正常连接
reboot

2、 ps工具不可用问题:
yum upgrade -y
yum downgrade grep
yum upgrade python
yum update

分类: Linux, 解决方案 标签: ,

CentOS 7 下搭建高可用集群(转)

2020年2月27日 没有评论

一、安装集群软件
必须软件pcs,pacemaker,corosync,fence-agents-all,如果需要配置相关服务,也要安装对应的软件。

二、配置防火墙
1、禁止防火墙和selinux
# systemctl disable firewalld
# systemctl stop firewalld
2、设置防火墙规则
# firewall-cmd –permanent –add-service=high-availability
# firewall-cmd –add-service=high-availability
三、各节点之间主机名互相解析
分别修改2台主机名分别为node1和node2,在CentOS 7中直接修改/etc/hostname加入本机主机名和主机表,然后重启网络服务即可。

#vi /etc/hostname
node1
#systemctl restart network.service
#hostname
node1
配置2台主机的主机表,在/etc/hosts中加入

192.168.122.168 node1
192.168.122.169 node2
四、各节点之间时间同步
在node1和node2分别进行时间同步,可以使用ntp实现。

[root@node1 ~]# ntpdate 172.16.0.1 //172.16.0.1 为时间服务器
五、各节点之间配置ssh的无密码密钥访问
下面的操作需要在各个节点上操作。

# ssh-keygen -t rsa -P ‘’ #这个生成一个密码为空的公钥和一个密钥,把公钥复制到对方节点上即可
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@node2 #对方主机名用登录用户名
两台主机都要互相可以通信,所以两台主机都得互相生成密钥和复制公钥,相互的节点上的hosts文件是都要解析对方的主机名, 192.168.122.168 node1 192.168.122.169 node2

# ssh node2 ‘date’;date #测试一下是否已经互信
六、通过pacemaker来管理高可用集群
1、创建集群用户
为了有利于各节点之间通信和配置集群,在每个节点上创建一个hacluster的用户,各个节点上的密码必须是同一个。

# passwd hacluster

Changing password for user hacluster.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
2、设置pcsd开机自启动
# systemctl start pcsd.service
# systemctl enable pcsd.service
3、集群各节点之间进行认证
# pcs cluster auth node1 node2Username: hacluster Password: node1: Authorized node2: Authorized
4、创建并启动集群
[root@z1 ~]# pcs cluster setup –start –name my_cluster node1 node2

node1: Succeeded
node1: Starting Cluster…
node2: Succeeded
node2: Starting Cluster…
5、设置集群自启动
# pcs cluster enable –all
6、查看集群状态信息
[root@z1 ~]# pcs cluster status
7、设置fence设备
这个可以参考
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默 认配置目前尚不可用,这可以通过如下命令验证:

#crm_verify -L -V
可以通过如下面命令禁用stonith:

#pcs property set stonith-enabled=false(默认是true)
8、配置存储
高可用集群既可以使用本地磁盘来构建纯软件的镜像型集群系统,也可以使用专门的共享磁盘装置来构建大规模的共享磁盘型集群系统,充分满足客户的不同需求。
共享磁盘主要有iscsi或DBRD。本文并没有使用共享磁盘

9、配置浮点ip
不管集群服务在哪运行,我们要一个固定的地址来提供服务。在这里我选择192.168.122.101作为浮动IP,给它取一个好记的名字 ClusterIP 并且告诉集群 每30秒检查它一次。

# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.122.170 cidr_netmask=24 op monitor interval=30s
# pcs update VIP op monitor interval=15s
10、配置apache服务
在node1和node2上安装httpd ,确认httpd开机被禁用。

# systemctl status httpd.service;
配置httpd监控页面(貌似不配置也可以通过systemd监控),分别在node1和node2上执行。

# cat > /etc/httpd/conf.d/status.conf << EOF
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost
EOF
首先我们为Apache创建一个主页。在centos上面默认的Apache docroot是/var/www/html,所以我们在这个目录下面建立一个主页。
node1节点修改如下:

[root@node1 ~]# cat

Hello node1

END
node2节点修改如下:

[root@node2 ~]# cat

Hello node2

END
下面语句是将httpd作为资源添加到集群中:

#pcs resource create WEB apache configfile=”/etc/httpd/conf/httpd.conf” statusurl=”http://127.0.0.1/server-status”
11、创建group
将VIP和WEB resource捆绑到这个group中,使之作为一个整体在集群中切换(此配置为可选)。

# pcs resource group add MyGroup VIP
# pcs resource group add MyGroup WEB
12、配置服务启动顺序
以避免出现资源冲突,语法:(pcs resource group add的时候也可以根据加的顺序依次启动,此配置为可选)。

# pcs constraint order [action] then [action]
# pcs constraint order start VIP then start WEB
13、指定优先的 Location (此配置为可选)
Pacemaker 并不要求你机器的硬件配置是相同的,可能某些机器比另外的机器配置要好。这种状况下我们会希望设置:当某个节点可用时,资源就要跑在上面之类的规则。为了达到这个效果我们创建location约束。同样的,我们给他取一个描述性的名字(prefer-node1),指明我们想在上面跑WEB 这个服务,多想在上面跑(我们现在指定分值为50,但是在双节点的集群状态下,任何大于0的值都可以达到想要的效果),以及目标节点的名字:

# pcs constraint location WEB prefers node1=50
# pcs constraint location WEB prefers node2=45
这里指定分值越大,代表越想在对应的节点上运行。

14、资源粘性(此配置为可选)
一些环境中会要求尽量避免资源在节点之间迁移,迁移资源通常意味着一段时间内无法提供服务,某些复杂的服务,比如Oracle数据库,这个时间可能会很长。为了达到这个效果,Pacemaker 有一个叫做“资源粘性值”的概念,它能够控制一个服务(资源)有多想呆在它正在运行的节点上。
Pacemaker为了达到最优分布各个资源的目的,默认设置这个值为0。我们可以为每个资源定义不同的粘性值,但一般来说,更改默认粘性值就够了。资源粘性表示资源是否倾向于留在当前节点,如果为正整数,表示倾向,负数则会离开,-inf表示负无穷,inf表示正无穷。

# pcs resource defaults resource-stickiness=100
常用命令汇总:
查看集群状态:#pcs status

查看集群当前配置:#pcs config

开机后集群自启动:#pcs cluster enable –all

启动集群:#pcs cluster start –all

查看集群资源状态:#pcs resource show

验证集群配置情况:#crm_verify -L -V

测试资源配置:#pcs resource debug-start resource

设置节点为备用状态:#pcs cluster standby node1

分类: Linux, 解决方案 标签: ,

Centos7 firewalld·动态防火墙使用方法示例

2020年1月9日 没有评论

# systemctl start firewalld # 启动,
# systemctl enable firewalld # 开机启动
# systemctl stop firewalld # 关闭
# systemctl disable firewalld # 取消开机启动
具体的规则管理,可以使用firewall-cmd ,具体的使用方法可以
$ firewall-cmd –help

–zone=NAME # 指定 zone
–permanent # 永久修改,–reload 后生效
–timeout=seconds # 持续效果,到期后自动移除,用于调试,不能与 –permanent 同时使用
1. 查看规则

查看运行状态
$ firewall-cmd –state
查看已被激活的 Zone 信息
$ firewall-cmd –get-active-zones
public
interfaces: eth0 eth1
查看指定接口的 Zone 信息
$ firewall-cmd –get-zone-of-interface=eth0
public
查看指定级别的接口
$ firewall-cmd –zone=public –list-interfaces
eth0
查看指定级别的所有信息,譬如 public

$ firewall-cmd –zone=public –list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client http ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

查看所有级别被允许的信息
$ firewall-cmd –get-service
查看重启后所有 Zones 级别中被允许的服务,即永久放行的服务
$ firewall-cmd –get-service –permanent
2. 管理规则

# firewall-cmd –panic-on # 丢弃
# firewall-cmd –panic-off # 取消丢弃
# firewall-cmd –query-panic # 查看丢弃状态
# firewall-cmd –reload # 更新规则,不重启服务
# firewall-cmd –complete-reload # 更新规则,重启服务
添加某接口至某信任等级,譬如添加 eth0 至 public,永久修改
# firewall-cmd –zone=public –add-interface=eth0 –permanent

设置 public 为默认的信任级别
# firewall-cmd –set-default-zone=public
a. 管理端口

列出 dmz 级别的被允许的进入端口
# firewall-cmd –zone=dmz –list-ports

允许 tcp 端口 8080 至 dmz 级别
# firewall-cmd –zone=dmz –add-port=8080/tcp

允许某范围的 udp 端口至 public 级别,并永久生效
# firewall-cmd –zone=public –add-port=5060-5059/udp –permanent

b. 网卡接口

列出 public zone 所有网卡
# firewall-cmd –zone=public –list-interfaces

将 eth0 添加至 public zone,永久
# firewall-cmd –zone=public –permanent –add-interface=eth0

eth0 存在与 public zone,将该网卡添加至 work zone,并将之从 public zone 中删除
# firewall-cmd –zone=work –permanent –change-interface=eth0

删除 public zone 中的 eth0,永久
# firewall-cmd –zone=public –permanent –remove-interface=eth0

c. 管理服务

添加 smtp 服务至 work zone
# firewall-cmd –zone=work –add-service=smtp

移除 work zone 中的 smtp 服务
# firewall-cmd –zone=work –remove-service=smtp

d. 配置 external zone 中的 ip 地址伪装

查看
# firewall-cmd –zone=external –query-masquerade

打开伪装
# firewall-cmd –zone=external –add-masquerade

关闭伪装
# firewall-cmd –zone=external –remove-masquerade

e. 配置 public zone 的端口转发

要打开端口转发,则需要先
# firewall-cmd –zone=public –add-masquerade

然后转发 tcp 22 端口至 3753
# firewall-cmd –zone=public –add-forward-port=port=22:proto=tcp:toport=3753

转发 22 端口数据至另一个 ip 的相同端口上
# firewall-cmd –zone=public –add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100

转发 22 端口数据至另一 ip 的 2055 端口上
# firewall-cmd –zone=public –add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100

f. 配置 public zone 的 icmp

查看所有支持的 icmp 类型
# firewall-cmd –get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded

列出
# firewall-cmd –zone=public –list-icmp-blocks

添加 echo-request 屏蔽
# firewall-cmd –zone=public –add-icmp-block=echo-request [--timeout=seconds]

移除 echo-reply 屏蔽
# firewall-cmd –zone=public –remove-icmp-block=echo-reply

g. IP 封禁

# firewall-cmd –permanent –add-rich-rule=”rule family=’ipv4′ source address=’222.222.222.222′ reject”

分类: Linux 标签: ,

rm删除文件恢复

2019年12月3日 没有评论

误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各种风险问题。方法总比问题多~
说在前面的话
针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收站,删除后的文件可以到垃圾箱寻回,要知道linux文件修复比较费劲,网络上面的文档也是五花八门。所以本次研究一种比较靠谱的文件和目录恢复方法,也给维护人员留一条后路。
分析对比debugfs. testdisk 6.14. extundelete,对比各自官网介绍和操作说明本次决定研究extundelete对文件和目录的恢复操作。
extundelete下载官网地址:https://pkgs.org/download/extundelete

Linux下文件误删除,使用extundelete恢复测试过程
1. 给虚拟主机添加一块磁盘,磁盘为/dev/sdb,如下:

2. 格式化磁盘,并进行挂载
3. # mkfs.ext4 /dev/sdb
4. # mkdir /usr/local/dbdata/
# mount /dev/sdb /usr/local/dbdata/

5. 测试误操作删除以下文件
6. /usr/local/dbdata/gperftools-2.4.tar.gz #文件
7.
/usr/local/dbdata/pcre-8.32 #目录
执行误操作:
# rm -rf /usr/local/dbdata/gperftools-2.4.tar.gz /usr/local/dbdata/pcre-8.32
8. 将误操作所在分区进行只读保护
如果确定文件被误删,在没有备份的情况下请马上对分区实施写入保护(预防新的写入覆盖误删的块数据,因此权限给只读):
# mount -o remount,ro /dev/sdb
# mount -o remount,ro /usr/local/dbdata/
9. 数据恢复工具安装
工具安装部署
官方网站是http://extundelete.sourceforge.net/ ,其目前的稳定版本是extundelete-0.2.4.
工具下载
# wget https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
解压安装
依赖包
# yum -y install gcc-c++ e2fsprogs.x86_64 e2fsprogs-devel.x86_64
# tar -jxvf extundelete-0.2.4.tar.bz2
# cd extundelete-0.2.4
# ./configure
# make && make install
验证安装结果
# extundelete -v
10. 文件恢复过程
恢复指定文件:
原理:从根节点(inode=2)开始找到被删除文件的i节点,然后recover i节点。
以下是模拟删除gperftools-2.4.tar.gz(文件)和pcre-8.32 (目录)
先检测被删除的文件有哪些:
# extundelete /dev/sdb –inode 2

从圈出来的可以看到,有以下两个
gperftools-2.4.tar.gz 15 Deleted

pcre-8.32 655361 Deleted
注意:恢复过程不要在误删分区进行,谨防inode. block块相互覆盖
先恢复文件(可根据文件名进行恢复):
# extundelete /dev/sdb –restore-file gperftools-2.4.tar.gz

恢复目录(根据目录名恢复):
# extundelete /dev/sdb –restore-directory pcre-8.32

最后会在当前目录下看到一个名为RECOVERED_FILES的目录,在目录里就可以看到被误删除的文件以及目录:
说在后面的话

根据上面操作证明extundelete 工具可以实现对误删数据的恢复,而且操作简单。
总结:
1. 使用rm一定要谨慎
2. 磁盘按照功能进行分区是必要的
3. 最少掌握一种数据恢复方式