1、浏览器跨域问题

-如果浏览器在 static.enjoy.com 对应的 html 页面内,发起 ajax 请求偷盗 www.enjoy.com 域 名下的内容来填充自己的页面,整个互联网秩序将混乱. 为了防止这种混乱,W3C 组织制定了浏览器安全规范,即 html 页面发起的 ajax 请求仅限于同 域名后端范围,跨越域名的 ajax 请求不得执行,此谓跨域问题。

nginx配置 jsp页面 nginx支持jsp吗_nginx


而在日常工作中,我们自己有多个子系统,避免不了要有跨越子系统的ajax请求,此时,我们就希望自己内部的各个子系统不必有这种跨域限制。

第一个方案:Jsonp的解决之道

w3c 制定的规则不允许 ajax 跨域请求,却允许 script 标签发起跨域请求,如下:

nginx配置 jsp页面 nginx支持jsp吗_Nginx_02


因此,有人便扩展的 script 标签 src 源可以跨域的用法,来得到跨域名的请求信息。这便是 jsonp 的解决办法。

jsonp的方法缺点:

1、jsonp只能解决GET类的请求,其它类型的请求,script标签无法做到

2、使用jsonp的方式,对应的后台程序必须对结果进行改造,将返回值做一个函数式包装。这对业务开发有较大侵入性,增加开发人员负担。

第二个方案:CORS方案的解决之道

W3C 制定跨域限制的本意,是防止页面领域安全混乱,即防止 A 公司不经 B 公司同意,使 用 ajax 盗取 B 公司的服务内容。 出于这个本意,W3C 改进了跨域的方案,即:如果 B 公司是同意将自己的内容分享给 A 公 司的,跨域限制可放开,此方案即 CORS 方案,如下图:

nginx配置 jsp页面 nginx支持jsp吗_跨域_03


nginx配置跨域操作对于比较简单的 http 请求(GET、POST、HEAD 类型),无须浏览器来问,nginx 服务器直接 在响应头部,加入同意跨域的信号即可

nginx配置 jsp页面 nginx支持jsp吗_nginx_04


对于复杂的 http 请求(PUT、DELETE、含 json 格式数据),浏览器会在发请求前,先发一道 OPTION 请求来询问。我们在 Nginx 上直接配置对此询问的回答即可

nginx配置 jsp页面 nginx支持jsp吗_Nginx_05


有了上述 Nginx 的两道配置,跨域问题自然而解,对业务毫无侵入性。

2、防盗链

防盗链是为了让资源只能在我的页面内显示,不能被其它页面直接引用。

解决办法:

浏览器发起的任何请求,在其 request 头部,都会标注其请求发起地的 URL,如下:

nginx配置 jsp页面 nginx支持jsp吗_Nginx_06


因此,在Nginx服务器上,只要校验此发起地url,就可以对应地拒绝响应它。Nginx配置方法

nginx配置 jsp页面 nginx支持jsp吗_nginx配置 jsp页面_07

3、压缩

带宽资源很贵— /html/js/css 压缩一下再传输,通常可减少 50%的体积

浏览器在发送请求时,会附带自己支持的压缩方式:

nginx配置 jsp页面 nginx支持jsp吗_跨域_08


nginx配置

nginx配置 jsp页面 nginx支持jsp吗_nginx_09

4、https配置

对称加密

安全隐患:钥匙除我之外,还有多个人拥有。泄露风险较大,钥匙传递的过程风险较大

nginx配置 jsp页面 nginx支持jsp吗_nginx_10


非对称加密优缺点:私钥很安全。但是非对称算法开销很大,大批量应用于业务,会导致性能成本过高 (太败家)。

nginx配置 jsp页面 nginx支持jsp吗_跨域_11


https加密方案

综合上述方案优缺点,各取所长,得到自己的方案:

1、业务数据的加密使用对称加密,降低性能开销

2、对称密钥,采用非对称加密,保驾护航

nginx配置 jsp页面 nginx支持jsp吗_nginx配置 jsp页面_12


Nginx配置https前提:查看nginx已经安装好了https模块(openresty 默认是开启 https 模块的):

nginx配置 jsp页面 nginx支持jsp吗_跨域_13


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配置 jsp页面 nginx支持jsp吗_nginx_14


nginx配置

Conf文件中:
ssl_certificate      /etc/nginx/server.crt;
ssl_certificate_key  /etc/nginx/server_nopass.key;

nginx配置 jsp页面 nginx支持jsp吗_Nginx_15


校验输入网址:https://enjoy.com/a.html https 方式显示页面如下:

nginx配置 jsp页面 nginx支持jsp吗_Nginx_16

5、nginx 高可用

tomcat的高可用的思路,是在tomcat集群前面加一层负载服务nginx,如下图:

nginx配置 jsp页面 nginx支持jsp吗_nginx_17


这种做法,解决了 tomcat 的高可用问题。但是引入了前面的负载机器的高可用问题(Nginx 如果挂了,玩完) 如果 nginx 沿用此思路,总会有一个最前端是单机的,存在宕机玩完的风险。LVS思想解决高可用问题

nginx配置 jsp页面 nginx支持jsp吗_跨域_18


如上图,由服务器集群虚拟出来一台 虚拟网关 vip(不真实存在,自 然不存在宕机问题),此 vip 由两台机器共同协商生成。当有一台机器宕机时,另一台机器 一样能维持 vip。这保证了,只要两台机器不同时宕机,vip 就存在。

keepalived 配置 LVS 过程

前提:

1、关闭 selinux,打开/etc/sysconfig/selinux 设置其中值  SELINUX=disabled

nginx配置 jsp页面 nginx支持jsp吗_nginx配置 jsp页面_19


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

nginx配置 jsp页面 nginx支持jsp吗_nginx_20


安装完毕后,进入keepalived可以看到它的配置主文件

nginx配置 jsp页面 nginx支持jsp吗_nginx配置 jsp页面_21


打开/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
    }
}

nginx配置 jsp页面 nginx支持jsp吗_nginx_22


启动 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)在配置文件中加入以下两处配置:

nginx配置 jsp页面 nginx支持jsp吗_nginx_23


(3)重启keepalived,测试监控效时,如下图操作

nginx配置 jsp页面 nginx支持jsp吗_nginx配置 jsp页面_24


nginx已经变成不死鸟啦!!!

6、Nginx 在mvvm 模式中的使用:

nginx配置 jsp页面 nginx支持jsp吗_nginx_25