风起 发布的文章

PHP流程控制foreach小技巧

有这么一个数组:

$arr = array(1, 2, 3, 4);

如果需要遍历然后修改值, 常规写法为:

foreach ($arr AS $k => $v) {
    $v= $v* 2;
    $arr[$k] = $v;
}

一有时间就啃PHP手册, 刚发现一简单写法:

foreach ($arr AS &$v) {
    $v = $v * 2;
}

解释: 自PHP5起, 可以很容易地通过在$v之前加上 & 来修改数组的元素. 此方法将以引用赋值而不是拷贝一个值, 这样$arr[$k]就被直接修改了.

原谅的我无知, 知道的别笑话我.

2012了

2012了, 不知道写点什么好, 好歹留下点什么吧.
那: Happy New Year.

检测是否以管理员运行bat的两种方法

我用的是win7系统, 因为不喜欢一些集成包所以一直是手工配置开发环境, 然后写一个web.bat来管理tomcat mysql apache psql等服务.

但是碰到一个问题就是需要重启某个服务, 比如mysql, 这是很费劲的, 因为我是以普通用户跑win7的而不是administrator, 之前的折中方案是写一个su.bat,用处是以admin身份启动cmd然后运行web.bat,但是总感觉还是不够方便,就想着能不能检测到不是管理员身份就以管理员运行自己呢

好了,直接贴代码吧。

第一种方法是检测title里是否管理员关键字,看图。
is_admin.jpg

- 阅读剩余部分 -

高可用负载均衡集群方案之LVS+Keepalived

首先什么是lvs这里就不介绍了, baidu一下你就知道;
为什么需要集群, 为什么需要负载均衡这里也不啰嗦了, baidu一下你就知道;
与其他方案的区别, 优异也不介绍了, baidu一下你就知道.

lvs的几个重要角色是:
1> 主控服务器master
2> 主控备用服务器backup
3> 虚拟服务器virtual server
4> 实际服务器real server

每个角色对应一个ip, realserver则对应多个, 如果你简单的了解过lvs, 就应该知道lvs的3中调度方式和10种调度算法, 这里将使用效率比较高的dr(直接路由)方式, 算法用比较合理的wrr(加权轮询)算法, 其它的模式和算法可执行尝试.
好了下面就直接开始吧, 当然了在这之前你还需要配置好realserver, 保持80通畅.

- 阅读剩余部分 -

轻松搭建git服务器

最近svn频繁出怪问题, 也可能是我vps不行吧(512MB内存, 出问题时的负载不足1, 内存120空闲...), 实在忍不住, 干脆换git了, 下面把摸索出来的东西记录下, 只简单说下而已..

个人怎么使用我就不说了, 如果你刚接触git也可以参考文章末尾我提供的参考文档; 这里只说下git服务器的搭建, 下面的内容都建立在我认为你已经大致会使用git init, git add, git commit等简单命令的基础上.

另外关于认证方式, 我们选择单用户, 多证书的方式, github就是如此, 因为是ssh访问, 不可能每个人在服务器上有一个用户, 关于几种认证方式请参考文章末尾我提供的参考文档, 那下面我们开始吧.

- 阅读剩余部分 -

Nginx反向代理Apache的情况下让Apache获得真实IP

自从Nginx出现以后, 我们都喜欢让 Nginx 跑在前方处理静态文件, 然后通过 proxy 把动态请求过滤给 apache.

那么就会出现个问题, 跑在后方 apache 上的应用获取到的访客IP都是Nginx所在服务器的IP , 或者是本机 127.0.0.1 .

最明显就是查看 apache 的访问日志.就会见到来来去去都是内网的IP.
如果你的应用有诸如, "单个IP不能重复登陆”, "单个IP注册相隔n分钟”... 之类用于IP判别的安全规则.
这么就麻烦了....

但还好, 你可以通过修改 nginx proxy 的参数令后端应用获取到 Nginx 发来的请求报文获取到外网的IP.

proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

但这解决的问题单单只是应用上, apache 日志上所获取的ip依然还是本地.

这个时候就需要配合apache的一个第三方模块"mod_rpaf"了, 官方网站: http://stderr.net/apache/rpaf/

安装方法:

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar zxvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

安装完成后在httpd.conf添加如下:

LoadModule mod_rpaf-2.0.so_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.1.90    #Nginx所在服务器的IP.
RPAFheader X-Forwarded-For

重启apache, 再看apache的访客日志就是真实的用户ip了.
遗留问题为, SERVER_ADDR成127.0.0.1了, 求解???

关闭ipv6的方法, 的确能关掉

基于centos, 首先执行ifconfig, 如果没有ipv6就不用操作了, 如果有, 按以下步骤来:

vi /etc/modprobe.conf #如果没有这个文件, 创建它并添加如下内容

alias net-pf-10 off
alias ipv6 off
options ipv6 disable=1 #网上流传的没有这一项, 少了它, 是关不掉的

vi /etc/sysconfig/network-scripts/ifcfg-eth0 #添加如下内容, 如果你有多高网卡, 自己依次修改
IPV6INIT=no
IPV6_AUTUCONF=no

vi /etc/sysconfig/network #添加如下内容
NETWORKING_IPV6=no

保存退出, 重启, 就OK了.