从环境搭建探讨做事的方法
背景:
最近团队在搞开发与测试环境整理。更换旧的IP段,启用新的IP段,一系列原来的上百台虚拟机上的成百上千个应用的“无缝”对接也是个问题,其实也不算是完全无缝,还是会有点小影响,但贵在对环境搭建熟悉的同事大有人在,所以倒不担心替换后有具体技术解决不了,这个过程中,到目前为止,其中难点不在于技术,在于做事的思考方法上,列举一个我认为比较不错的方法,当然这是别的同事想出来的。
原来我们开通外网访问的虚拟机上,一个tengine配置里有无数个应用,哪些有用,哪些没用,都不是太清楚,而又有些location配置一定要用根目录也不清楚为什么是否有可解方法,毕竟根目录只有一个
一向没有专人维护所以导致现在乱七八遭,这次一次整理了。
问题:
1、减少安全隐患
2、整理清楚原有环境配置
思路:
1、首先安全方面,只要开通了外网,就会很大安全隐患,这个世界不怕贼多就怕被贼惦记了,在安全层面,对这台外网的机器做了如下的处理:
a.限制单个上传文件20m
b.禁爬虫
c.禁http跳转->https
d.禁非公司域名
e.限制非本公司ip访问/admin
具体操作,可以百度或gogle,linux虚拟机设置
2、机器上服务启动关闭方面,做成 定时任务,把此机器上应用下班时候都停掉,shell脚本挺简单的
a、每天某个时间点进行强制停止服务,可以直接kill也可以直接进到服务中bin里面启动停止
b、某个时间点做停止服务操作,且在之后,每半小时会重新再停止一次,第二天早上8点开启服务
c、遇到加班情况,自行开启,但半小时会停止。
3、如果几十个应用都有外网访问的需求,那么tengine入口配置就会有几百个配置信息。太多了怎么办
a、由各项目负责人找配置管理员加相关配置,提供开通时长,到时间后自动删除,如果与预计时间有误差,删除后再重新添加,不会持续保留一再延期
b、tengine-conf配置按网站目录分类,这样同一类的配置文件就很少,例如
看一下入口tengine配置:加了一些过滤
server { listen 80 ; server_name xx.(1x|2x|3x|4x|5x|6x|7x|8x).com.cn 127.0.0.1 localhost 192.168.*; #允许访问的server名称 include nginx_ssl.conf; #增加https加密码访问配置 #请求过滤:禁止http跳https,http跳https会有几次握手,用的协议就是CONNECT if ( $request ~* "CONNECT " ) { return 403; } #请求过滤:防刷防爬虫 if ( $http_user_agent ~* (pider|bot|Yahoo\!|dita) ) { return 403; } #请求过滤:过滤请求域名 if ( $host !~* xx(1x|2x|3x|4x|5x|6x|7x|8x) ) { return 403; } #请求过滤:禁IP, #单看nginx模块名ngx_http_access_module,很多人一定很陌生,但是deny和allow相比没一个人不知道的,实际上deny和allow指令属于ngx_http_access_module.我们想控制某个uri或者一个路径不让人访问,在nginx就得靠它了。 set $allowss true; if ( $request ~* /xx ){#访问请求URL带xx结尾的 set $allowss p; } #来源IP限制:remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。什么是x_forwarded_for正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP if ( $remote_addr !~* (127.0.0.1|219.x.244.|x.136.x.|61.x.x.|192.168.|x.x.30.|x.5.251.|x.107.x.|x.77.x.|x.23.x.|14.x.x.|x.x.122.|x.90.x.|120.x.x.) ){ set $allowss "${allowss}c"; } if ( $allowss = pc) { #set $allowss false; return 403; } #teninge run status location = /nginx-status { stub_status on; access_log off; allow 127.0.0.1; allow 192.168.0.0/16; deny all;} include aa/*.conf; include bb/*.conf; include cc/*.conf; include dd/*.conf; include ee/*.conf; include ff/*.conf; include gg/*.conf;
再来看一下具体到每一个应用的配置文件:
[root@vv /data/PRG/tengine_online/conf]$ cd aa/ [root@vv /data/PRG/tengine_online/conf/aa]$ ll 总计 8 -rw-r--r-- 1 root root 316 05-17 15:02 aa1.conf -rw-r--r-- 1 root root 310 05-17 16:31 aa2.conf [root@v72 /data/PRG/tengine_online/conf/pcauto]$ vim aa1.conf location ~ ^/aa1{ #目录根据实际可以自己改名称 proxy_pass http://192.168.xx.xx:port; #直接写应用后端IP和端口 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
其实在这一步,。也不是应用所有目录下的URL都有外网访问需求嘛,我们也可以指定某些路径下
是不是很简单明了呀!!!!