跨域问题
问题:浏览器拒绝执行其他域名下的 ajax 请求
由来:如果浏览器可以在某域名下访问其他域名的内容 来填充自己的页面,那么互联网秩序将混乱。为了防止这种混乱,W3C 组织制定了浏览器安全规范,即 html 页面发起的 ajax 请求仅 限于同域名后段范围,跨域 域名的 ajax 请求不得执行,此谓之 跨域问题。
解决方法:
Jsonp
w3c 指定的规则不允许ajax跨域请求,但是允许 script 标签发起跨域请求。
所以,可以通过 扩展 script标签 src 源的方法 来跨域,这就是 Jsnop 解决方法。
不足:
- jsonp 只能解决Get类的请求
- 使用此方法,对应的后台程序必须对结果进行改造。将返回值做一个函数式包装。这对业务有较大侵入性,增加开发人员负担。
cors 方案
如果B公司同意将自己的内容分享给A公司,跨域限制可以放开,此即 CORS 解决方案
nginx 配置跨域操作
- 对于比较简单的http请求(GET,POST,HEAD类型),无需浏览器来问,nginx 服务器直接在响应头部,加入同意跨域的信号即可。
add_header Access-Control-Allow-Origin http://xxx.xxx.com;
防盗链
目标:让资源只能在自己的页面显示,不能被其他页面引用
解决办法:
浏览器发起的任何请求,在请求头中,都会标注请求发起的URL,如下:
Refer: http://xxx.xxx.xxx.com
因此,在nginx 服务器上,只要校验此发起地 URL,就可以对应的拒绝响应它
location /mall {
valid_referers *.test.com;
if ($invalid_referer) {
return 404;
}
root /etc/nginx/html/gzip;
}
压缩
我们都知道,服务器的带宽资源很昂贵,对于一些静态资源,如果能压缩一下再传输,通常可以减少50%的体积。
浏览器在发送请求时,会附带自己支持的压缩方式,在请求头中:
Accept-Encoding:gzip,deflate
在nginx 服务器中,配置:
location ~ /(.*)\.(html|js|css|jsg|jpeg|png|gig)$ {
gzip on; #启用gzip 压缩,默认是off,不启用
# 对js,css,jpg,png,gif格式对文件启用gzip 压缩功能
gzip_type application/javascript text/css image/jpeg image/png image/gif;
gzip_min_length 1024; # 所压缩文件对最小值,小于这个之不会压缩
gzip_buffer 4 1k; # 设置压缩响应块的个数和大小,默认是内存一个页的大小
gzip_comp_level 1; # 压缩水平,默认1.取值范围1-9,取值越大压缩比率越大,单耗cpu时间
root /html/gzip;
}
https
采用加密方式:非对称加密 和 对称加密
对称加密
服务器和客户端的加密密钥是相同的。加密效率高于非对称加密
存在问题:密钥传输的过程,泄露风险较大
非对称加密
加密安全。服务器和客户端是两个不同的密钥。
问题:非对称加密算法开销大,大批量应用于业务,会导致性能成本太高
https 加密方案
1、业务数据的加密使用对称加密,降低性能消耗
2、对称加密需要的密钥,通过非对称加密的方式 传输
具体步骤:
1、客户端和服务器建立连接
2、服务器下发证书到客户端,证书中保护非对称加密的公钥
3、客户端生成对称加密所需要的加密密钥
4、客户端使用证书中的公钥加密 对称加密密钥,生成密文
5、客户端将密钥发送给服务器
6、服务器使用私钥解密秘闻,得到对称加密所需密钥
7、客户端使用密钥加密要传输的内容,发送服务器
8、服务器使用密钥解密密文,得到传输的内容
nginx 配置 https
查看nginx 安装了https 模块 (openresty 默认开启 https 模块的):nginx -V
nginx 配置 https 只需要两个东西:
- 浏览器证书(内含公钥,供浏览器加密使用)
- 私钥
server.crt 和 server.key 可以自己去购买商业的。也可以使用自己生成的(浏览器会任务是不安全证书)。
自签证书
前提是已经安装了 openssl 程序,自签证书过程:
生成私钥:openssl genrsa -des3 -out server.key 4096 需要输入密码
生成csr: openssl req -new -key server.key -out server.csr
去除私钥口令 cp server.key server.key.org
openssl rsa -in server.key.org -out server.key 需要输入密码
生成证书: openssl x509 -req -day 365 -in server.csr -signkey server.key -out server.crt
nginx 配置:
server {
listen 443 ssl;
server_name xxx.com;
ssl_certificate /etc/nginx/server.crt; #供浏览器下载证书
ssl_certificate_key /etc/nginx/server.key; #自己解密用的私钥
location / {
root /etc/nginx/html;
index index.html index.htm;
}
}
nginx 的高可用
传统的高可用思路:
tomcat的高可用,在tomcat 的集群前面加一层 负载服务 nginx。
这样可以解决tomcat的高可用问题。但是引起了 负载服务 nginx 的高可用问题。如果前面的 nginx 服务挂掉,服务就崩溃了。
如果nginx 也沿用此思路,总会有一个最前端的集群是单机的,存在 宕机的风险。
lvs 思想解决高可用问题
使用服务器集群虚拟出一个 虚拟网管,因为是虚拟的,不存在的,所以不存在 宕机的问题。
此网关由两台机器 共同协商生成。当一台机器宕机了,另一台集群一样能维持这个网关。这保证了两台机器只要不同时宕机,
就能保证服务正常。
keepalived 配置lvs过程
前提:
1、关闭 selinux, 打开/etc/sysconfig/selinux, 设置 SELINUX=disabled
2、安装必须的依赖包
yum -y install libnl libnl-dev libnfnetlink-devel
3、keepalived 安装
下载源码包--不能使用 yum 方式安装(有bug)
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
配置(指定安装目录和配置文件)
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
keepalived 主机配置
打开/etc/keepalived/keepalived.conf, 配置如下内容:
启动keepalived, 查看机器ip,可以发现多了一个 244.200 的ip。使用原ip地址和新生成的ip地址都可以访问服务。
keepalived 从机配置
配置过程与主机过程一致,只需要修改 标识id 和 优先级即可。
注意:优先级要小于主机配置的优先级,并且组名要保持一致。
启动从机,发现ip并无变化。
keepalived 校验LVS效果
- 杀死主机的keepalived,244.200的ip从主机消失,出现在从机ip中
- 再次启动主机的keepalived,244.200 的ip被主机重新夺回
注意:此效果是单主单备方式。备机资源有一定的浪费。可以重复前面的动作,虚拟出第二个ip,将主从机优先级颠倒,从而利用起备机服务。
keepalived 监控服务软件
使用keepalived 我们实现了LVS功能,即集群间共同虚拟一个 vip(virtual ip),并实现了在集群中的自动漂移。
如果物理机器状况良好,并不能保障 其上允许的软件服务 ok,因为需要使用 keepalived 来监控服务。
1、使用 keepalived 来监控 nginx
编写shell 脚本:
#! /bin/bash
# 统计nginx 进程是否存在
A=`ps -C nginx --no-header|wc -l`
# 为0 表示nginx 停止来
if [$A -eq 0];then
# 尝试重启nginx
/usr/local/nginx/sbin/nginx
# nginx 重启失败,则keepalived自杀,进行vip转移
if [`ps -C nginx --no-header|wc -l` -eq 0]; then
# 杀死keepalived,vip转移到另一台机器
killall keepalived
fi
fi
2、在配置文件中加入配置信息
重启keepalived, 测试效果,发现 nginx 已变成不死鸟