hostname 命令如何实现的?uname命令如何实现的?都是通过uname系统调用来实现的
hostid是干啥的? man gethostid
DevOps
hostname 命令如何实现的?uname命令如何实现的?都是通过uname系统调用来实现的
hostid是干啥的? man gethostid
这样的话,就算进程意外退出,也不会残留临时文件,mail命令用到的临时文件就是这么处理的
自动代理可以通过dhcp、dns两种方式实现,参考资料: https://www.ibm.com/developerworks/cn/linux/1309_quwei_wpad/
基本原理:
更多参考: 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/
测试脚本test.php:
1 2 3 4 5 6 |
<?php while(1) { clearstatcache(); echo file_get_contents("link.txt"), "\n"; sleep(2); } |
1 2 3 |
echo a >a.txt echo b >b.txt ln -s link.txt a.txt |
1 |
$ php test.php |
在另外一个terminal中修改link.txt 链接到 b.txt
1 |
$ rm -fr link.txt ; ln -s link.txt b.txt |
发现输出的依然是a.txt 的内容(至少一段时间内是的)
strace 分析一下,发现在cache期间,根本不会去访问 link.txt 的
原因:
realpath_cache 缓存了软连接 默认时间 120s
解决办法:
修改php.ini 中 realpath_cache 的配置
我们知道,通过Memcache的add操作可以实现远程锁的功能,但是,如果Memcache意外down机怎么办?
一半来讲,多机部署是解决思路;那么,锁本来是要集中控制的,分布式如何实现呢?
这里只讨论两台机器部署的情况,不讨论N(N > 2) 的情况;我们认为两台机器同时故障的可能性很小,是可以接受的。
现在有m1和m2两台Memcache的机器,首先去m1申请锁,如果失败(可能是m1宕机了),则再去m2申请锁,似乎是可以的了。
思考:如果有人从m1抢到了锁,然后m1宕机了,后面的人zi自然会去m2抢锁,必然会有一个人能抢到,这时候,一个锁就会被两个人持有了;或许这比两台机器同时宕机的可能性都小,但是,这种情况是可以有解决办法的。
改进:
虽然逻辑复杂了一些,但是比使用zookeeper是要方便多了
缘起
当通过ssh远程执行一条命令时,如果命令脚本中使用了sudo,则有可能会提示:
1 |
sudo:抱歉,您必须拥有一个终端来执行 sudo |
解决办法:
方案1. ssh 添加 -t 选项
方案2. 执行sudo的机器上,编辑 /etc/sudoer ,注释掉:
1 |
Defaults requiretty |
参考资料:
虽然没写过java,但是log4j却如雷贯耳。
现在想学习一下log4j,但是没有太多时间去看文档,java的东西都是经过了非常精心的设计的,应该比较好用,先写个例子吧,一边google、百度,一边调试,于是辛酸就开始了,万万没想到会遇到这么多的问题。
既然有log4j2,我自然不会去选择使用log4j,当然,我入门时是不会太过于关于二者的差别的,但是,不管我是否关心,差别都那么明显地存在着呢。
有文章(http://blog.csdn.net/anlina_1984/article/details/5313023)说,log4j支持两种配置文件格式:
1 |
一种是 <span lang="EN-US">XML</span> 格式的文件,一种是 <span lang="EN-US">Java</span> 特性文件(键 <span lang="EN-US">=</span> 值 <span lang="EN-US">properties</span> 文件) |
其实,这log4j2已经不是这样了,有文章(http://www.csdn123.com/html/topnews201408/96/1896.htm)说:
1 |
log4j2配置文件可以使用XML或JSON,似乎 不再支持properties文件了。默认的文件名也有所不同,log4j2.xml,不再是log4j.xml。 |
加载配置文件的方式也不一样了,log4j:
1 |
PropertyConfigurator.configure("path/to/log4j.properties"); |
log4j2:
1 |
Configurator.initialize(Test.class.getName(), "path/to/log4j2.xml"); |
更加郁闷的是:
从http://logging.apache.org/log4j/2.x/download.html 下载下来的apache-log4j-2.3-bin.zip 里面包含了log2j-1.2 的相关jar包
log4j2 默认支持 yaml、xml、json格式的配置文件,添加插件可以支持更多
问题
https ===> nginx(443) ===> tomcat(8080)
默认tomcat是不知道用户是通过https的访问访问的443端口的,如何让tomcat知道呢?
1. nginx上添加http header
1 |
proxy_set_header X-Forwarded-Proto https; |
2. tomcat 上参考上述设置的http header
1 2 3 |
<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-proto" /> |
注意: protocolHeader默认是空的,必须指定哦,因为https默认端口为443,所以connector的proxyPort可以不设置
3. 如果nginx看到的domain和tomcat看到的domain不同,那么,tomcat 重定向时根据自己看到的domain来重定向就会不符合预期了,这时候,需要通过connector的proxyName来实现
参考资料:
1 |
common.loader="{catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar","${catalina.base}/common/lib/*.jar","${catalina.base}/common/classes" |
catalina.home catalina.base 区别
catalina.home(安装目录):指向公用信息的位置,就是bin和lib的父目录。
catalina.base(工作目录):指向每个Tomcat目录私有信息的位置,是conf、logs、temp、webapps和work的父目录。
深入Jetty源码之Servlet框架及实现(ServletRequest、ServletResponse)
Tomcat中添加IP限制
1 |
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="" allow="1.2.3.4"/> |
如此,则只允许1.2.3.4访问,其他不允许访问
如果要限制的IP其实是在x-forwarded-for 中,则需要在该Valve前面(后面还真不行)添加:
1 |
<Valve className="org.apache.catalina.valves.RemoteIpValve" /> |
但是,这样做会有一个副作用,就是
1 2 3 |
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".log" pattern="%h %{X-Forwarded-For}i %l %u %t &quot;%r&quot; %s %b" /> |
中的
1 |
%{X-Forwarded-For}i |
将不能再获取到了,而且%h 显示的也不是x-forwarded-for的IP;不过,access的valve中添加:
1 |
requestAttributesEnabled="true" |
如下:
1 2 3 4 5 |
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b" requestAttributesEnabled="true" /> |
则, %h 就是 x-forwarded-for的IP了
分析:
1 |
org.apache.catalina.valves.RemoteAddrValve |
中限制的是remoteAddr,乍一看,对x-forwarded-for 是不生效的,但是:
1 |
org.apache.catalina.valves.RemoteIpValve |
可以根据 x-forwarded-for 修改request中的remoteAddr的值。
如何将remoteIpValve.java 中的如下的log信息显示出来?
办法:
在 conf/logging.properties 中添加:
1 |
org.apache.catalina.level = FINE |
然后,在 catalina.out 中就可以看到了
配置文件
1. 如果配置文件中配置的docBase不存在,则tomcat无法启动,但是对于这种情况,configtest是检查不出来的