首页> 搜索结果页
"传cf网站" 检索
共 70 条结果
网站程序安装问题"_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Install/c6bbce5b1f1dcf027c8ceb5cf5141b65.php
在上传网站程序后刚开始安装的时候出现如下提示:(_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Install/c6bbce5b1f1dcf027c8ceb5cf5141b65.php错误位置FILE: C:inetpubwwwroot16ThinkPHPLibraryThinkStorageDriverFile.class.php  LINE: 48我从网上搜了一下,说是文件权限问题,改成777,也没解决问题。
问答
2016-02-28
网站支付宝登录
网站支付宝登录是适用于网站页面进行授权。 一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/263/105809[/url] 二、开发前准备工作 调用步骤:[url]https://openclub.alipay.com/read.php?tid=12194&fid=69[/url] 注意事项:1、支持沙箱测试;2、不需签约,但需要添加功能;3、支持第三方调用。 三、调用流程 1、授权URL拼接,获取access_token 具体调用步骤参考用户信息授权:[url]https://openclub.alipay.com/read.php?tid=14595&fid=68#anchor2[/url] 注:由于该产品是需要实现获取会员信息的功能,授权URL拼接的scope必须传入auth_user。 如scope=auth_user,auth_base。 2、获取用户信息 获取用户信息必须通过alipay.user.info.share(支付宝会员授权信息查询接口) 调用获取。 具体代码调用方式参见支付宝会员授权信息查询接口请求示例。 四、会员授权信息查询接口请求示例 1、参数说明 auth_token:alipay.system.oauth.token(换取授权访问令牌) 接口调用返回的响应参数access_token。 注:该接口不需要设置请求参数,只需要在公共参数中必传auth_token 2、JAVA版本请求示例 public static void main(String[] args) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //调用接口获取用户信息 AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); //需要用户授权后,将auth_code换取accessToken,注入 String accessToken = "composeBd364827b102144cf992fb7ce6e327X89"; try { AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken); System.out.println(response.getBody()); } catch (AlipayApiException e) { //处理异常 e.printStackTrace(); }} 响应参数 {"alipay_user_info_share_response":{"code":"10000","msg":"Success","gender":"f","is_certified":"T","is_student_certified":"F","nick_name":"买家沙箱","user_id":"2088102175794899","user_status":"T","user_type":"2"},"sign":"GFOQ5SbhPPSkL1Dmf9snUJxTEeCxngsXOQubURBIDx5C9/sb7CnNmHdSXDru9NPDlvfSQPT+b+iUOVapARafpsdqP6XIdHqQfrLB2jE6YO2ql52J07/yGrUNAwjaaKd/ndBbpljhn9laQATD1sqrwwUGmttiGkyK6cPvW3lH/ndAvbDRkwnKdrLKZGSou3erf0thL6QzlS12XXryTnvEArCuteAsqqDFi81R/PVKyXdl15P9SdVQzhJski5yZ3A1VEO9Vv96bVjVlgUZaIALddjOX4rh100e/mxx7K8qOmjX12r72pFyPrVEAQChRTSx1OxiXureiCScscHKtZdOQg=="} 3、PHP版本请求示例 $aop = new AopClient ();$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';$aop->appId = 'your app_id';$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';$aop->apiVersion = '1.0';$aop->signType = 'RSA2';$aop->postCharset='GBK';$aop->format='json';$request = new AlipayUserInfoShareRequest ();$result = $aop->execute ( $request , 'composeBd364827b102144cf992fb7ce6e327X89'); echo json_encode($result); 响应参数 {"alipay_user_info_share_response":{"code":"10000","msg":"Success","gender":"f","is_certified":"T","is_student_certified":"F","nick_name":"买家沙箱","user_id":"2088102175794899","user_status":"T","user_type":"2"},"sign":"GFOQ5SbhPPSkL1Dmf9snUJxTEeCxngsXOQubURBIDx5C9/sb7CnNmHdSXDru9NPDlvfSQPT+b+iUOVapARafpsdqP6XIdHqQfrLB2jE6YO2ql52J07/yGrUNAwjaaKd/ndBbpljhn9laQATD1sqrwwUGmttiGkyK6cPvW3lH/ndAvbDRkwnKdrLKZGSou3erf0thL6QzlS12XXryTnvEArCuteAsqqDFi81R/PVKyXdl15P9SdVQzhJski5yZ3A1VEO9Vv96bVjVlgUZaIALddjOX4rh100e/mxx7K8qOmjX12r72pFyPrVEAQChRTSx1OxiXureiCScscHKtZdOQg=="} 4、.NET版本请求示例 IAopClient client = new DefaultAopClient(config.gatewayUrl, config.app_id, config.private_key, "json", "1.0", "RSA2", config.alipay_public_key, config.charset, false);AlipayUserInfoShareRequest request= new AlipayUserInfoShareRequest() ;AlipayUserInfoShareResponse response=client.execute(request,"composeBd364827b102144cf992fb7ce6e327X89");Console.WriteLine(response.Body); 响应参数 {"alipay_user_info_share_response":{"code":"10000","msg":"Success","gender":"f","is_certified":"T","is_student_certified":"F","nick_name":"买家沙箱","user_id":"2088102175794899","user_status":"T","user_type":"2"},"sign":"GFOQ5SbhPPSkL1Dmf9snUJxTEeCxngsXOQubURBIDx5C9/sb7CnNmHdSXDru9NPDlvfSQPT+b+iUOVapARafpsdqP6XIdHqQfrLB2jE6YO2ql52J07/yGrUNAwjaaKd/ndBbpljhn9laQATD1sqrwwUGmttiGkyK6cPvW3lH/ndAvbDRkwnKdrLKZGSou3erf0thL6QzlS12XXryTnvEArCuteAsqqDFi81R/PVKyXdl15P9SdVQzhJski5yZ3A1VEO9Vv96bVjVlgUZaIALddjOX4rh100e/mxx7K8qOmjX12r72pFyPrVEAQChRTSx1OxiXureiCScscHKtZdOQg=="} 五、注意事项 1、使用场景 网站支付宝登录是适用于网站页面的,并不适用于商户app端进行支付宝登录。 若在商户app端集成该产品,存在无法打开授权页面、授权成功后无法回调app端的情况。 2、回调场景 由于网站支付宝登录是通过设置授权回调地址,进行授权成功后回调。 注:授权回调地址只支持http和https的页面路径,不支持设置scheme地址,进行回调app客户端。 3、如何实现商户app端支付宝登录 该功能可集成app支付宝登录产品. 参考集成方式:[url]https://openclub.alipay.com/read.php?tid=7493&fid=60&ant_source=zsearch[/url] 4、PC端和H5页面授权说明 (1)电脑网站(PC端)页面授权获取信息 可直接访问拼接好的授权URL,进行后续的调用 (2)手机网站(H5)页面授权获取信息 拼接好的授权URL必须在支付宝客户端内访问,即在支付宝app内授权。 5、auth_token传参方式 接口调用方式中,设置auth_token的代码示例: JAVA: response = alipayClient.execute(request, accessToken); PHP: $result = $aop->execute($request,$accessToken); .net: response=client.execute(request,accessToken);   如果还是报错,请按如下方式进行提问: 正确提问方式:使用环境(沙箱还是正式环境)+接口名称(中文+英文)+ 请求参数 + 报错信息详情
文章
2019-04-25
使用C#实现网站用户登录
我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。 HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。 服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。 现在原理已经搞清楚了,那么我们就来实现一个网站的登录嘛,这里就以盛大纵横天下的登录为例。 要写这种面向协议的网络程序,抓包工具是少不了的,我们首先是要使用抓包工具分析在普通浏览器中登录时发送和接收的内容才好进一步使用C#来模拟浏览器发包。抓包工具很多,看个人爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于我们分析。 1.最好能清除IE的所有Cookie记录,以免对抓包分析造成影响,然后开启抓包程序。 2.在IE中输入http://zh.sdo.com/web1.0/home/fastlogin.asp 这个快速登录地址,我们将看到已经抓到了很多请求和响应的包。 3.输入用户名和密码,点击登录,IE中正常登录,停止抓包,我们要的所有信息都被抓取好了。如图: 4.盛大的登录机制还是属于比较复杂的,中间涉及到好几个服务器,经过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登录机制为: 1)IE请求https://cas.sdo.com:80/cas/login?service=http://zh.sdo.com/web1.0/home/index.asp页面,该页面给IE一个SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/ 2)IE同时在该HTTP的正文中得到一个ticket,这个ticket将在登录中有用,当然其他网站肯定不是这样做的,这里分析的是纵横天下的。location.href    =    http://www.sdo.com/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.sdo.com%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1; 这里lt参数就是我说的ticket了。 3)将获得的lt、用户名、密码还有一些其他的无关紧要的参数都Post到https://cas.sdo.com:80/cas/Login.PostTarget.aspx?service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp中,具体抓到的Post的数据如:warn=false&_eventId=submit&idtype=0&gamearea=0&gametype=0&challenge=3623&lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3A25%3A41.484&username=studyzy&password=1234&ekey=&challenge=3623,这里我们就只关心lt,username,password这三个参数。 4)获取一个只有登录後才能访问的页面,测试是否登录成功。 5.好,整个登录机制我们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、WebResponse、HttpWebRequest和HttpWebResponse等类。我们主要就基于这些类进行操作,当然完全基于Socket编程也可以,但是这里就没有这个必要了。 在不设置Cookie、PostData的情况下要获得一个页面的HTML的方法很简单: public static string GetHtml(string URL)        {            WebRequest wrt;            wrt = WebRequest.Create(URL);            wrt.Credentials = CredentialCache.DefaultCredentials;            WebResponse wrp;            wrp = wrt.GetResponse();            return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();        }    当需要获得服务器返回的Cookie的话,可以通过wrp.Headers.Get("Set-Cookie")方法来获取。 如果需要将Cookie加入到请求另外还Post数据的话其实也很简单,只需要将httpWebRequest对象中设置ContentLength 和Request的Stream就可以了。 httpWebRequest.ContentLength = byteRequest.Length;Stream stream;stream = httpWebRequest.GetRequestStream();stream.Write(byteRequest, 0, byteRequest.Length);stream.Close();    代码我就不都贴出了,我做了一个Demo在附件中,大家有兴趣研究的可以看一下。 /Files/studyzy/LoginSdoDemo.rar 代码中实现了盛大账号的登录,其实纵横天下的登录还没有完成,接下来还有选择具体服务器,将ticket转到具体服务器上再进行验证,原理也是一样的,我这里就不再累述了。 成功登录后,接下来我们只需要每次发送请求是跟上该Cookie,服务器就认为是登录的用户在操作了,接下来就可以随便灌水、Download资源了,具体要做什么就大家自己弄了,只需要在IE中操作一篇,抓包分析出来,用C#实现同样的发包就OK!
文章
C#  ·  数据安全/隐私保护  ·  机器人
2016-05-06
使用C#实现网站用户登录
我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。     HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。     服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该 Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。 现在原理已经搞清楚了,那么我们就来实现一个网站的登录嘛,这里就以盛大纵横天下的登录为例。 要写这种面向协议的网络程序,抓包工具是少不了的,我们首先是要使用抓包工具分析在普通浏览器中登录时发送和接收的内容才好进一步使用C#来模拟浏览器发包。抓包工具很多,看个人爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于我们分析。 1.最好能清除IE的所有Cookie记录,以免对抓包分析造成影响,然后开启抓包程序。 2.在IE中输入http://zh.**/web1.0/home/fastlogin.asp这个快速登录地址,我们将看到已经抓到了很多请求和响应的包。 3.输入用户名和密码,点击登录,IE中正常登录,停止抓包,我们要的所有信息都被抓取好了。如图:   4.盛大的登录机制还是属于比较复杂的,中间涉及到好几个服务器,经过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登录机制为: 1)IE请求https://cas.**:80/cas/login?service=http://zh.**/web1.0/home/index.asp页面,该页面给IE一个SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/ 2)IE同时在该HTTP的正文中得到一个ticket,这个ticket将在登录中有用,当然其他网站肯定不是这样做的,这里分析的是纵横天下的。location.href    =   http://www.**/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.**%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1; 这里lt参数就是我说的ticket了。 3)将获得的lt、用户名、密码还有一些其他的无关紧要的参数都Post到https://cas.**:80/cas/Login.PostTarget.aspx?service=http://zh.**/web1.0/home/fastlogin_after.asp中,具体抓到的Post的数据如:warn=false&_eventId=submit&idtype=0&gamearea =0&gametype=0&challenge=3623&lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21 -2008-05-06_01%3A25%3A41.484&username=studyzy&password=1234&ekey =&challenge=3623,这里我们就只关心lt,username,password这三个参数。 4)获取一个只有登录後才能访问的页面,测试是否登录成功。 5.好,整个登录机制我们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、 WebResponse、HttpWebRequest和HttpWebResponse等类。我们主要就基于这些类进行操作,当然完全基于Socket 编程也可以,但是这里就没有这个必要了。 在不设置Cookie、PostData的情况下要获得一个页面的HTML的方法很简单: public static string GetHtml(string URL)        {            WebRequest wrt;            wrt = WebRequest.Create(URL);            wrt.Credentials = CredentialCache.DefaultCredentials;            WebResponse wrp;            wrp = wrt.GetResponse();            return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();        }  当需要获得服务器返回的Cookie的话,可以通过wrp.Headers.Get("Set-Cookie")方法来获取。 如果需要将Cookie加入到请求另外还Post数据的话其实也很简单,只需要将httpWebRequest对象中设置ContentLength 和Request的Stream就可以了。 httpWebRequest.ContentLength = byteRequest.Length;Stream stream;stream = httpWebRequest.GetRequestStream();stream.Write(byteRequest, 0, byteRequest.Length);stream.Close();  代码我就不都贴出了,我做了一个Demo在附件中,大家有兴趣研究的可以看一下。/Files/studyzy/LoginSdoDemo.rar 代码中实现了盛大账号的登录,其实纵横天下的登录还没有完成,接下来还有选择具体服务器,将ticket转到具体服务器上再进行验证,原理也是一样的,我这里就不再累述了。 成功登录后,接下来我们只需要每次发送请求是跟上该Cookie,服务器就认为是登录的用户在操作了,接下来就可以随便灌水、Download资源了,具体要做什么就大家自己弄了,只需要在IE中操作一篇,抓包分析出来,用C#实现同样的发包就OK!  本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216644,如需转载请自行联系原作者
文章
C#  ·  数据安全/隐私保护  ·  机器人
2017-11-08
使用C#实现网站用户登录
 我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。     HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务 器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这 个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。     服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建 立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该 Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。 现在原理已经搞清楚了,那么我们就来实现一个网站的登录嘛,这里就以盛大纵横天下的登录为例。 要写这种面向协议的网络程序,抓包工具是少不了的,我们首先是要使用抓包工具分析在普通浏览器中登录时发送和接收的内容才好进一步使用C#来模拟浏 览器发包。抓包工具很多,看个人爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于我们分析。 1.最好能清除IE的所有Cookie记录,以免对抓包分析造成影响,然后开启抓包程序。 2.在IE中输入http://zh.**/web1.0/home/fastlogin.asp这个快速登录地址,我们将看到已经抓到了很多请求和响应的包。 3.输入用户名和密码,点击登录,IE中正常登录,停止抓包,我们要的所有信息都被抓取好了。如图: 4.盛大的登录机制还是属于比较复杂的,中间涉及到好几个服务器,经过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登录机制为: 1)IE请求https://cas.**:80/cas/login?service=http://zh.**/web1.0/home/index.asp页面,该页面给IE一个SessionID,比如Set-Cookie:ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/ 2)IE同时在该HTTP的正文中得到一个ticket,这个ticket将在登录中有用,当然其他网站肯定不是这样做的,这里分析的是纵横天下的。location.href    =   http://www.**/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.**%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1; 这里lt参数就是我说的ticket了。 3)将获得的lt、用户名、密码还有一些其他的无关紧要的参数都Post到https://cas.**:80/cas/Login.PostTarget.aspx?service=http://zh.**/web1.0/home/fastlogin_after.asp中,具体抓到的Post的数据如:warn=false&_eventId=submit&idtype=0&gamearea =0&gametype=0&challenge=3623&lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21 -2008-05-06_01%3A25%3A41.484&username=studyzy&password=1234&ekey =&challenge=3623,这里我们就只关心lt,username,password这三个参数。 4)获取一个只有登录後才能访问的页面,测试是否登录成功。 5.好,整个登录机制我们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、 WebResponse、HttpWebRequest和HttpWebResponse等类。我们主要就基于这些类进行操作,当然完全基于Socket 编程也可以,但是这里就没有这个必要了。 在不设置Cookie、PostData的情况下要获得一个页面的HTML的方法很简单: public static string GetHtml(string URL)        {            WebRequest wrt;            wrt = WebRequest.Create(URL);            wrt.Credentials = CredentialCache.DefaultCredentials;            WebResponse wrp;            wrp = wrt.GetResponse();            return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();        }  当需要获得服务器返回的Cookie的话,可以通过wrp.Headers.Get("Set-Cookie")方法来获取。 如果需要将Cookie加入到请求另外还Post数据的话其实也很简单,只需要将httpWebRequest对象中设置ContentLength 和Request的Stream就可以了。 httpWebRequest.ContentLength = byteRequest.Length;Stream stream;stream = httpWebRequest.GetRequestStream();stream.Write(byteRequest, 0, byteRequest.Length);stream.Close();  代码我就不都贴出了,我做了一个Demo在附件中,大家有兴趣研究的可以看一下。/Files/studyzy/LoginSdoDemo.rar 代码中实现了盛大账号的登录,其实纵横天下的登录还没有完成,接下来还有选择具体服务器,将ticket转到具体服务器上再进行验证,原理也是一样的,我这里就不再累述了。 成功登录后,接下来我们只需要每次发送请求是跟上该Cookie,服务器就认为是登录的用户在操作了,接下来就可以随便灌水、Download资源了,具体要做什么就大家自己弄了,只需要在IE中操作一篇,抓包分析出来,用C#实现同样的发包就OK! 本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2008/05/07/1187455.html如需转载请自行联系原作者 银河使者
文章
C#  ·  数据安全/隐私保护  ·  机器人
2017-11-04
使用C#实现网站用户登录
我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。 HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。 服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。 现在原理已经搞清楚了,那么我们就来实现一个网站的登录嘛,这里就以盛大纵横天下的登录为例。 要写这种面向协议的网络程序,抓包工具是少不了的,我们首先是要使用抓包工具分析在普通浏览器中登录时发送和接收的内容才好进一步使用C#来模拟浏览器发包。抓包工具很多,看个人爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于我们分析。 1.最好能清除IE的所有Cookie记录,以免对抓包分析造成影响,然后开启抓包程序。 2.在IE中输入http://zh.sdo.com/web1.0/home/fastlogin.asp 这个快速登录地址,我们将看到已经抓到了很多请求和响应的包。 3.输入用户名和密码,点击登录,IE中正常登录,停止抓包,我们要的所有信息都被抓取好了。如图: 4.盛大的登录机制还是属于比较复杂的,中间涉及到好几个服务器,经过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登录机制为: 1)IE请求https://cas.sdo.com:80/cas/login?service=http://zh.sdo.com/web1.0/home/index.asp页面,该页面给IE一个SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/ 2)IE同时在该HTTP的正文中得到一个ticket,这个ticket将在登录中有用,当然其他网站肯定不是这样做的,这里分析的是纵横天下的。location.href    =    http://www.sdo.com/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.sdo.com%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1; 这里lt参数就是我说的ticket了。 3)将获得的lt、用户名、密码还有一些其他的无关紧要的参数都Post到https://cas.sdo.com:80/cas/Login.PostTarget.aspx?service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp 中,具体抓到的Post的数据如:warn=false&_eventId=submit&idtype=0&gamearea=0&gametype=0&challenge=3623&lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3A25%3A41.484&username=studyzy&password=1234&ekey=&challenge=3623,这里我们就只关心lt,username,password这三个参数。 4)获取一个只有登录後才能访问的页面,测试是否登录成功。 5.好,整个登录机制我们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、WebResponse、HttpWebRequest和HttpWebResponse等类。我们主要就基于这些类进行操作,当然完全基于Socket编程也可以,但是这里就没有这个必要了。 在不设置Cookie、PostData的情况下要获得一个页面的HTML的方法很简单: public static string GetHtml(string URL)        {            WebRequest wrt;            wrt = WebRequest.Create(URL);            wrt.Credentials = CredentialCache.DefaultCredentials;            WebResponse wrp;            wrp = wrt.GetResponse();            return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();        }    当需要获得服务器返回的Cookie的话,可以通过wrp.Headers.Get("Set-Cookie")方法来获取。 如果需要将Cookie加入到请求另外还Post数据的话其实也很简单,只需要将httpWebRequest对象中设置ContentLength 和Request的Stream就可以了。 httpWebRequest.ContentLength = byteRequest.Length;Stream stream;stream = httpWebRequest.GetRequestStream();stream.Write(byteRequest, 0, byteRequest.Length);stream.Close();    代码我就不都贴出了,我做了一个Demo在附件中,大家有兴趣研究的可以看一下。 /Files/studyzy/LoginSdoDemo.rar 代码中实现了盛大账号的登录,其实纵横天下的登录还没有完成,接下来还有选择具体服务器,将ticket转到具体服务器上再进行验证,原理也是一样的,我这里就不再累述了。 成功登录后,接下来我们只需要每次发送请求是跟上该Cookie,服务器就认为是登录的用户在操作了,接下来就可以随便灌水、Download资源了,具体要做什么就大家自己弄了,只需要在IE中操作一篇,抓包分析出来,用C#实现同样的发包就OK! 本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2008/05/06/1184341.html,如需转载请自行联系原作者
文章
C#  ·  数据安全/隐私保护  ·  机器人
2011-01-07
Linux下双机HA的功能实现(理论)
——基于heartbeat方式 HeartBeat 运行于备用主机上的Heartbeat可以通过以太网连接检测主服务器的运行状态,一旦其无法检测到主服务器的“心跳”则自动接管主服务器的资源。通常情况下,主、备服务器间的心跳连接是一个独立的物理连接,这个连接可以是串行线缆、一个由“交叉线”实现的以太网连接。Heartbeat甚至可同时通过多个物理连接检测主服务器的工作状态,而其只要能通过其中一个连接收到主服务器处于活动状态的信息,就会认为主服务器处于正常状态。从实践经验的角度来说,建议为Heartbeat配置多条独立的物理连接,以避免Heartbeat通信线路本身存在单点故障。 1、串行电缆:被认为是比以太网连接安全性稍好些的连接方式,因为hacker无法通过串行连接运行诸如telnet、ssh或rsh类的程序,从而可以降低其通过已劫持的服务器再次侵入备份服务器的几率。但串行线缆受限于可用长度,因此主、备服务器的距离必须非常短。 2、以太网连接:使用此方式可以消除串行线缆的在长度方面限制,并且可以通过此连接在主备服务器间同步文件系统,从而减少了从正常通信连接带宽的占用。 基于冗余的角度考虑,应该在主、备服务器使用两个物理连接传输heartbeat的控制信息;这样可以避免在一个网络或线缆故障时导致两个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”(split-brain)或“partitioned cluster”。在两个节点共享同一个物理设备资源的情况下,脑裂会产生相当可怕的后果。 为了避免出现脑裂,可采用下面的预防措施: 1、如前所述,在主、备节点间建立一个冗余的、可靠的物理连接来同时传送控制信息; 2、一旦发生脑裂时,借助额外设备强制性地关闭其中一个节点; 第二种方式即是俗称的“将其它节点‘爆头’(shoot the other node in the head)”,简称为STONITH。基于能够通过软件指令关闭某节点特殊的硬件设备,Heartbeat即可实现可配置的Stonith。但当主、备服务器是基于WAN进行通信时,则很难避免“脑裂”情景的出现。因此,当构建异地“容灾”的应用时,应尽量避免主、备节点共享物理资源。 Heartbeat的控制信息: “心跳”信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每个节点配置其向其它节点通报“心跳”信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出现了运行等错误之前的等待时间。 集群变动事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变动信息,它们在节点间需要进行资源迁移时为不同节点上heartbeat进程间会话传递信息。比如,当修复了主节点并且使其重新“上线”后,主节点会使用ip-request要求备用节点释放其此前从因主节点故障而从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经不再占用此前接管的资源。主接点收到ip-request-resp后就会重新启动服务。 重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息“失序”(heartbeat进程使用序列号来确保数据包在传输过程中没有被丢弃或出现错误)时,会要求对方重新传送此控制信息。 Heartbeat一般每一秒发送一次重传请求,以避免洪泛。 上面三种控制信息均基于UDP协议进行传送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播地址(使用以太网连接的情况下)。 此外,除了使用“序列号/确认”机制来确保控制信息的可靠传输外,Heartbeat还会使用MD5或SHA1为每个数据包进行签名以确保传输中的控制信息的安全性。 资源脚本: 资源脚本(resource scripts)即Heartbeat控制下的脚本。这些脚本可以添加或移除IP别名(IP alias)或从属IP地址(secondary IP address),或者包含了可以启动/停止服务能力之外数据包的处理功能等。通常,Heartbeat会到/etc/init.d/或/etc/ha.d/resource.d/目录中读取脚本文件。Heartbeat需要一直明确了解“资源”归哪个节点拥有或由哪个节点提供。在编写一个脚本来启动或停止某个资源时,一定在要脚本中明确判断出相关服务是否由当前系统所提供。 Heartbeat的配置文件: /etc/ha.d/ha.cf 定义位于不同节点上的heartbeat进程间如何进行通信; 1.3.1 配置ha.cf文件  ha.cf是heartbeat的主要配置文件,可以对heartbeat的多数性能和状态进行配置。大部分选项的取值可以采用默认值,其中的主要选项及配置方法说明如下:  debugfile /var/log/ha-debug:该文件保存heartbeat的调试信息  logfile /var/log/ha-log:heartbeat的日志文件  keepalive 2:心跳的时间间隔,默认时间单位为秒  deadtime 30:超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡。  warntime 10:超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中。  initdead 120:在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。  udpport 694:设置广播通信使用的端口,694为默认使用的端口号。  baud 19200:设置串行通信的波特率。  serial /dev/ttyS0:选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网连接,则应该关闭该选项。  bcast eth0:设置广播通信所使用的网络接口卡。  auto_failback on:heartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代从节点,否则不取代从节点。  ping ping-node1 ping-node2:指定ping node,ping node并不构成双机节点,它们仅仅用来测试网络连接。  respawn hacluster /usr/lib/heartbeat/ipfail:指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络连接。 /etc/ha.d/haresources 定义对某个资源来说哪个服务器是主节点,以及哪个节点应该拥有客户端访问资源时的目标IP地址。  authkeys文件用于heartbeat的鉴权设置,共有三种可用的鉴权方式:crc、md5和sha1。三种方式安全性依次提高,但同时占用的系统资源也依次扩大。crc安全性最低,适用于物理上比较安全的网络,sha1提供最为有效的鉴权方式,占用的系统资源也最多。  其配置语句格式如下:  auth <number>  <number> <authmethod> [<authkey>]  举例说明:  auth 1  1 sha1 key-for-sha1  其中键值key-for-sha1可以任意指定,number设置必须保证上下一致。  auth 2  2 crc  crc方式不需要指定键值。 /etc/ha.d/authkeys 定义Heartbeat包在通信过程中如何进行加密。 当ha.cf或authkeys文件发生改变时,需要重新加载它们就可以使用之生效;而如果haresource文件发生了改变,则只能重启heartbeat服务方可使之生效。 尽管Heartbeat并不要求主从节点间进行时钟同步,但它们彼此间的时间差距不能超过1分钟,否则一些配置为高可用的服务可能会出异常。 Heartbeat当前也不监控其所控制的资源的状态,比如它们是否正在运行,是否运行良好以及是否可供客户端访问等。要想监控这些资源,冉要使用额外的Mon软件包来实现。 haresources配置文件介绍: 主从节点上的/etc/ra.d/raresource文件必须完全相同。文件每行通常包含以下组成部分: 1、服务器名字:指正常情况下资源运行的那个节点(即主节点),后跟一个空格或tab;这里指定的名字必须跟某个节点上的命令"uname -n"的返回值相同; 2、IP别名(即额外的IP地址,可选):在启动资源之前添加至系统的附加IP地址,后跟空格或tab;IP地址后面通常会跟一个子网掩码和广播地址,彼此间用“/”隔开; 3、资源脚本:即用来启动或停止资源的脚本,位于/etc/init.d/或/etc/ha.d/resourcd.d目录中;如果需要传递参数给资源脚本,脚本和参数之间需要用两个冒号分隔,多个参数时彼此间也需要用两个冒号分隔;如果有多个资源脚本,彼此间也需要使用空格隔开;  haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等。其配置语句格式如下:  node-name network-config <resource-group>  其中node-name指定双机系统的主节点,取值必须匹配ha.cf文件中node选项设置的主机名中的一个,node选项设置的另一个主机名成为从节点。  network-config用于网络设置,包括指定集群IP、子网掩码、广播地址等。resource-group用于设置heartbeat启动的服务,该服务最终由双机系统通过集群IP对外提供。 格式如下: primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2] 例如: primary-server 221.67.132.195 sendmail httpd HA的LVS集群有两台Director,在启动时,主节点占有集群负载均衡资源(VIP和LVS的转发及高度规则),备用节点监听主节点的“心跳”信息并在主节点出现异常时进行“故障转移”而取得资源使用权,这包括如下步骤: 1、添加VIP至其网络接口; 2、广播GARP信息,通知网络内的其它主机目前本Director其占有VIP; 3、创建IPVS表以实现入站请求连接的负载均衡; 4、Stonith; 弃用resource脚本,改用ldirecotord来控制LVS: ldirectord用来实现LVS负载均衡资源的在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各Realserver的运行状态,一旦发现某Realserver运行异常时,还可以将其从IPVS表中移除。 ldirectord进程通过向Realserver的RIP发送资源访问请求并通过由Realserver返回的响应信息来确定Realserver的运行状态。在Director上,每一个VIP需要一个单独的ldirector进程。如果Realserver不能正常响应Directord上ldirectord的请求,ldirectord进程将通过ipvsadm命令将此Realserver从IPVS表中移除。而一旦Realserver再次上线,ldirectord会使用正确的ipvsadm命令将其信息重新添加至IPVS表中。 例如,为了监控一组提供web服务的Realserver,ldirectord进程使用HTTP协议请求访问每台Realserver上的某个特定网页。ldirectord进程根据自己的配置文件中事先定义了的Realserver的正常响应结果来判断当前的返回结果是否正常。比如,在每台web服务器的网站目录中存放一个页面".ldirector.html",其内容为"GOOD",ldirectord进程每隔一段时间就访问一次此网页,并根据获取到的响应信息来判断Realserver的运行状态是否正常。如果其返回的信息不是"GOOD",则表明服务不正常。 ldirectord需要从/etc/ha.d/目录中读取配置文件,文件名可以任意,但建议最好见名知义。 实现过程: 创建/etc/ha.d/ldirectord-192.168.0.219.cf,添加如下内容: # Global Directives checktimeout=20 # ldirectord等待Realserver健康检查完成的时间,单位为秒; # 任何原因的检查错误或超过此时间限制,ldirector将会将此Realserver从IPVS表中移除; checkinterval=5 # 每次检查的时间间隔,即检查的频率; autoreload=yes # 此项用来定义ldirectord是否定期每隔一段时间检查此配置文件是否发生改变并自动重新加载此文件; logfile="/var/log/ldirectord.log" # 定义日志文件存放位置; quiescent=yes # 当某台Realserver出现异常,此项可将其设置为静默状态(即其权重为“0”)从而不再响应客户端的访问请求; # For an http virtual service virtual=192.168.0.219:80 # 此项用来定义LVS服务及其使用的VIP和PORT real=192.168.0.221:80 gate 100 # 定义Realserver,语法:real=RIP:port gate|masq|ipip [weight] real=192.168.0.223:80 gate 300 fallback=127.0.0.1:80 gate # 当IPVS表没有任何可用的Realserver时,此“地址:端口”作为最后响应的服务; # 一般指向127.0.0.1,并可以通过一个包含错误信息的页面通知用户服务发生了异常; service=http # 定义基于什么服务来测试Realserver; request=".ldirectord.html" receive="GOOD" scheduler=wlc #persistent=600 #netmask=255.255.255.255 protocol=tcp # 定义此虚拟服务用到的协议; checktype=negotiate # ldirectord进程用于监控Realserver的方法;{negotiate|connect|A number|off} checkport=80 在/etc/hd.d/haresources中添加类似如下行: node1.example.com 192.168.0.219 ldirectord::ldirectord-192.168.0.219.cf 本文转自 linuxtro 51CTO博客,原文链接:http://blog.51cto.com/linuxtro/287651,如需转载请自行联系原作者
文章
负载均衡  ·  监控  ·  网络协议  ·  Linux
2017-11-22
Linux负载均衡专题(个人心得和笔记按照下面的步骤就能建立可用的集群)
http://www.askwan.com/post/28/ haproxy+keepalived   Linux企业集群 http://book.51cto.com/art/200806/76015.htm#   第一步:rsync同步web数据(测试通过并且自己加入了ssh的RSA key验证) http://www.linuxsir.org/main/?q=node/256   rsync 服务器架设方法 v0.1b (正在修订中)   第二步:安装heartbeat并且可以故障切换(正在学习中..) centos 5.2 yum install -y heartbeat heartbeat-devel heartbeat-ldirectord heartbeat-gui piranha   第三步:配置heartbeat 因为是rpm安装所以默认/etc/ha.d/中没有包含ha.cf,authkeys,haresources这三个文件必须拷贝过来 rpm查询cat /etc/ha.d/README.config You need three configuration files to make heartbeat happy,and they all go in this directory. They are:        ha.cf           Main configuration file        haresources     Resource configuration file        authkeys        Authentication information These first two may be readable by everyone, but the authkeys filemust not be. The good news is that sample versions of these files may be found inthe documentation directory (providing you installed the documentation). If you installed heartbeat using rpm packages thenthis command will show you where they are on your system:                rpm -q heartbeat -d If you installed heartbeat using Debian packages thenthe documentation should be located in /usr/share/doc/heartbeat 然后利用cp把三个文件拷贝到/etc/ha.d/中 第四步:具体安装 http://linux.chinaunix.net/bbs/viewthread.php?tid=1051263 heartbeat2.x的测试终结篇,针对使用heartbeat的新手 注意:例如我们想做httpd的双机热备份的话,首先要把httpd的启动脚本从init中删除 chkconfig --del httpd chkconfig --level 345 httpd off 删除完成以后修改haresources HA2 192.168.0.40 httpd 注意这里生成完成了还是不能用必须用/usr/lib/heartbeat/haresources2cib.py haresources重新弄cib.xml和cib.xml.sig   主题:heartbeat V2在CentOS4.6上简要安装、配置笔记 http://www.javaeye.com/topic/191076 heartbeat2.1.4 实现监控应用服务(mysql)具体步骤 http://www.china-lg.com/blog/index.php?play=show&id=553 Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache Web 服务器 http://www.ibm.com/developerworks/cn/linux/l-halinux/index.html LVS+Heartbeat+Ldirectord在RHEL5上 http://blog.chinaunix.net/u2/82873/showart_1405630.html 基于LVS的互联网应用 http://unix.ctocio.com.cn/196/8689196_5.shtml 基于LVS的Linux负载均衡技术实现  http://net.it168.com/a2008/0731/199/000000199163.shtml ipvsadm Man http://linux.die.net/man/8/ipvsadm  利用LVS+Keepalived 实现高性能高可用负载均衡服务器 http://www.linuxtone.org/thread-1077-1-1.html Linux Virtual Server负载均衡 ipvsadm使用方法 http://www.lslnet.com/linux/docs/linux-7916.htm 使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务 http://www.clusting.com/cluster/load_balancing/LVS_1.html 请教LVS三种工作模式和算法、session保持的问题!!! 有几个关LVS问题,小弟想请教一下:1、在配置LVS时,小弟想用DR模式。我想请问一下如果确定使用此模式,或是改用NAT 或是TUN模式时,该通过ipvsadm的哪个命令参数指定,ipvsadm -A -t $VIP:80 -s rr 变化rr 这个参数指定的。2、LVS的十种轮询算法,该如何通过配置文件或是命令指定。 3、在配置LVS不知道该如何解决session保持的问题,因为有些电子商务网站需要始终保持同一个连接,连接到同一个realserver. -m NAT-i TUN算法:-s 指定session保持:-p ---这全在手册中,或者ipvsadm -h都可以查到 多谢指点已经明白,小弟还有一问,请指点,,, 关于网站后台数据库或资料同步的问题,小弟想到如下办法:前提在没有做共享磁盘的前提下,如果数据库想要同步的话,可能要配置oracle热备,如果是mysql就可配置主从,等等,关于网站其它文件,如图片之类的,小弟想到rsync 或是在上传时同步上传。如果是做了共享磁盘,如果/date目录吧。那么几台realserver可以挂载此目录到本机了,网站的数据,还数据库都可以放在此目录了。。但问题是多个realserve要是同时写一个文件时,该如果是好呢?不知是否支持并行写入,小弟觉得关于集群配置磁盘共享这块,也就是多个realserver数据同步的问题不太好解决,也是小弟最大凝问之处,很想有机会搭建SAN,或是NAS,好好试验一下,如果搭建NAS,,使用linux的NFS就可以吧。而且也有一些集群文件系统GFS之类,等等。。。一直不太明确后端数据存储的一致性问题。     http://www.diybl.com/course/6_system/linux/Linuxjs/200868/123619.html 在RHEL5中用piranha架设squid的lvs集群   http://www.yatan.com/group/topic.php?tid=21513 在RHEL4系统中配置LVS负载均衡群集 http://www.linuxbyte.net.cn/article/rhel/2008-08-10/843.html RHEL-LVS 实验(1)VS-NAT http://www.linuxtopia.org/online_books/rhel5/rhel5_clustering_guide/rhel5_cluster_s2-lvs-routing-CSO.html rhel 5 cluseter   http://blog.80s.net.cn/?p=476 lvs安装以及配置   http://tech.ddvip.com/2008-11/122768078295163_3.html   redhatAS4.2 安装集群LVS   http://bbs.bbsgood.com/post_45_129231_1.html 虚拟机中的lvs负载均衡  
文章
负载均衡  ·  算法  ·  Linux  ·  数据库  ·  关系型数据库  ·  文件存储  ·  MySQL  ·  Oracle  ·  Go  ·  网络安全
2009-01-25
大数据日志分析项目架构
老是弹出由于您编辑时间过长,页面和服务器之间的连接已断开,请先将文章内容另外保存,再刷新本页面继续编辑让我保存页面我也是醉了,图片多没法一次上传,上传图片还一直失败,我只好都放在一个附件里面了。阿里能花点心思把网址做好一点么 共两个开发项目,git地址:https://github.com/dengziming/hongya-report.git,https://github.com/dengziming/hongya-taobaopayment.git 项目简介:大数据涉及到的业务很多很复杂,从一开始的项目架构,再到后台的网站搭建,以及数据的收集,数据的分析,数据的迁移,业务开发,后台运维,等等。我们没办法一个实验将所有的过程都学习到。本次试验我们将会将重点放在项目架构上,后面的项目我们将重点放在每一部分的实现上。通过本次实验,你将能了解到一个大数据架构师工作的基本步骤,虽然本次实验我们也有复杂的代码分析过程,但是大家没有必要将自己的重点放在代码上面,大家应该更加站在架构师的角度,专注于整个项目每一部分的连接,每个部分具体实现的细节,大家可以不必太深入,我们后期会有专门的实验放在这上面。有关代码我们已经实现并且提供,大家直接打开,然后阅读熟悉每部分的意义即可。本次项目我们是架构一个日志分析,我们的要完成的任务包括后台和前端的实现,网站的搭建,nginx反向代理的搭建,etl数据清洗程序,数据分析,数据报表的实现。 一、业务分析和需求文档 1.业务分析概述 本次试验我们主要是分析类似淘宝等购物网站上的点击流,从而进行展示分析。在本次项目中我们分别从七个大的角度来进行分析,分别为: 用户基本信息分析模块、浏览器信息分析模块、地域信息分析模块、用户浏览深度分析模块、外链数据分析模块、订单分析模块以及事件分析模块。 注意几个概念: 用户/访客:表示同一个浏览器代表的用户。唯一标示用户 会员:表示网站的一个正常的会员用户。 会话:一段时间内的连续操作,就是一个会话中的所有操作。 Pv:访问页面的数量 在本次项目中,所有的计数都是去重过的。比如:活跃用户/访客,计算uuid的去重后的个数。 我们分析数据的需求文档和最终的展示结果大概如下。 2.用户基本信息分析模块 用户基本信息分析模块主要是从用户/访客和会员两个主要角度分析浏览相关信息,包括但不限于新增用户,活跃用户,总用户,新增会员,活跃会员,总会员以及会话分析等。下面就各个不同的用户信息角度来进行分析: (1).用户分析 该分析主要分析新增用户、活跃用户以及总用户的相关信息。新访客:老访客(活跃访客中) = 1:7~10 (2).会员分析 该分析主要分析新增会员、活跃会员以及总会员的相关信息。 (3).会话分析 该分析主要分析会话个数、会话长度和平均会话长度相关的信息。 (4).Hourly分析 该分析主要分析每天每小时的用户、会话个数以及会话长度的相关信息。 3.其他模块分析 在用户模块的基础上,我们可以添加其他的六个模块分析,我们本次试验先不展示所有的模块,只是作简单介绍,例如地域分布模块: 上面分析的业务需求大家可能不太懂,没关系,注意在下面的项目中,时不时回头看看我们的需求,就能明白了。 二、开发环境搭建 为了方便管理,我们以后按照管理,尽量使用maven构建java和scala项目。另外我们的软件安装在D盘的soft目录下,我们的开发项目放在D盘的workspace目录下。 1.下载安装软件 分别在http://tomcat.apache.org和http://maven.apache.org下载tomcat和maven,解压后放在D盘的soft目录,然后配置环境变量,需要配置的环境变量包括 MAVEN_HOME和TOMCAT_HOME,并且将他们的bin目录添加到PATH中。安装配置完成后,在命令行输入start-up和mvn命令,检查是否安装正确。确保无误后,我们的开发环境使用IDEA,安装好IDEA,打开,配置maven的目录,如下图的方法,搜索maven,在Maven的配置填写maven的路径。 2.搭建服务器 (1).布置开发环境 如果大家熟悉javaEE开发,这一段就比较简单。我们搭建服务器就是新建一个javaEE项目,然后启动,这个过程需要借助tomcat实现。首先打开IDEA,IDEA中已经配置好了maven的路径。点击File ->New -> Project ,选择java的web application,然后下一步: 在下一步我们设置项目路径,我们的项目名为taobaopayment,放在D盘下的workspace目录下。然后点击完成。这时候就新建了一个web项目,我们在项目的web文件下能看到一个index.jsp文件,这个文件你可以修改为自定义的内容,例如我修改为: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>taobaopayment</title> </head> <body> 支付页面 </body> </html> (2).本地发布项目 菜单栏选择Run ->Edit Configuration或者点击右上角按钮添加tomcat的发布参数,依次点击 加号 ->tomcat server -> local ,添加tomcat: 在右边的配置页面配置好名字、地址、端口: 然后在deployment选项下面点击加号添加发布选项,然后设置你content名字,我们设置为 taobaopayment: 点击确定后,我们可以看到右上方和下方都出现了可以启动的三角形按钮,点击启动: 启动成功后打开浏览器,输入http://localhost:8080/taobaopayment/,出现我们刚刚编辑的jsp页面,剩下的操作自己实验。 三、Web服务器开发 根据我们的需求文档,我们需要实现支付成功和退款页面。这里又分为两部分,一是前端的页面传来的请求数据,这部分代码使用JavaScript编写,另一方面是后台的服务器发送过来的代码,通过Java语言编写。 1.后端开发 (1).程序后台事件分析 本项目中在程序后台会有chargeSuccess事件,本事件的主要作用是发送订单成功的信息给nginx服务器。发送格式同pc端发送方式, 也是访问同一个url来进行数据的传输。格式为:http://hongyahuayu.com/index.jpg?query1=spark当会员最终支付成功的时候触发chargeSuccess该事件,该事件需要程序主动调用,然后向后台发送数据:u_mid=maomao&c_time=1449142044528&oid=orderid_1&ver=1&en=e_cs&pl=jdk&sdk=java,其中 u_mid和oid代表用户id和订单id。前面我们分析了后端的业务,如果你不太懂,我们尅简单地说,后端程序的工作流如下:简单说,后端就是要设计方法,当chargeSuccess触发的时候,我们给后台发送数据。 (2).后端程序开发 程序开发有一定难度,另外由于我们本次试验的重点是后面的数据分析,这一块不作太高的要求,大家能够理解即可,核心代码如下,其余代码可以在项目中查看: public static boolean onChargeSuccess(String orderId, String memberId) { try { if (isEmpty(orderId) || isEmpty(memberId)) { // 订单id或者memberid为空 log.log(Level.WARNING, "订单id和会员id不能为空"); return false; } // 代码执行到这儿,表示订单id和会员id都不为空。 Map<String, String> data = new HashMap<String, String>(); data.put("u_mid", memberId); data.put("oid", orderId); data.put("c_time", String.valueOf(System.currentTimeMillis())); data.put("ver", version); data.put("en", "e_cs"); data.put("pl", platformName); data.put("sdk", sdkName); // 创建url String url = buildUrl(data); // 发送url&将url加入到队列 SendDataMonitor.addSendUrl(url); return true; } catch (Throwable e) { log.log(Level.WARNING, "发送数据异常", e); } return false; } 注意事项 修改代码这里url地址为自己服务器的地址: 2.前端开发 (1).前端事件分析 前面我们说后端的事件主要是chargeSuccess,前端的时间处理就更复杂了。针对我们最终的不同分析模块,我们需要不同的数据,接下来分别从各个模块分析,每个模块需要的数据。 用户基本信息就是用户的浏览行为信息分析,也就是我们只需要pageview事件就可以了; 浏览器信息分析以及地域信息分析其实就是在用户基本信息分析的基础上添加浏览器和地域这个维度信息,其中浏览器信息我们可以通过浏览器的window.navigator.userAgent来进行分析,地域信息可以通过nginx服务器来收集用户的ip地址来进行分析,也就是说pageview事件也可以满足这两个模块的分析。 外链数据分析以及用户浏览深度分析我们可以在pageview事件中添加访问页面的当前url和前一个页面的url来进行处理分析,也就是说pageview事件也可以满足这两个模块的分析。 订单信息分析要求pc端发送一个订单产生的事件,那么对应这个模块的分析,我们需要一个新的事件chargeRequest。对于事件分析我们也需要一个pc端发送一个新的事件数据,我们可以定义为event。我们要分析的模块包括: 用户基本信息分析 浏览器信息分析 地域信息分析 外链数据分析 用户浏览深度分析 订单信息分析 我们处理的事件包括: pageview事件 chargeRequest事件 launch事件 第一,Launch事件。当用户第一次访问网站的时候触发该事件,不提供对外调用的接口,只实现该事件的数据收集。第二,Pageview事件,当用户访问页面/刷新页面的时候触发该事件。该事件会自动调用,也可以让程序员手动调用。第三,chargeRequest事件。当用户下订单的时候触发该事件,该事件需要程序主动调用。每次都会发送对应的数据,例如: u_sd=8E9559B3-DA35-44E1-AC98-85EB37D1F263&c_time=1449139048231&oid=orderid123&on=%E4%BA%A7%E5%93%81%E5%90%8D%E7%A7%B0&cua=1000&cut=%E4%BA%BA%E6%B0%91%E5%B8%81&pt=%E6%B7%98%E5%AE%9D&ver=1&en=e_cr&pl=website&sdk=js&b_rst=1920*1080&u_ud=12BF4079-223E-4A57-AC60-C1A04D8F7A2F&b_iev=Mozilla%2F5.0%20(Windows%20NT%206.1%3B%20WOW64)%20AppleWebKit%2F537.1%20(KHTML%2C%20like%20Gecko)%20Chrome%2F21.0.1180.77%20Safari%2F537.1&l=zh-CN 这个url的字段比较多,字段词典如下: 参数名称 类型 描述 en string 事件名称, eg: e_pv ver string 版本号, eg: 0.0.1 pl string 平台, eg: website sdk string Sdk类型, eg: js b_rst string 浏览器分辨率,eg: 1800*678 b_iev string 浏览器信息useragent u_ud string 用户/访客唯一标识符 l string 客户端语言 u_mid string 会员id,和业务系统一致 u_sd string 会话id c_time string 客户端时间 p_url string 当前页面的url p_ref string 上一个页面的url tt string 当前页面的标题 ca string Event事件的Category名称 ac string Event事件的action名称 kv_* string Event事件的自定义属性 du string Event事件的持续时间 oid string 订单id on string 订单名称 cua string 支付金额 cut string 支付货币类型 pt string 支付方式 (2).前端程序开发 前面我们简单实现了后端开发,现在前端的JavaScript代码实现可能就更复杂了,对大家来说难度略大,但是还好这不是我们的重点,我大概展示几个函数: onPageView: function() { // 触发page view事件 if (this.preCallApi()) { var time = new Date().getTime(); var pageviewEvent = {}; pageviewEvent[this.columns.eventName] = this.keys.pageView; pageviewEvent[this.columns.currentUrl] = window.location.href; // 设置当前url pageviewEvent[this.columns.referrerUrl] = document.referrer; // 设置前一个页面的url pageviewEvent[this.columns.title] = document.title; // 设置title this.setCommonColumns(pageviewEvent); // 设置公用columns this.sendDataToServer(this.parseParam(pageviewEvent)); // 最终发送编码后的数据ss this.updatePreVisitTime(time); } }, onChargeRequest: function(orderId, name, currencyAmount, currencyType, paymentType) { // 触发订单产生事件 if (this.preCallApi()) { if (!orderId || !currencyType || !paymentType) { this.log("订单id、货币类型以及支付方式不能为空"); return ; } if (typeof(currencyAmount) == "number") { // 金额必须是数字 var time = new Date().getTime(); var chargeRequestEvent = {}; chargeRequestEvent[this.columns.eventName] = this.keys.chargeRequestEvent; chargeRequestEvent[this.columns.orderId] = orderId; chargeRequestEvent[this.columns.orderName] = name; chargeRequestEvent[this.columns.currencyAmount] = currencyAmount; chargeRequestEvent[this.columns.currencyType] = currencyType; chargeRequestEvent[this.columns.paymentType] = paymentType; this.setCommonColumns(chargeRequestEvent); // 设置公用columns this.sendDataToServer(this.parseParam(chargeRequestEvent)); // 最终发送编码后的数据ss this.updatePreVisitTime(time); } else { this.log("订单金额必须是数字"); return ; } } }, onEventDuration: function(category, action, map, duration) { // 触发event事件 if (this.preCallApi()) { if (category && action) { var time = new Date().getTime(); var event = {}; event[this.columns.eventName] = this.keys.eventDurationEvent; event[this.columns.category] = category; event[this.columns.action] = action; if (map) { for (var k in map){ if (k && map[k]) { event[this.columns.kv + k] = map[k]; } } } if (duration) { event[this.columns.duration] = duration; } this.setCommonColumns(event); // 设置公用columns this.sendDataToServer(this.parseParam(event)); // 最终发送编码后的数据ss this.updatePreVisitTime(time); } else { this.log("category和action不能为空"); } } } 完整的代码,如果有兴趣自己可以详细研究, 注意事项 ,发布的时候一定要将代码中的url改为你的服务器的url: 3.项目发布 (1).本地项目发布 前面我们已经简单的实现了后台和前端的代码,首先我们在本地启动服务,方法和前面一样,只是我们将自己的代码添加进去了,点击启动按钮。 然后去浏览器访问 http://localhost:8080/taobaopayment/demo4.jsp,然后点击跳转按钮测试截止现在我们的后台项目基本完成,这里面的代码比较难,大家可以根据情况查看,不用花太多的精力。 (2).发布到linux的tomcat上 我们的项目不可能放在本地运行,需要放到Linux的集群环境才能正常运行。首先打开Xshell,连上linux节点。第一步,在Linux上安装tomcat。安装的过程很简单,首先要安装java配置JAVA相关环境变量,然后在tomcat的官网下载tomcat的tar.gz包,解压,然后配置tomcat相关环境变量。启动tomcat的命令是tomcat安装目录下面的bin下面的startup.sh,执行就能启动tomcat,然后访问节点的8080端口,如图: 第二步,将项目打成war包。类似以前打jar包,点开project structure -> artificts,添加一个artifict,名字为taobaopayment,type选择 Web Application:Archive,设置好对应的输出目录output idrectory,一般默认即可,然后点击确定 设置好后,点击build -> build artifacts,构建war包构建结束后,进入刚刚设置的输出目录,你将会在刚刚设置的目录下看到一个war包。 通过xshell的xftp工具,将打出来的war包拷贝放在linux的tomcat安装目录的webapps目录下:然后tomcat会自动解压war包,我们就可以在浏览器访问刚刚发布的项目了:到这里我们的整个后端项目就发布成功了。 四、数据分析系统开发 本次我们的重心是整个系统的搭建,这部分的开发过程比较复杂,大家酌情进行学习,代码我们已经写好,大家只要稍作理解。细节和逻辑我们后续的实验还会讲解。 1.需求回顾 之前我们已经做过需求分析,这时候大家再回头看看我们一开始的需求设计,我们是要完成几个关键指标的设计分析。假设我们已经配置好了tomcat和nginx,那么我们知道每次用有浏览等行为时,我们的服务器就会给我们的设置的url发送数据,然后nginx就会收到我们发送的数据。接下来就是分析nginx收集到的数据。 随便选取一条数据查看: 192.168.126.1^A1458731952.690^A192.168.126.11^A/log.gif?en=e_pv&p_url=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&p_ref=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&tt=%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A21&ver=1&pl=website&sdk=js&u_ud=EAB36BC9-0347-4D33-8579-AA8C331D001A&u_mid=laoxiao&u_sd=2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785&c_time=1458731943823&l=zh-CN&b_iev=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64%3B%20rv%3A45.0)%20Gecko%2F20100101%20Firefox%2F45.0&b_rst=1366*768 这条数据提取了很多来自url的query信息,通过^A隔开,我们需要编写代码分析这种数据。 2.ETL处理 (1).定义工具类 本次试验的工具类主要是从一个url中抽取KPI信息,我们前面的业务需要的信息包括了地址、浏览器、操作系统等,根据我们的分析,所以我们需要使用IP地址解析等工具。解析url的工具类我们放在com.hongya.etl.util下面,大家自己认真分析。 (2).定义相关常量类 我们的数据分析是有时间段的,我们分析的结果放进hbase中的表中,表名、字段名、时间范围等都是需要用到的常量,我们放在com.hongya.common下面,大家可以查看。 (3).业务代码 我们的数据字段含义在前面已经讲过了,现在我们需要将数据解析后放进hbase中。ETL过程就是简单的字符串处理,只需要一个Mapper程序即可完成。相应的代码在com.hongya.etl.mr.ald中,大家可以查看。 (4).本地测试运行 然后我们在本地新建一个文件,将上面哪一行测试数据放进去: 192.168.126.1^A1458731952.690^A192.168.126.11^A/log.gif?en=e_pv&p_url=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&p_ref=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&tt=%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A21&ver=1&pl=website&sdk=js&u_ud=EAB36BC9-0347-4D33-8579-AA8C331D001A&u_mid=laoxiao&u_sd=2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785&c_time=1458731943823&l=zh-CN&b_iev=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64%3B%20rv%3A45.0)%20Gecko%2F20100101%20Firefox%2F45.0&b_rst=1366*768 然后我们将com.hongya.etl.mr.ald.AnalyserLogDataRunner中的setJobInputPaths方法的路径改为刚刚添加的文件的路径,并且在setConf方法设置一下zookeeper地址,并且启动zookeeper,就可以点击运行,在本地观察结果。如图我们可以看出ETL后将这一行数据转化为了Hbase的一条Put,这里一直运行不结束是因为我没有启动Hbase,所以一直没法写进去,发布项目的时候是需要启动的。这个Mapper读取数据格式上面有,而写出的数据格式是Hbase的Put。不知道大家是否记得Hbase的javaAPI,我们介绍过Put的使用。最后我们每一条记录将会放进Hbase的表格中,例如上面的示例数据最后会解析为一条Put数据,我们可以看出它的rowKey是带着日期的: rowKey 1458731952690_84973288 cf: info ,key:tt value:测试页面1 cf: info ,key:country value:unknown cf: info ,key:ver value:1 cf: info ,key:u_mid value:laoxiao cf: info ,key:os value:Windows cf: info ,key:city value:unknown cf: info ,key:ip value:192.168.126.1 cf: info ,key:b_rst value:1366*768 cf: info ,key:en value:e_pv cf: info ,key:c_time value:1458731943823 cf: info ,key:l value:zh-CN cf: info ,key:u_sd value:2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785 cf: info ,key:u_ud value:EAB36BC9-0347-4D33-8579-AA8C331D001A cf: info ,key:os_v value:Windows cf: info ,key:p_ref value:http://localhost:8080/BIG_DATA_LOG2/demo.jsp cf: info ,key:province value:unknown cf: info ,key:s_time value:1458731952690 cf: info ,key:p_url value:http://localhost:8080/BIG_DATA_LOG2/demo.jsp cf: info ,key:browser value:Firefox cf: info ,key:sdk value:js cf: info ,key:pl value:website cf: info ,key:browser_v value:45.0 3.关键指标分析 上面的ETL完成后我们的结果数据都放在hbase的event_logs表格的info列族中,现在我们需要运行代码分析这些数据,对我们的数据进行我们前面的设计文档中的关键指标分析。 (1).代码结构规范 我们的程序需要定期分析hbase的数据,我们分析的指标有很多,我们需要从hbase中提取的数据也有很多。最后分析完每个指标后我们放进mysql中,供echart做展示。 首先我们分析的指标需要即KPI需要专门的类定义好,放在com.hongya.common.KpiType下面。 我们需要自定义Key和Value的类型,这些类型包含了需要统计的关键维度信息,作为mapreduce任务的输入输出key,我们定义好了放在com.hongya.transformer.model.dim下面。 我们的hadoop任务写mysql需要有专门的OutputFormat,我们放在com.hongya.transformer.service下面,由于每个唯独统计任务写mysql都不一样,所以我们通过配置文件的方式传入,在output-collector.xml中有相关配置。 无论是读写mysql还是hbase都有配置,我们通过配置文件的方式传入,配置文件有query-mapping.xml,transfomer-env.xml。 (2).业务代码实现 上面分析了业务,我们开始写mapreduce程序统计分析指标。我们知道我们现在的mapreduce读取hbase的数据,然后写进mysql中,相关代码我们放在了com.hongya.transformer.mr包下面。由于时间关系,我们的业务只实现了new user指标的统计,大家可以查看com.hongya.transformer.mr.nu包下的内容。当我们的hbase中有数据时,运行com.hongya.transformer.mr.nu.NewInstallUserRunner,就能看到下面的结果。如果你map完成后reduce就失败 ,没关系,是因为你的mysql还没有配置好,我们在后面会介绍的。 四、数据分析系统架构 我们有了服务器后,接下来的任务就是对服务器的数据进行收集处理,处理后的数据进行展示。我们需要搭建一个完整的服务器,这时候首先需要一个集群,我们在云端直接使用一个节点的centos作为服务器。首先打开Xshell,连上centos节点,我们这里节点名为node1。 1.部署hadoop和Hbase (1).部署hadoop hadoop单节点安装很简单,以前讲过。直接解压后,配置hadoop-env.sh、core-site.xml、hdfs-site.xml hadoop-env.sh配置 JAVA_HOME core-site.xml配置 <property> <name>fs.defaultFS</name> <value>hdfs://localhost:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/data/hadoop</value> </property> 然后就能够格式化,启动: hdfs namenode -format start-dfs.sh (2).配置Hbase 首先安装单节点的zookeeper,安装好后启动,这个不细说: zkServer.sh start 然后解压Hbase安装包. 配置hbase-env.sh,配置JAVA_HOME,然后将 HBASE_MANAGES_ZK改为false 配置hbase-site.xm <property> <name>hbase.rootdir</name> <value>hdfs://localhost:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> </property> 复制hadoop配置复制hadoop的 core-site.xml和hdf-site.xml到hbase的conf目录下 然后就能启动Hbase了。启动hbase后使用hbase shell进入交互窗口,执行建表语句: create 'event_logs' ,'info' 如果执行成功了就可以开始下一步了。 2.部署nginx服务 前面我们将项目发布到tomcat上面了。正常情况下我们需要通过nginx进行负载均衡,同时收集url的请求日志。我们可以安装nginx,也可以安装淘宝开源的tengine,比一般nginx多一些功能,而且淘宝上有中文文档。 (1).nginx安装 步骤如下: 1.安装GCC编译器等工具: yum install -y gcc gcc-c++ autoconf automake libtool make openssl openssl-devel pcre pcre-devel 2.下载安装Nginx: wget http://nginx.org/download/nginx-1.6.3.tar.gz 注:这里也可以下载tengine压缩包,比一般nginx多一些功能 tar -zxvf nginx-1.6.3.tar.gz cd nginx-1.6.3/ ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/logs/nginx.pid \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ make && make install 如果正常的话,就安装好了,然后启动nginx服务即可。记住启动之前需要先关闭之前的tomcat,因为他们两个的端口冲突了。启动命令是就是nginx,启动以后,如果不修改配置,我们可以直接打开浏览器访问8080端口,出现这样就算是成功了。 (2).nginx配置 现在我们已经安装了nginx,我们要配置nginx的反向代理,让他替我们监听我们的需要监听的端口。上面我们安装的时候已经配置了配置文件的路径:/usr/local/nginx/conf/nginx.conf。现在我们修改他的内容。我们让它监听80端口,这样我们给80端口发送的数据就可以被nginx收集然后我们后期处理:我们只需要添加下面的内容: log_format my_format '$remote_addr^A$msec^A$http_host^A$request_uri'; location = /log.gif { root html; ## 配置日志文件保存位置 access_log /opt/data/access.log my_format; } 修改后的nginx.conf内容大概是这样的,其实就是添加了一行log_format,然后修改了端口信息:然后我们通过命令让配置文件生效: sudo nginx -s reload (3).测试nginx收集日志 这时候我们可以启动我们之前的web项目,启动之前记得修改代码的url为刚刚配置的地址格式:然后我们发布运行项目,或者打war包放在tomcat里面,然后启动tomcat。在浏览器输入:http://localhost:8080/taobaopayment/demo4.jsp 模拟用户点击。如果你发现浏览器一直处于刷新状态,可能你需要换一个浏览器: 你还可以运行我们的Test类,来模拟后台的数据,报错没关系,只需要手动点击停止程序:然后我们查看刚刚配置的文件,已经有了几条记录,是刚刚我们发送的,而且都是我们配置的格式:到这里就恭喜,我们的gninx基本完成。 3.日志收集系统 日志手机一般有两种方式,shell实现和flume实现。shell命令前面大家都熟悉过,flume使用在前面的SparkStreaming实验也使用过,我们不介绍过多,简单回顾一下即可。首先安装好flume,配置JAVA_HOME和HADOOP_HOME,然后新建或者复制一个配置文件,log.cfg ,添加下面的内容: # 配置三个组件的名字 agent.sources = r1 agent.channels = c1 agent.sinks = k1 # For each one of the sources, the type is defined agent.sources.r1.type = exec ## 这里配置你刚刚手机日志的文件 agent.sources.r1.command = tail -F /Users/dengziming/opt/data/hongya/taobaopayment/access.log agent.sources.r1.port = 44444 # The channel can be defined as follows. agent.channels.c1.type = memory agent.channels.c1.capacity = 1000 agent.channels.c1.transactionCapacity = 1000 # Each sink's type must be defined agent.sinks.k1.type = hdfs agent.sinks.k1.hdfs.path = hdfs://localhost:8020/flume/events/%Y-%m-%d/%H%M/ agent.sinks.k1.hdfs.filePrefix = events- agent.sinks.k1.hdfs.round = true agent.sinks.k1.hdfs.roundValue = 10 agent.sinks.k1.hdfs.roundUnit = minute agent.sinks.k1.hdfs.useLocalTimeStamp = true #Specify the channel the sink should use agent.sources.r1.channels = c1 agent.sinks.k1.channel = c1 agent.channels.memoryChannel.capacity = 100 配置好后适用命令启动: bin/flume-ng agent --conf conf --conf-file conf/log.cfg --name agent -D flume.root.logger=INFO,console 这样就会收集我们刚刚nginx的日志到hadoop的 /flume/events/%Y-%m-%d/%H%M/ 路径下恭喜你,马上就要进入数据分析部分 4.提交数据分析任务 现在我们要开始运行程序,分析数据了。 (1).启动zookeeper、hadoop、hbase 启动命令就不说了,然后记得之前我们已经在hbase中创建了表格: create 'event_logs' ,'info' (2).运行ETL任务 我们的etl的任务是 com.hongya.etl.mr.ald.AnalyserLogDataRunner,打开这段代码,我们修改几个路径和配置,因为是测试,我们把数据放在本地运行。修改的主要是zookeeper地址和我们刚刚的日志路径: 然后运行程序: 然后我们可以根据日志看到打印的rowKey,我们可以在hbase中查看这些rowKey (3).创建mysql表格 我们的etl完成后数据放在hbase中,然后我们需要进行统计分析,结果放在mysql,首先是建立mysql表格,我们的表格统一放在数据库report下面,首先建库,然后按照下面的语句依次建表: DROP TABLE IF EXISTS `stats_user`; CREATE TABLE `stats_user` ( `date_dimension_id` int(11) NOT NULL, `platform_dimension_id` int(11) NOT NULL, `active_users` int(11) DEFAULT '0' COMMENT '活跃用户数', `new_install_users` int(11) DEFAULT '0' COMMENT '新增用户数', `total_install_users` int(11) DEFAULT '0' COMMENT '总用户数', `sessions` int(11) DEFAULT '0' COMMENT '会话个数', `sessions_length` int(11) DEFAULT '0' COMMENT '会话长度', `total_members` int(11) unsigned DEFAULT '0' COMMENT '总会员数', `active_members` int(11) unsigned DEFAULT '0' COMMENT '活跃会员数', `new_members` int(11) unsigned DEFAULT '0' COMMENT '新增会员数', `created` date DEFAULT NULL, PRIMARY KEY (`platform_dimension_id`,`date_dimension_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='统计用户基本信息的统计表'; 这只是一个表格,由于我们的表格太多,这里不展示,我们会将所有数据库的建表语句放在文件中,大家可以参考,最终如图: (4).运行统计任务 新用户点击分析任务放在com.hongya.transformer.mr.nu.NewInstallUserRunner中,大家可以查看代码,然后我们修改一下配置,主要是mysql的用户名密码,在DimensionConverterImpl中,另外我们还有查看核对 src/transformer-env.xml 下的内容:如图,修改用户名密码为你的mysql设置:修改zookeeper地址和运行的起始日期,你可以设置的小一点:然后我们点击运行,我们就可以根据日志看到map和reduce执行的过程: 执行完成后,我们查看我们刚刚的mysql的report库的stats_device_browser和stats_user表格:当然我们还可以查看dimension_browser等其他表格。程序执行成功。 4.数据转移系统 数据转移系统我们使用sqoop,由于我们的部分mapreduce任务每次运行的结果都放在hadoop或者Hbase上面,我们可能需要手动将关键指标转移到关系型数据库,然后编写代码进行展示。但是在这里,我们都写进了mysql,就暂时不适用sqoop了,也是为了减轻大家的负担。 5.数据展示 数据展示我们使用 jquery + Echart吧。真正项目的echart展示部分一般不需要我们管,会有专门的前端高手负责,所以我们就简单的做一下吧。以浏览器维度为例,我们直接写sql语句select name,count(*) from dimension_browser group by browser_name,将结果文件写到echart的option属性中: 然后重新再浏览器段查看吧:当然我这是一种不可取的做法,因为这种方式显然是不符合企业生产环境的。真正的生产环境肯定是通过后台和数据库交互,通过ajax将数据传给前端展示,我们做的很敷衍,是因为这不是我们的重点。 6.项目发布 这上面的所有步骤都完成了,就可以发布项目了,我们需要一套任务调度系统。azkaban是目前来说用的比较多的任务调度系统,我们推荐大家课后了解一下azkaban的安装使用。这里我们没法演示了。 项目上线 1.基本步骤 将整个项目设计好以后,就可以上线了,这里我们总结一下真实项目上线的过程。 软件的安装本地安装开发环境需要的东西,以及相关的依赖。服务器需要安装tomcat、nginx、zookeeper、hadoop、Hbase 项目开发这里的项目开发有三部分,服务端程序,日志分析程序,前端展示程序,其中日志分析程序我们只完成了new user 开发,剩下的业务由大家自己开发。前端展示程序我们只是简单展示,没有开发,这不是重点。 搭建nginx服务器,监听80端口nginx的安装和部署需要注意很多,安装完成后修改配置文件。 启动flume,收集来自nginx的数据flume配置完成后会收集日志文件的日志,按照时间放到hadoop上面。 发布web项目将项目打成war包,放到tomcat上,然后浏览器就可以访问,有访问时会向80端口发送数据。 建表新建hbase的表格和mysql表格 定时启动hadoop任务我们通过以前说过的方法将程序打成jar包,上传到linux,在Linux上通过hadoop jar命令提交。 启动展示任务这里我们简单处理一下忽略掉。 将运行和展示任务添加到定时任务进行调度这部分比较复杂,需要专门的时间学习。 2.自己动手发布程序 安装相关软件,我这里已经安装完成,大家自己检查安装。 安装hadoop、zookeeper、hbase、flume并配置这部分不详细讲解,配置方法上面都有,配置好以后启动相应集群。启动命令分别为: start-dfs.sh start-yarn.sh start-hbase.sh bin/flume-ng agent -c ./conf -f ./conf/log.cfg -n agent 至少有这些java进程: 安装nginx,启动nginx服务,修改nginx的配置文件,监听80端口,并且收集格式为: /log.gif 的url。可以在浏览器访问linux的80端口: 项目打war包,放到tomcat中。打包之前,修改代码的url为你的linux节点加上log.gif 然后打成war包,名字为:taobaopayment.war,放在tomcat的webapps目录下,使员工startup.sh 启动tomcat,访问8080端口,然后访http://node1:8080/taobaopayment/demo4.jsp:如果这里一直在刷新,那么需要换一个浏览器:比如我用Safari浏览器,不断点击,产生数据: 创建hbase和mysql表格hbase创建event_logs表格,info列族, mysql建表语句文件里有。 执行mapreduce的ETL任务你可以选择打jar包,或者在本地执行,执行的主类是:com.hongya.etl.mr.ald.AnalyserLogDataRunner 需要修改zookeeper配置和输入路径,如果在集群上运行,这个输入路径是前面配置的flume手机日志的路径。执行完成后,可以去hbase查看数据。 运行分析程序分析程序基于我们刚刚的结果,主类为:com.hongya.transformer.mr.nu.NewInstallUserRunner,运行之前需要在DimensionConverterImpl类中设置mysql的连接信息。 查看mysql数据库的结果,并展示查看mysql的结果: 数据展示模块,需要使用Echart,脱离了我们的实验主题,我们简单模拟,访问浏览器的:http://node1:8080/taobaopayment/showUser.jsp和http://node1:8080/taobaopayment/showBrowser.jsp
文章
关系型数据库  ·  大数据  ·  应用服务中间件  ·  nginx  ·  Hbase
2017-11-03
Linux命令之curl和wget
   在Linux中crul是一个强大的http命令行工具,支持文档的上传和下载,是一个综合传输工具。 语法:curl [选项] URL 常见参数: -v/--verbose 小写的v参数,用于打印更多信息,包括发送的请求信息,这在调试脚本是特别有用。 -m/--max-time <seconds> 指定处理的最大时长 -H/--header <header> 指定请求头参数 -s/--slient 减少输出的信息,比如进度 --connect-timeout <seconds> 指定尝试连接的最大时长 -x/--proxy <proxyhost[:port]> 指定代理服务器地址和端口,端口默认为1080 -T/--upload-file <file> 指定上传文件路径 -o/--output <file> 指定输出文件名称 -d/--data/--data-ascii <data> 指定POST的内容 --retry <num> 指定重试次数 -e/--referer <URL> 指定引用地址 -I/--head 仅返回头部信息,使用HEAD请求 -I:显示文档信息 curl -I http://www.hexing516.com/ HTTP/1.1 200 OK Date: Mon, 20 Mar 2017 04:10:10 GMT Content-Type: text/html Connection: keep-alive Set-Cookie: __cfduid=da352f5ea34da80d4c960a34b4a36ace51489983010; expires=Tue, 20-Mar-18 04:10:10 GMT; path=/; domain=.hexing516.com; HttpOnly Last-Modified: Thu, 19 May 2016 02:51:13 GMT Vary: Accept-Encoding X-Powered-By: ASP.NET X-Safe-Firewall: zhuji.360.cn 1.0.9.47 F1W1 Server: yunjiasu-nginx CF-RAY: 3425d1f554df38f5-FUO -O:按URL中默认的文件名保存文件到本地(需要指明具体的页面) curl -O http://www.cnblogs.com/duhuo/p/5695256.html curl -O http://mirror.bit.edu.cn/apache/httpd/flood/flood-0.4.tar.gz -O http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.34.tar.bz2 -o:将文件保存为命令行中指定的文件名的文件中 curl -o b.txt http://www.baidu.com -i:输出时包括protocol头信息 curl -i www.baidu.com -C:大文件下载支持断点续传 curl -C - -O http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.34.tar.gz --limit-rate:限速下载 curl --limit-rate 10k -O http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.34.tar.gz 从FTP下载文件: curl -O -u et:11 ftp://18.62.25.1:907/FileTrans/uninc000.exe -T:把本地文件上传到FTP服务器 curl -u ftpuser:ftppass -T a.txt ftp://ftp.testserver.com 上传多个文件: curl -u ftpuser:ftppass -T "{a.txt,b.sh}" ftp://ftp.testserver.com -s:安静模式,没有任何输出 curl -s  -O http://www.baidu.com/index.html wget:从指定的URL下载文件,是最常用的下载命令 语法:wget [选项] 参数 选项: -T,  --timeout=SECONDS:设定响应的超时时间 -a 日志文件:在指定的日志文件中记录命令的执行过程 -b:后台执行 --spider:测试是否可以正常下载,并不真正下载 -o file:把下载记录写到file文件中 -a file:把记录追加到文件中 -q:安静模式,没有输出 -w:两次尝试之间,间隔多少秒 -r:递归下载,慎用 -A --accept=LIST:递归下载中的被接受的扩展名列表 -R:递归下载中的不被接受的扩展名列表 –limit-rate=100k:限定下载速率,如100k -O file:把下载的文档写到file文件中 -c:接着下载没有下载完的文件 --tries=number:如果失败的话,下载重试的次数 示例: 下载网页并保存到以zip结尾的文件中 [root@localhost ~]# wget -O a.zip  www.baidu.com 下载多个文件: wget http://mirror.bit.edu.cn/apache/httpd/README.html http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.34.tar.bz2 http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.27.tar.bz2 限速下载: wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip 断点续传: wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip 对于大文件,可以用-b进行后台下载 wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip 测试下载: [root@localhost ~]# wget --spider www.baidu.com 一旦失败,重新下载的次数 wget --tries=3 www.baidu.com 使用wget –mirror镜像网站 wget --mirror -p --convert-links -P ./LOCAL URL 下载整个网站到本地 –-miror:开户镜像下载 -p:下载所有为了html页面显示正常的文件 –convert-links:下载后,转换成本地的链接 -P ./LOCAL:保存所有文件和目录到本地指定目录 把下载信息保存到文件中 [root@localhost ~]# wget -o a.txt www.baidu.com 过滤文件格式下载:--reject= wget --reject=gif URL 下载网站所有的pdf文件 [root@localhost ~]# wget -r -A.pdf www.baidu.com wget -r --accept=pdf,jpg www.baidu.com 本文转自 zengwj1949 51CTO博客,原文链接:http://blog.51cto.com/zengwj1949/1908374
文章
Web App开发  ·  Linux  ·  Apache
2017-11-12
跳转至:
支付宝开发者社区
949 人关注 | 449 讨论 | 563 内容
+ 订阅
  • 云函数本地调试
  • 小程序云训练营二期免费抢报,限量500名先到先得
  • 支付宝能力实验室规则调整通知
查看更多 >
开发与运维
5304 人关注 | 127106 讨论 | 211260 内容
+ 订阅
  • Kubernetes的Sidecar模式
  • 大四学生的第一次服务器使用心得
  • Linux系统编程-进程间通信(消息队列)
查看更多 >
安全
1083 人关注 | 23368 讨论 | 59107 内容
+ 订阅
  • 大四学生的第一次服务器使用心得
  • 阿里云ACP认证难不难?怎么考呢?
  • 解码2022中国网安强星丨聚焦高效办公与应用安全,网宿安全引领新风向
查看更多 >
数据库
249860 人关注 | 45637 讨论 | 66860 内容
+ 订阅
  • 内核实战教程第1期|数据库系统概述,带你走近 OceanBase 研发环境
  • HStreamDB v0.9 发布:分区模型扩展,支持与外部系统集成
  • mybatis学习(4):工具类和实体类的创建
查看更多 >
云计算
21635 人关注 | 58079 讨论 | 41682 内容
+ 订阅
  • ECS使用体验心得
  • 解码2022中国网安强星丨聚焦高效办公与应用安全,网宿安全引领新风向
  • 阿里云ECS使用体验
查看更多 >