系统相关
首页 > 系统相关> > Nginx实战部署常用功能演示(超详细版),绝对给力~~~

Nginx实战部署常用功能演示(超详细版),绝对给力~~~

作者:互联网

Nginx实战部署常用功能演示(超详细版),绝对给力~~~

 

前言

上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域、缓存、配置SSL证书、高可用等,老规矩,还是挑几个平时比较常用的进行演示分享。上篇详见Nginx超详细常用功能演示,够用啦~~~

正文

1. 跨域

跨域是因为浏览器同源策略的保护,不能直接执行或请求其他站点的脚本和数据;一般我们认为的同源就是指协议、域名、端口都相同,否则就不是同源。

现在前后端分离开发已经很普遍了,跨域问题肯定少不了,但解决的方式也很多,比如JsonP、后端添加相关请求头等;很多时候,不想改动代码,如果用到nginx做代理服务器,那就可以轻松配置解决跨域问题。

1.1 环境准备

需要准备两个项目,一个前端项目发布在80端口上,一个API项目发布在5000端口上,这里需要在阿里云的安全组中将这两个端口开放;

1.2 配置跨域及运行

在API的server中进行跨域配置,如下:

重启nginx之后,再测试,看看搞定了没?

2. 配置SSL证书

现在的站点几乎都是https了,所以这个功能必须要实操一把;为了更符合真实线上场景,我特意准备了域名和证书,真真实实在阿里云服务器上演示; 这里需要登录到阿里云上购买域名,然后根据域名申请免费的SSL证书,最后进行配置使用,详情如下:

2.1 准备域名

这里我注册了一个域名为:codezyq.cn;下面先说说注册域名的流程:

2.2 准备证书

免费证书这块的申请需要用到买的域名,大概步骤如下:

2.3 nginx配置证书

3. 防盗链配置

盗链通俗一点的理解就是别人的网站使用自己服务器的资源,比如常见的在一个网站引入其他站点服务器的图片等资源,这样被盗链的服务器带宽等资源就会额外被消耗,在一定程度上会损害被盗链方的利益,所以防盗链是必要的;这里通过nginx简单实现静态资源防盗链的案例,原理很简单,就是判断一下请求源是否被允许。

3.1 准备一个html和图片

将准备的html和图片放在创建的static目录下,如下图:

anti-stealing-link.html内容如下

<!DOCTYPE html>
  <html>
  <head>
  	<title>anti-stealing-link  test</title>
  </head>
  <body>
  	<h2>使用云服务器上的图片</h2>
      <!-- 访问服务器图片 -->
  	<img src="http://47.113.204.41/img/test.jpg" alt="">
  </body>
</html>
3.2 正常配置nginx
server {
        listen       80;
        server_name 47.113.204.41;
		# 针对html访问的匹配规则
        location /www/ {
            root static;
            index index.html index.htm;
        }
		# 针对图片访问的匹配规则
        location /img/ {
            root static;
        }
        charset utf-8;
    }

运行起来看效果:

现在有个需求,只能是云服务器的html才能使用图片,其他引用源都认为是盗链,直接返回403或重写到固定图片。

3.3 轻松配置nginx防盗链

针对img配置如下:

server {
        listen       80;
        server_name 47.113.204.41;
		# 针对html访问的匹配规则
        location /www/ {
            root static;
            index index.html index.htm;
        }
		# 针对图片访问的匹配规则
        location /img/ {
            root static;
            #对源站点的验证,验证IP是否是47.113.204.41
            #可以输入域名,多个空格隔开
            valid_referers 47.113.204.41;
            #非法引入会进入下方判断
            if ($invalid_referer) {
               #这里返回403,也可以rewrite到其他图片
               return 403;
            }
        }
        charset utf-8;
    }

重启nginx,清除缓存再试:

防盗链是不是很简单,也可以通过代码的形式,比如在过滤器或管道中也可以实现,如果没有特殊需求,nginx稍微一配置就能实现,岂不美哉~~~

4. 隐藏版本信息

之前在项目中做渗透测试时,其中有一项问题就是不希望在响应头中体现服务器相关版本,避免在某些版本出现漏洞时,攻击者可以特意针对此版本进行恶意攻击,从而影响系统服务可用性。

现有情况:

页面找不到时:

看看nginx是如何关闭,如下配置:

看效果:

正常访问

找不到报错,版本也没有啦

5. 高可用配置

尽管nginx性能再强,但服务器和网络有很多因素是不可控的,如:网络抖动、网络不通、服务器宕机等情况,都会导致服务不可用(可理解为单点故障),这样的系统体验肯定得不到好评;如果当一个服务器宕机或服务挂掉时,另外一台服务器自动代替宕机服务器提供服务,保证系统的正常运行,这就实现了高可用;这里nginx实现高可用的方式和Redis的主从模式很相似,只是nginx使用的是keepalived来实现高可用集群。

5.1 keepalived简介

keepalived实现高可用的关键思路还是主、备节点的来回切换;

由上可见,在keepalive实现高可用时,肯定要有机制选择主备节点,主备之间肯定要互相通知,不然咋知道节点之间的健康状态,所以就使用了VRRP协议,目的就是为了解决静态路由的单点故障。

VRRP协议,全称Virtual Router Redundancy Protocol(虚拟路由冗余协议),利用IP多播的方式实现通信;通过竞选协议机制(根据配置的优先级来竞选)来将路由任务交给某台VRRP路由器,保证服务的连续性;

理论先了解这么多,先来把keepalived安装上,

方式一

执行以下命令可直接安装:

# 安装,这种直接安装完成了,修改配置文件启动即可
yum install-y keepalived
# 启动
systemctl start keepalived.service

这种方式可能会遇到启动keepalived的时候报错,原因可能是服务配置文件(/usr/lib/systemd/system/keepalived.service)指定的keepalived相关目录找不到; 如果文件目录都正常,还报错,我折腾了好久,后来用源码方式进行安装就正常啦~~~

方式二

建议使用源码的形式进行安装,大概步骤如下:

第一步,环境准备

# 安装对应的依赖包
yum -y install gcc openssl openssl-devel pcre-devel zlib zlib-devel

第二步,下载并解压源码包

# 在/usr/local/src目录下执行,下载到该目录
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
# 解压
tar -zxvf keepalived-2.0.18.tar.gz

第三步,安装

# 进入到解压出来的目录
cd keepalived-2.0.18
# 编译并安装
./configure && make && make install

第四步,创建启动文件,即将编译出来的文件拷贝到对应的目录下

cp  -a /usr/local/etc/keepalived   /etc/init.d/
cp  -a /usr/local/etc/sysconfig/keepalived    /etc/sysconfig/
cp  -a /usr/local/sbin/keepalived    /usr/sbin/

第五步,创建配置文件

# 先创建配置文件存放的目录
mkdir /etc/keepalived
# 再将创建好的配置文件通过xFtp传到此目录,也可以直接在这里创建

配置文件名为keepalived.conf,内容如下:

! Configuration File for keepalived
global_defs {
	   # 每台机器的唯一标识
       router_id 31
}
# vrrp实例,可以配置多个
vrrp_instance VI_1 {
	# 标识为主节点,如果是被节点,就为BACKUP
    state MASTER
    # 网卡名称,通过ip addr 命令可以看到对应网卡,需要哪个就配置哪个就行
    interface enp0s8
    # 路由ID,主、备节点的id要一样
    virtual_router_id 3
    # 优先级,主节点的优先级要大于备节点的优先级
    priority 200
    # 主备心跳检测,间隔时间为1s
    advert_int 1 
    # 认证方式,主备节点要一致
    authentication {
       auth_type PASS
       auth_pass 123456
    }
    virtual_ipaddress {
       # 虚拟IP
       192.168.30.108
    }
}

第六步,启动

# 启动
systemctl start keepalived.service
# 查看虚拟IP情况
ip addr 

查看效果如下,虚拟ip正常在master节点上:

安装完keepalived和nginx之后就可以进行主备演示啦~~~

5.2 主备演示

这里用了两台虚拟机,结构如下:

5.3 多主多备演示

对于上面的主备模式,只有主节点提供服务,如果主节点不发生故障,备节点服务器就有点资源浪费啦,这个时候多主多备不仅能合理利用资源,还得提供备用服务(根据实际需要配置),形成真正集群提供服务。

这里就演示一下双主双备的配置,思路就是在keepalived增加多个vrrp实例,105机器在vrrp实例VI_1中作为主节点,106机器作为备节点,在vrrp实例VI_2中,105机器作为备节点,106机器作为主节点,这样就形成了互为主备的模式,资源就能很好的利用啦;其他逻辑不变,只是分别在105、106机器上加上的keepalived.conf中加上VI_2实例即可,如下:

105机器上keepalived.conf内容如下:

global_defs {
       router_id 31
}
#检测nginx服务是否在运行
vrrp_script chk_nginx {
   #使用脚本检测
   script "/usr/local/src/chk_nginx.sh"
   #脚本执行间隔,每2s检测一次
   interval 2
   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
   weight -5
   #连续2次检测失败才确定是真失败
   fall 2
   #检测到1次成功就算成功
   rise 1                   
}

vrrp_instance VI_1 {
       state MASTER
       interface enp0s8
       virtual_router_id 3
       priority 200
       advert_int 1 
       authentication {
               auth_type PASS
               auth_pass 123456
       }
       track_script {                      
                chk_nginx                    
        }
       virtual_ipaddress {
               192.168.30.108
       }
}
vrrp_instance VI_2 {
		# VI_1是MASTER,这里就是备节点
       state BACKUP
       interface enp0s8
       # 修改路由编号
       virtual_router_id 5
       # 备节点优先级稍低
       priority 100
       advert_int 1
       authentication {
               auth_type PASS
               auth_pass 123456
       }
       track_script {                      
                chk_nginx                    
        }
       virtual_ipaddress {
       		   # 虚拟IP
               192.168.30.109
       }
}

106机器上keepalived.conf内容如下:

global_defs {
       router_id 32
}
#检测nginx服务是否在运行
vrrp_script chk_nginx {
   #使用脚本检测
   script "/usr/local/src/chk_nginx.sh"
   #脚本执行间隔,每2s检测一次
   interval 2
   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
   weight -5
   #连续2次检测失败才确定是真失败
   fall 2
   #检测到1次成功就算成功
   rise 1                   
}
vrrp_instance VI_1 {
       state BACKUP
       interface enp0s8
       virtual_router_id 3
       priority 100
       advert_int 1 
       authentication {
               auth_type PASS
               auth_pass 123456
       }
        track_script {                      
                chk_nginx                    
        }
       virtual_ipaddress {
               192.168.30.108
       }
}
vrrp_instance VI_2 {
	   # 这里是主节点
       state MASTER
       interface enp0s8
       # 这里和105机器上的VI_2中id一致
       virtual_router_id 5
       priority 200
       advert_int 1
       authentication {
               auth_type PASS
               auth_pass 123456
       }
       track_script {                      
                chk_nginx                    
        }
       virtual_ipaddress {
       			# 虚拟IP
               192.168.30.109
       }
}

分别重启两台机器上的keepalived,执行命令如下:

然后分别访问虚拟ip 192.168.30.108 和192.168.30.109,都能提供对应的服务啦,这里不截图了。

总结

开发和生产环境比较常用的功能大概就这么多,后续如果用得多的功能会及时和小伙伴分享哦。

这次主要遇见一些问题,小伙伴可以作为参考,汇总如下:

标签:演示,nginx,配置,keepalived,如下,Nginx,给力,html,节点
来源: https://www.cnblogs.com/lihaijia/p/14845361.html