nginx 小功能

跨域问题

问题:浏览器拒绝执行其他域名下的 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 已变成不死鸟

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章