如何配置测试环境,支持多分支开发

标签: 运维 测试环境搭建 apache


编 写:袁 亮
时 间:2016-09-05
说 明:如何配置测试环境,支持多分支开发

一、目的

1、业务开发,多人合作的时候,需要开启多个分支
2、每个分支的开发、调试、访问需要能跟其他分支独立

二、分支独立需要考虑如下问题

1、需要配置独立的访问规则,来支持各个分支
    要求:访问规格更改不需要改动程序
2、配置文件,每个分支可以自行配置,也可以使用通用的
    包含配置:
        数据库、缓存、静态文件等等
    解决方案:
        SetEnv CI_ENV development
        development配置目录不要放在svn里,通过svn ignore忽略
3、图片、文件上传
    解决办法:所有上传,走统一的接口,返回上传之后的地址即可,各个分支一样
4、api接口
    解决办法:在各自分支里,调用不同的api分支

三、访问规则配置方案

1、方案一:
    实施:将分支名以目录的形式放在测试hosts之后,比如shopdev的配置
    优点:新建分支很简单,在相应目录下建个分支目录即可
    缺点:因为多了一层目录,会导致整个的访问规则都不一样了,代码中需要做相应的兼容判断,比如出现这种:
        http://shopdev.ci123.com/svn/yungou/webroot/index_yiqigou.php/item-5287.html?store_id=120&share_uid=406259
        或者直接/目录开头的访问等等

2、方案二:
    实施:将分支名以泛域名解析的形式,隐藏到hosts里
    优点:对程序不用做任何改动,访问规则完全兼容(ps:代码里写死了绝路路径的这种自己挖坑的另算)
    缺点:测试域名一般不是实际解析的域名,也意味着没有走DNS解析的过程,只能通过hosts来实现
        而hosts并不具备解析功能,隐藏泛解析这种hosts是做不了的,只能每个分支自己加hosts
        ps:如果嫌加hosts麻烦,可以考虑将测试域名做实际解析
            或者在公司内部自建DNS(bind),缓存非测试域名,测试域名自己做解析
            比较麻烦,没太大意义,暂时不考虑
    其他:
        直接使用nginx+fastcgi会更简单,只是我们使用的apache为主,因此是配置的nginx+apache的方式

四、方案二实施

1、nginx 配置泛域名解析
    server_name通配符即可

2、apache支持泛域名解析(rewrite方式)
    1.1 ServerAlias 通配符实现泛解析
    1.2 rewrite 实现将分支名转为相应的目录名
    1.3 框架本身的rewrite重写
    1.4 静态文件rewrite重写

3、hosts 处理
    需要使用的分支,自行添加hosts

五、yungou.ws测试机最终使用

1、svn 创建分支,checkout到/opt/ci123/www/html/seller_shop下
    ps:分支名只支持大小写字母、数组、_组成的字符串
2、本地添加hosts
    192.168.0.249 分支名.yungou.ws
3、浏览器访问 (一些老旧浏览器需要强刷或者重启)
    分支名.yungou.ws

六、apache rewrite 概述

RewriteEngine On

# 将所有非static静态文件的请求,全部达到webroot的index中,框架本身的rewrite要求,将分支名嵌入进去
RewriteCond %{HTTP_HOST} [\w_]+.yungou.ws
RewriteCond %{REQUEST_URI} !static.*
#将hosts放到rewrite匹配源中,需要其中的分支名作为后续使用 跟下一条规则关联
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] 
RewriteRule ([\w_]+).yungou.ws(.*) /$1/webroot/index.php/$2 [L]

# static 静态文件目录不rewrite,直接访问
RewriteCond %{HTTP_HOST} [\w_]+.yungou.ws
RewriteCond %{REQUEST_URI} static.*
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ([\w_]+).yungou.ws(.*) /$1/webroot/$2 [L]

附:参考文档

1、nginx泛解析域名实现多级域名多个同时绑定
2、nginx泛域名解析实现二级域名多域名
3、Apache 2.2 + Tomcat 泛域名解析 动态二级域名
4、使apache解析域名到目录的方法
5、Apache的Rewrite规则详细介绍
6、Apache Module mod_rewrite
7、解析无限个二级域名的方法

http basic认证的那些事


编	写:袁	亮
时	间:2015-07-13
说	明:http basic认证的那些事

一、什么是http basic认证?
	1、由http协议规定
	2、提供简单的用户验证功能,适合于对安全性要求不高的地方
	3、通过在http头部增加
		Authorization: Basic username:password
		的方式,来向服务端证明自己是一个被授权访问的用户
	4、优点:
		简单、方便
	5、缺点:
		安全性太低,账号密码容易泄露,而且不方便升级维护
	6、替代协议
		oauth,使用oauth可以提供更安全的授权访问,但是实现较复杂
		现有oauth已经到了2.0版本,有兴趣的可以去了解下
	
二、常见使用方式
	1、最熟悉的,应该是大家家里的路由器登陆页面,那就是一个典型的http basic认证
	2、一些比较旧的项目后台,也会有这种登陆方式
	3、自己写一些临时后台,又不想介入复杂的账号体系的话,也可以使用该验证方式

三、工作流程
	1、浏览器第一次访问,没有带上相应账号密码请求
	2、服务器端,判断如果没有带上相应请求头Authorization: Basic,则返回401状态码,以及
		WWW-Authenticate:Basic realm="验证输入框标题"
	3、浏览器收到401状态码,弹出各浏览器自行实现的账号、密码输入框供用户输入
	4、浏览器将用户输入的用户和密码拼接,并加入到请求头中
		Authorization: Basic base64_encode(username:password)
	5、服务端将内容解析出来,并与自己的账号密码库比对,如果失败,继续要求填写账号密码
		如果正确,则继续访问,并在之前的每次访问都带上相应的请求头
	
四、几种实现方式
	1、apache设置【主要使用】
		1.1 开启设置,在httpd.conf文件中,相应目录上设置(需要重新apache服务)
			AuthType Basic
            AuthName "请输入你的账号密码"
            AuthUserFile .htpasswd	#账号密码存储文件位置
            Require valid-user #账号文件中的所有用户都可访问
		1.2 添加账号
			/opt/ci123/apache/bin/htpasswd -m /opt/ci123/www/html/geekman/.htpasswd username
			//注意,第一次添加需要加-cm参数创建文件,之前不允许加-c,否则会直接覆盖那个文件,导致其他账号丢失
		1.3 修改密码,同添加
		1.4 删除账号,找到对应的账号文件,直接删除那一行即可
	2、php设置,弹出
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
			header('WWW-Authenticate: Basic realm="My Realm"');
			header('HTTP/1.0 401 Unauthorized');
			echo 'Text to send if user hits Cancel button';
			die;
		} else {
			echo "

Hello {$_SERVER['PHP_AUTH_USER']}.

"; echo "

You entered {$_SERVER['PHP_AUTH_PW']} as your password.

"; //验证该账号密码是否在允许范围内 } 五、程序模拟访问带http basic的页面 1、两种请求方式 1.1 将账号密码拼接在链接中 http://username:password@192.168.0.249/memadmin/basic.php 1.2 请求头中增加 Authorization: Basic base64_encode(username:password) 2、curl模拟账号密码 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, username:password); 3、rpc接口 初始化的时候,第三、第四个参数分别填用户名密码即可