自动代理设置

自动代理可以通过dhcp、dns两种方式实现,参考资料: https://www.ibm.com/developerworks/cn/linux/1309_quwei_wpad/

 

基本原理:

  1. 通过DHCP的实现方式:
    1. DHCP时,可以下发自动代理配置的url,如: http://172.16.1.1/wpad.dat
  2. 通过DNS的实现方式:
    1. 浏览器会自动查找 wpad的A记录,如果能查到,则通过 http://wpad/wpad.dat 来下载自动代理脚本 (当然,你也可以设置 wpad的hosts)

更多参考: http://findproxyforurl.com/deploying-wpad/

关于设置代理、设置pac文件、设置wpad的一些比较: http://findproxyforurl.com/why-pacwpad/

pac脚本(或wpad)文件可以对相同的资源设置多个代理,方便failover

pac脚本支持的函数: http://findproxyforurl.com/pac-functions/

关于dhcp方式、dns方式的比较: 浏览器普遍支持dns实现方式,部分浏览器(Firefox)不支持dhcp实现方式: http://findproxyforurl.com/browser-support/

PHP 软连接的缓存问题

测试脚本test.php:

在另外一个terminal中修改link.txt 链接到 b.txt

发现输出的依然是a.txt 的内容(至少一段时间内是的)

strace 分析一下,发现在cache期间,根本不会去访问 link.txt 的

原因:

realpath_cache 缓存了软连接 默认时间 120s

解决办法:

修改php.ini 中 realpath_cache 的配置

参考资料:http://zhengdl126.iteye.com/blog/1575233

memcache 实现高可用锁

我们知道,通过Memcache的add操作可以实现远程锁的功能,但是,如果Memcache意外down机怎么办?

一半来讲,多机部署是解决思路;那么,锁本来是要集中控制的,分布式如何实现呢?

这里只讨论两台机器部署的情况,不讨论N(N > 2) 的情况;我们认为两台机器同时故障的可能性很小,是可以接受的。

现在有m1和m2两台Memcache的机器,首先去m1申请锁,如果失败(可能是m1宕机了),则再去m2申请锁,似乎是可以的了。

思考:如果有人从m1抢到了锁,然后m1宕机了,后面的人zi自然会去m2抢锁,必然会有一个人能抢到,这时候,一个锁就会被两个人持有了;或许这比两台机器同时宕机的可能性都小,但是,这种情况是可以有解决办法的。

改进:

  1. 首先去m1申请锁
    1. 如果申请到了,则马上去m2上也申请一把锁(如果m2宕机了,就无所谓了)
    2. 如果被别人抢走了,则,啥也不做
    3. 如果m1宕机了,则,可能是在有人抢走锁之后宕机的,也可能是早就宕机了,那么,过20s再去m2上申请锁;
      1. 过 20s的原因:避免A在m1上抢到锁之后m1立即宕机,而B发现m1宕机,却抢在A之前在m2上抢到了锁

虽然逻辑复杂了一些,但是比使用zookeeper是要方便多了

sudo without a tty

缘起

当通过ssh远程执行一条命令时,如果命令脚本中使用了sudo,则有可能会提示:

解决办法:

方案1. ssh 添加 -t 选项

方案2. 执行sudo的机器上,编辑 /etc/sudoer ,注释掉:

 

参考资料:

http://www.tuicool.com/articles/2iUVry

关于log4j的一些辛酸

虽然没写过java,但是log4j却如雷贯耳。

现在想学习一下log4j,但是没有太多时间去看文档,java的东西都是经过了非常精心的设计的,应该比较好用,先写个例子吧,一边google、百度,一边调试,于是辛酸就开始了,万万没想到会遇到这么多的问题。

既然有log4j2,我自然不会去选择使用log4j,当然,我入门时是不会太过于关于二者的差别的,但是,不管我是否关心,差别都那么明显地存在着呢。

有文章(http://blog.csdn.net/anlina_1984/article/details/5313023)说,log4j支持两种配置文件格式:

其实,这log4j2已经不是这样了,有文章(http://www.csdn123.com/html/topnews201408/96/1896.htm)说:

加载配置文件的方式也不一样了,log4j:

log4j2:

 

更加郁闷的是:

从http://logging.apache.org/log4j/2.x/download.html 下载下来的apache-log4j-2.3-bin.zip 里面包含了log2j-1.2 的相关jar包

 

log4j2 默认支持 yaml、xml、json格式的配置文件,添加插件可以支持更多

https + nignx + tomcat

问题

https  ===>  nginx(443) ===> tomcat(8080)

默认tomcat是不知道用户是通过https的访问访问的443端口的,如何让tomcat知道呢?

1.  nginx上添加http header

2. tomcat 上参考上述设置的http header

注意: protocolHeader默认是空的,必须指定哦,因为https默认端口为443,所以connector的proxyPort可以不设置

3. 如果nginx看到的domain和tomcat看到的domain不同,那么,tomcat 重定向时根据自己看到的domain来重定向就会不符合预期了,这时候,需要通过connector的proxyName来实现

 

参考资料:

https://www.91ri.org/11896.html

tomcat 学习

  •  war包总是很大,但是往往都是大在lib目录,lib目录中的程序基本都是第三方的,每个应用都重复加载(或者说发布)这些第三方lib是一件不愉快的事
    • 解决办法:把war包中的lib放到项目外面,在环境中配置。
    • 我们知道,tomcat会自动加载$tomcat_base/lib 中的jar文件的,但是我确实不想把应用引入的这些jar和tomcat软件自带的那些jar放在一起。怎么办?
    • 网上搜了一些,说是tomcat还会加载$tomcat_base/common/lib/*.jar  ,尝试了一下,没能成功,其实,从tomcat6开始,tomcat就只加载$tomcat_base/lib ,而不参考$tomcat_base/common了,参看: https://tomcat.apache.org/migration-6.html
    • 我用的是tomcat8,这可咋办?
    • 其实,  是否加载$tomcat_base/lib/*.jar 是在 $tomcat_base/conf/catalina.properties中定义的,那么完全可以修改该文件,让他自动加载任意目录的jar文件和class文件,如:
  • catalina.home catalina.base 区别

    • catalina.home(安装目录):指向公用信息的位置,就是binlib的父目录。

    • catalina.base(工作目录):指向每个Tomcat目录私有信息的位置,是conflogstempwebappswork的父目录。

 

深入Jetty源码之Servlet框架及实现(ServletRequest、ServletResponse)

 

Tomcat中添加IP限制

如此,则只允许1.2.3.4访问,其他不允许访问

如果要限制的IP其实是在x-forwarded-for 中,则需要在该Valve前面(后面还真不行)添加:

但是,这样做会有一个副作用,就是

中的

将不能再获取到了,而且%h 显示的也不是x-forwarded-for的IP;不过,access的valve中添加:

如下:

则, %h 就是 x-forwarded-for的IP了

 

分析:

中限制的是remoteAddr,乍一看,对x-forwarded-for 是不生效的,但是:

可以根据 x-forwarded-for 修改request中的remoteAddr的值。

 

如何将remoteIpValve.java 中的如下的log信息显示出来?

办法:

在 conf/logging.properties 中添加:

然后,在 catalina.out 中就可以看到了

 

配置文件

1. 如果配置文件中配置的docBase不存在,则tomcat无法启动,但是对于这种情况,configtest是检查不出来的