Tag: apache

nginx+apache+dav_svn 的怪异问题

最近帮朋友的网站做个小优化,由apache 迁移到nginx ,结果问题多多,svn 在提交的时候竟然有这个错误:

$ svn ci -m”fix the mail problem “
Sending        util.php
svn: Commit failed (details follow):
svn: File ‘util.php’ is out of date
svn: ‘/svn/!svn/bc/496/trunk/util.php’ path not found
但是提交其它文件貌似没有问题。怪异到爆!!!

首先说说nginx 的配置。

svn 仍然使用 apache 的dav_svn ,只是端口由80 改为 1234,其它配置不改。

location  /svn {

proxy_pass http://127.0.0.1:1234 ;

proxy_set_header Host “svn.mysite.net” ;

}

终于在google 大神找到一篇俄文的mailing-list(http://www.lexa.ru/nginx-ru/msg39625.html),竟然有人和我同样的错误,也终于弄清楚什么事了。。。简直是自己白痴!!
我的php 的配置:
location ~ \.php$ {
root           /var/www/backend/  ;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
include        fastcgi.conf;
}
这个location 用了正则匹配,比svn 的普通location 优先级高,结果svn 提交util.php 的时候(会发送一堆svn 的指令如propfind , option 等),优先到php 的location 里,结果就出错了。。。
那svn 也用高优先级的location 匹配吧,修改一下,用前缀匹配:
location ^~ /svn
ok , 成功了。。。
事后我才看到,nginx 本身就有一个404 的log :
211.102.143.12 – hello [03/Jul/2011:15:34:53 +0800] “PROPFIND /svn/!svn/bc/496/trunk/util.php HTTP/1.1″ 404 31 “-” “SVN/1.6.15 (r1038135) neon/0.28.6″ “-“
唉。。。怪自己~~

cnnic 证书更新问题

最近为部门内部系统的https 快要过期的证书更新,出现了一系列的问题,很是郁闷!!一个字:恨!!

原来从2010 年 3 月后,由cnnic 签发的证书,有所改变了。2010 年 3 月前,root CA 是 entrust ,中级CA 是cnnic 。3 月后,root 和中级CA ,都是cnnic 了。。。

cnnic 证书本身就没有多少诚信可言了,还做了root CA 。。。

举例说明:

$curl -I https://blog.helosa.org/ 的时候,会有这类报错

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a “bundle”
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn’t adequate, you can specify an alternate file
using the –cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you’d like to turn off curl’s verification of the certificate, use
the -k (or –insecure) option.

提示是说,加一个-k 的参数,就不会去验证证书了,但我想了解一下原因。它也给了提示,让我们去这个网页http://curl.haxx.se/docs/sslcerts.html 里了解详情。

通读了一次,大概了解了,因为root 和中级CA 都是cnnic ,并且根CA 的证书并不在curl 的信任列表里,curl 认为它是self-signed 证书,不安全,于是就报错了。

解决方案嘛,把cnnic 的root 证书wget 回来,在这里:http://www.cnnic.cn/uploadfiles/cer/2010/3/2/113823.cer

然后curl 时加上这个证书,curl –cacert 113823.cer https://blog.helosa.org/

=====================================================

在这个问题上,我有两个不明白的地方:

1,其实,可以将cnnic 的root 证书加入到信任列表的,信任列表在/etc/ssl/certs/ 里,通过 curl -vv 可以看到

CAfile: none

CApath: /etc/ssl/certs

/etc/ssl/certs/ 里的文件,其实都是软链,软链到firefox 的证书目录吧,这个 /usr/share/ca-certificates/mozilla/ 。

既然如此,那我把cnnic root 的证书扔进去,总可以了吧?结果发现,还是不行的,难道是名字也有要求?格式不对?

2,朋友用mba 的curl 帮我测试,是正常的,是因为cnnic 的root 证书在信任列表吗?日后入手了mbp 再测试!

apache rewrite 与linux软链的一个小问题

一个项目是apache+resin的架构,有一条 rewrite 规则是这样的:

RewriteRule ^/flashinfo/vinfo/([a-z0-9A-Z_]+).xml$ /video/videolist.htm?sid=$1 [PT,L]

其中,\.htm 交给resin处理

<LocationMatch (.*)\.htm>
SetHandler caucho-request
</LocationMatch>

理论上,访问 /flashinfo/vinfo/V5OJEFN7C.xml 文件,是会代理访问到 /video/videolist.htm?sid=V5OJEFN7C 的。

但事实上,却403了,如下:

$curl -I -H host:so.v.test.com http://127.0.0.1/flashinfo/vinfo/V5OJEFN7C.xml
HTTP/1.1 403 Forbidden
Date: Tue, 09 Feb 2010 07:29:30 GMT
Server: Apache/2.2.11 (Unix) Resin/3.0.26
Content-Type: text/html; charset=iso-8859-1

让我看看rewrite后的访问是否正常:

$curl -I -H host:so.v.test.com http://127.0.0.1/video/videolist.htm?sid=V5OJEFN7C
HTTP/1.1 200 OK
Date: Tue, 09 Feb 2010 07:33:23 GMT
Server: Apache/2.2.11 (Unix) Resin/3.0.26
Cache-Control: max-age=600
Expires: Tue, 09 Feb 2010 07:43:23 GMT
Content-Type: text/html

究竟什么原因呢??我看了一下,应该是这样的:

原因在于,在DocumentRoot下,有一个错误的软链video.

$ls -alh| grep video
lrwxrwxrwx  1 root root   29 02-09 15:29 video -&gt; /data/videopage

而/data/videopage这个目录是不存在的,所以video是一个错误的软链,rewrite 后的地址是 /video/videolist.htm?sid=$1 ,这样就爆403了。

真奇怪,其实apache 根本不用管我有没有video 这个目录的,因为都是转发到resin 去处理的了。既然想不通,就先记下。。。

我还做了两个测试:

1,让 video 成为一个正确的软链,curl 测试结果,200 。

2,把 video 删去,不存在这个软链,curl 测试结果,200。

————————————

结论:apache rewrite 后的地址,如 /data/dopost.jsp?sid=$1 这种,如果data 是一个错误的软链,尽管动态程序/data/dopost.jsp?sid=$1是正确的,apache 的 rewrite 都会不成功,返回 403 。如果 data 是一个正确的软链或者压根不存在,apache 正确地rewrite 。

新搭建的nagios+pnp爆的一个错误

部门明天要上一个大项目啊,我今天赶紧搭监控。

原谅我这个古董,21 世纪了,还在搭nagios。。。web 环境,我也还是很古董地选用apache + php_module 的方式。。。其实监控系统来说,没什么性能要求,apache和nagios 也符合我的需求了,好,开始!!

首先爆了一堆这样的错:

Deprecated: Assigning the return value of new by reference is deprecated in /data/nagios/share/pnp/include/function.inc.php on line 1029

Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Asia/Chongqing’ for ‘CST/8.0/no DST’ instead in /data/nagios/share/pnp/include/function.inc.php on line 560

貌似 5.3.0 才报这样的错,5.2.9 也没有爆啊。。。没错,我是很懒,但一般我都会追求真相的。但是,项目明天就要上线了啊,时间不允许我这样玩了,我还是懒一点吧。。。以解决问题为最终目标!!

让我设timezone。。。不太会php啊。。。也没研究过nagios的架构。。。直接一点吧,见到什么改什么!!

function.inc.php 貌似是一个基础函数,每个函数都会include它的,我在里面显式地指定timezone总可以吧,于是在function.inc.php 里加一句

date_default_timezone_set(‘Asia/Chongqing’);

哈哈,timezone 的 warning 解决了!但问题随之又来了。。。又报错。。。

Deprecated: Function eregi() is deprecated in /data/nagios/share/pnp/include/function.inc.php on line 1505

函数 deprecated 了。。。算了,我决定改php.ini,屏蔽错误和warning!

打开 phpinfo() 看一下php.ini 在哪里,找不到。。。

在 httpd.conf 里加一句:

PHPIniDir “/data/apache/conf”

随便copy一个php.ini过来,刚才google了一下,好像是 error_reporting 的问题,但不管我怎么改error_reporting的组合,都无法成功。。。突然被我看到这样的字眼:

display_errors = On

哈哈,还不是你!!把你关了总可以了吧!!

display_errors = Off

apachectl graceful 一下,哈哈,问题解决了!!!可以用了!!继续配置监控。。。

唉,LAMP 如此经典的组合,我了解得还是不够啊!!