分享一个最近刚刚完成的网站架构方案

应用环境:
论坛(PHPWind,php+mysql)+CMS(ASP+MSSQL)+自己开发的小程序(php+mysql)
由于服务器更换机房,所以趁此机会对整个网站架构进行了调整
硬件:
1.Dell R710 CPU*2,16G,450G(SAS)*4,RAID10
2.Dell R710 CPU*2,32G,1T(SATA)*6,RAID6
3.Dell 1950 CPU*2 4G,500G*2,RAID 0
4.Dell 1950 CPU*2 4G,500G*2,RAID 0
4.Dell 2950 CPU*2 8G,500G*6,RAID 10
2台1950和1台2950为以前的旧机器(过保),所以在整个系统结构中用于备机,边缘服务器,和非可靠应用(可以损坏)

P1.拓扑图


服务器的2块网卡分别接外网交换机和内网交换机

P2.架构示意图

简单说明一下:
新购置的2台dellr710分别用于主数据库服务(Centos6,mysql)和web应用(esxi5,web1-web4)
dell2950 用于从数据库,一台1950用于前端缓存,一台用于图片附件
同时利用dnspod的智能dns功能,将部份移动和联通用户解析到一个多线机房的vps上面,解决一部分的互联互通问题

关于phpwind的负载均衡
web1上面放了一份phpwind的程序,且开放了ftp服务,供维护人员做后期维护。最初的方案是在web1上开启nfs,在web2上将web1的www目录mount过来,结果在实际运行环境中发现web2的负载非常高,特别是高并发的时候,看来使用nfs并不是很好。后来使用了sersync将web1的www实时同步到web2上面,并排除phpwind目录下面的data目录(该目录为phpwind的缓存),实际使用下来效果还是不错的.

CentOS 多线程下载工具 lftp

lftp 使用方法:

lftp -c “pget -n 10 http://www.test.com/test.tar.gz”

-c 表示断点续传
-n 10 表示10线程

yum -y install lftp

Android如何下抓取系统网络通信包 转载

Android如何下抓取系统网络通信包 (2010-08-17 13:21:40)转载

网上找到一个能在android模拟器上抓包的工具tcpdump(linux)
下载tcpdump,  还有个地址是http://www.strazzere.com/android/tcpdump,不知道具体版本。  
详细使用请参考http://www.tcpdump.org/里面的文档  
你需要root权限,  
adb push c:\wherever_you_put\tcpdump /data/local/tcpdumpadb 
adb shell chmod 6755 /data/local/tcpdump
抓包很简单adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap
# ”-p”: disable promiscuous mode (doesn’t work anyway)
# ”-s 0″: capture the entire packet
# ”-w”: write packets to a file (rather than printing to stdout)   … do whatever you want to capture, then ^C to stop it …
导出adb pull /sdcard/capture.pcap .
下载wireshark查看数据包,地址是http://www.wireshark.org/download.html,打开这个数据包,就可以查看数据包内容了。
注:模拟器,虚拟机或者破解版手机不需要权限
命令主要是tcpdump -p -vv -s 0 -w /sdcard/capture.pcap

关于phpwind官方手机客户端接口的调用方法

之前自己一直在做pw论坛的手机客户端,最近看到phpwind发布官方手机客户端的接口了,肯定是要去学习一下的,嘿嘿

下载 http://www.phpwind.net/job.php?action=download&aid=376933 pwmobAPI_1.0.3_gbk.zip
解开以后目录结构如下: 继续阅读 »

完美解决nginx环境下服务器上多站点WebShell访问限制问题

本办法是修改php来实现的
本人测试环境:PHP 5.2.14
vi main/fopen_wrappers.c
/* {{{ php_check_open_basedir
*/
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
char *pathbuf;
char *ptr;
char *end;

下面加上:
char *env_document_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
efree(env_document_root);
return 0;
}

然后保存,退出。

重新编译php

php.ini的open_basedir配置:
修改:
;open_basedir =

open_basedir = “/tmp/:/var/tmp/”

推荐一个非常不错的php解析器

今天在用php做一个html分析器的时候发现了一个非常好的东西,虽然没测试过效率如何,不过用起的是非常的舒服啊,嘿嘿

http://phpdom.comsing.com/

发现listview的notifyDataSetChanged事件一个很奇怪的问题

今天在用listview做数据绑定的时候发现一个很诡异的事情,用来做数据源的 List> list 内容明明已经发现了改变但是用了notifyDataSetChanged以后listview内的数据并没有发生变化。。。。。。。
经过反复跟踪调试,发现问题出在这个地方,list=db.Userlist() 数据源是直接用一个反回值进行赋值,list并没有进行add,remove,clear之类的操作,难道notifyDataSetChanged是对数据源的更改才会有响应,而直接赋值操作并不会触发notifyDataSetChanged的动作????(完全是猜测,也曾猜想过是数据指针的问题),后来把程序修改了一下就ok了:
DbHelper db=new DbHelper(getApplicationContext());
List> ul=db.Userlist();

for (int i=0;i<=ul.size()-1;i++)
{
HashMap map = new HashMap();
map=(HashMap) ul.get(i);
list.add(map);
}
adapter.notifyDataSetChanged();

至于为啥为这样,偶也搞不清楚。。。。。。嘿嘿

SD卡路径问题以及如何获取SDCard 内存

0、获取sd卡路径。
1、讲述 Environment 类。
2、讲述 StatFs 类。
3、完整例子读取 SDCard 内存 继续阅读 »

有关Android线程的学习

1. Android进程

在了解Android线程之前得先了解一下Android的进程。当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android 会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别: 继续阅读 »

Merry Christmas 圣诞的味道!