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是检查不出来的

数字签名

1. 不是所有的数字证书都是用于数字签名的(虽然都可以签名),似乎用户数字签名的证书比用于https的证书要便宜不少: https://www.globalsign.com/en/digital-signatures/pricing/

2. pdf 格式的签名文档直观上比较好看,而且内置数字签名功能,还是不错的,制作工具: http://cn.globalsign.com/ssl/ssl_adobe_pdf_sign_outline.html

3. 数字签名工具: http://www.globalsign.com/pdf-signing-tool/

4. pdf数字签名说明: https://www.globalsign.com/en/resources/pdf-signer-tool-guide.pdf

Linux mail and sendmail

1. mail 和sendmail不是一个软件包中的东西

 

2. smtp是一个协议,可以直接发送到用户的邮箱中的,mail命令就可以搞定,不需要启动sendmail服务;sendmail看起来是发邮件,其实是一个邮件代理(呃,还是发邮件),sendmail的作用就是别人可以利用sendmail的25端口来发送邮件

3. mail命令默认发出去的邮件的发件人是linux账户,最重要的是,主流的邮箱服务是不让你随意这么发邮件的,而且,收件人无法给你正确地回复邮件

4. 如何使用自己的邮件账号用mail命令发送邮件呢?

在/etc/mail.rc (或 ~/.mailrc )中添加如下内容 (当然,value看着修改吧)

 

 

参考资料: http://my.oschina.net/duangr/blog/183162