Nginx应用结业篇---3
Posted *King*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx应用结业篇---3相关的知识,希望对你有一定的参考价值。
1、浏览器跨域问题
-如果浏览器在 static.enjoy.com 对应的 html 页面内,发起 ajax 请求偷盗 www.enjoy.com 域 名下的内容来填充自己的页面,整个互联网秩序将混乱. 为了防止这种混乱,W3C 组织制定了浏览器安全规范,即 html 页面发起的 ajax 请求仅限于同 域名后端范围,跨越域名的 ajax 请求不得执行,此谓跨域问题。
而在日常工作中,我们自己有多个子系统,避免不了要有跨越子系统的ajax请求,此时,我们就希望自己内部的各个子系统不必有这种跨域限制。
第一个方案:Jsonp的解决之道
w3c 制定的规则不允许 ajax 跨域请求,却允许 script 标签发起跨域请求,如下:
因此,有人便扩展的 script 标签 src 源可以跨域的用法,来得到跨域名的请求信息。这便是 jsonp 的解决办法。
jsonp的方法缺点:
1、jsonp只能解决GET类的请求,其它类型的请求,script标签无法做到
2、使用jsonp的方式,对应的后台程序必须对结果进行改造,将返回值做一个函数式包装。这对业务开发有较大侵入性,增加开发人员负担。
第二个方案:CORS方案的解决之道
W3C 制定跨域限制的本意,是防止页面领域安全混乱,即防止 A 公司不经 B 公司同意,使 用 ajax 盗取 B 公司的服务内容。 出于这个本意,W3C 改进了跨域的方案,即:如果 B 公司是同意将自己的内容分享给 A 公 司的,跨域限制可放开,此方案即 CORS 方案,如下图:
nginx配置跨域操作
对于比较简单的 http 请求(GET、POST、HEAD 类型),无须浏览器来问,nginx 服务器直接 在响应头部,加入同意跨域的信号即可
对于复杂的 http 请求(PUT、DELETE、含 json 格式数据),浏览器会在发请求前,先发一道 OPTION 请求来询问。我们在 Nginx 上直接配置对此询问的回答即可
有了上述 Nginx 的两道配置,跨域问题自然而解,对业务毫无侵入性。
2、防盗链
防盗链是为了让资源只能在我的页面内显示,不能被其它页面直接引用。
解决办法:
浏览器发起的任何请求,在其 request 头部,都会标注其请求发起地的 URL,如下:
因此,在Nginx服务器上,只要校验此发起地url,就可以对应地拒绝响应它。
Nginx配置方法
3、压缩
带宽资源很贵— /html/js/css 压缩一下再传输,通常可减少 50%的体积
浏览器在发送请求时,会附带自己支持的压缩方式:
nginx配置
4、https配置
对称加密
安全隐患:钥匙除我之外,还有多个人拥有。泄露风险较大,钥匙传递的过程风险较大
非对称加密
优缺点:私钥很安全。但是非对称算法开销很大,大批量应用于业务,会导致性能成本过高 (太败家)。
https加密方案
综合上述方案优缺点,各取所长,得到自己的方案:
1、业务数据的加密使用对称加密,降低性能开销
2、对称密钥,采用非对称加密,保驾护航
Nginx配置https
前提:查看nginx已经安装好了https模块(openresty 默认是开启 https 模块的):
Nginx配置https只需要两个东东,一个是浏览器证书(内含公钥,供浏览器加密使用),一个是私钥(供自己解密使用)
server.crt 和 server.key 可以自己去购买商业的。也可以自己使用程序生成一份(曾经的 12306 就使用自签的证书)
自签证书
自签证书生成过程如下(前提是机器里装好了openssl程序,复制命令即可):
# 1、创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 4096
# 2、创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr
# 3、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
openssl rsa -in server.key -out server_nopass.key
# 4、最后标记证书使用上述私钥和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt
nginx配置
Conf文件中:
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server_nopass.key;
校验
输入网址:https://enjoy.com/a.html https 方式显示页面如下:
5、nginx 高可用
tomcat的高可用的思路,是在tomcat集群前面加一层负载服务nginx,如下图:
这种做法,解决了 tomcat 的高可用问题。但是引入了前面的负载机器的高可用问题(Nginx 如果挂了,玩完) 如果 nginx 沿用此思路,总会有一个最前端是单机的,存在宕机玩完的风险。
LVS思想解决高可用问题
如上图,由服务器集群虚拟出来一台 虚拟网关 vip(不真实存在,自 然不存在宕机问题),此 vip 由两台机器共同协商生成。当有一台机器宕机时,另一台机器 一样能维持 vip。这保证了,只要两台机器不同时宕机,vip 就存在。
keepalived 配置 LVS 过程
前提:
1、关闭 selinux,打开/etc/sysconfig/selinux 设置其中值 SELINUX=disabled
2、安装必须的依赖包
yum -y install libnl libnl-devel libnfnetlink-devel
keepalived 安装
##下载源码包--不能使用 yum 方式安装(有 bug)
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
tar -zxvf keepalived-1.3.4.tar.gz
cd keepalived-1.3.4/
##配置(指定安装目录和配置目录,否则文件太散乱)
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make
make install
安装完毕后,进入keepalived可以看到它的配置主文件
打开/etc/keepalived/keepalived.conf,只需要配置如下一段。(其它是多余配置,删除)
! Configuration File for keepalived
global_defs {
router_id LVS_2 ##keepalived的唯一标识
}
vrrp_instance VI_1 {
state MASTER
interface eth0 ##系统网卡名,可以使用ip addr命令查看
virtual_router_id 51 ##组名,参与此虚拟ip的机器配置一样的值
priority 100 ##优先级,数值大的优先级高,组内最高的胜出
advert_int 1 ##心跳检测1s一次
authentication { ##授权,无须改动
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.244.200 ##虚拟的ip
}
}
启动 keepalived,查看机器 ip 地址,可发现多出一个 244.200 的 ip
keepalived 从机配置
从机配置与主机过程完全一样,配置文件内以下标识 id 与优先级稍作变化即可
! Configuration File for keepalived
global_defs {
router_id LVS_3 ##keepalived的唯一标识:标识id不同,保持唯一
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 ##系统网卡名,可以使用ip addr命令查看
virtual_router_id 51 ##组名:参与此虚拟ip的机器配置一样的值,与主机一样
priority 50 ##优先级,数值大的优先级高,组内最高的胜出:优先级50,不能与主机100一样
advert_int 1 ##心跳检测1s一次
authentication { ##授权,无须改动
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.244.200 ##虚拟的ip,与主机一样
}
}
启动从机的 keepalived 后,可发现其 ip 地址无变化
keepalived 校验 LVS 效果
1、此时,杀掉主机上的 keepalived,244.200 的 ip 将从主机上消失。而出现的从机的 ip 中
2、再次启动主机的 keepalived,244.200 的 ip 将被主机重新夺回
3、此效果是单主单备方式。备机资源有一定的浪费。可以重复前面的动作,虚拟出第二个ip,将主从机优先级颠倒,从而利用起备机服务
keepalived 监控服务软件
假如物理机状况良好,并不能保障其上运行的服务软件 ok,因此 需要借助 keepalived 来监控服务软件。
(1)使用keepalived来监控nginx
编辑一个 sh 监控脚本,sh 脚本:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #统计 nginx 进程是否存在
if [ $A -eq 0 ];then #为 0,表明 nginx 停止了
/usr/local/nginx/sbin/nginx #尝试重启 nginx
#nginx 重启失败,则 keepalived 自杀,进行 VIP 转移
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived #杀掉,vip 就漫游到另一台机器
fi
fi
(2)在配置文件中加入以下两处配置:
(3)重启keepalived,测试监控效时,如下图操作
nginx已经变成不死鸟啦!!!
6、Nginx 在mvvm 模式中的使用:
以上是关于Nginx应用结业篇---3的主要内容,如果未能解决你的问题,请参考以下文章