一、php文件如果有加密代码,在FTP传输时需要用binary模式上传,否则会运行出错,ascii模式上传时会替换其中的部分字符为linux对应的字符,例如回车+换行替换成换行。
二、mysql数据库服务器如果不能访问dns服务器的情况下,my.cnf配置文件中要加上skip-name-resolve选项,跳过主机名解析。否则会出现php连接mysql超时和报错,我遇到的情况是连接超时,导致web server和mysql server的网络连接出现N多tcp半连接,最开始是报mysql连接过多的错,加大mysql的最大连接限制数量后,还是报错,后来搜索到别人说的设置跳过名称解析选项后,报着试试的想法,增加后果然有效。折腾了几天,原来是域名解析的问题,因为我们的环境是托管在电信机房,但mysql server和web server之间却是单独一个局域网交换机,出于安全考虑没有把mysql server放在公网上,导致它不能访问dns服务器,而mysql默认配置是要缓存client机器的主机名的,结果导致它一直在连接dns服务器,最后因超时造成tcp半连接。
三、文件名大小写带来的问题:原来在windows下运行,不区分大小写,美工上传图片时,文件名大小写混用,也能正确访问。但在linux下,文件名是区分大小写的,导致一些图片不能正确显示。解决办法是写段shell脚本cdir.sh,自动修改所有图片文件名为小写,然后在nginx配置增加url重写,当要访问的文件不存在时重定向至image.php,由php去重定向至小写文件名的url,再失败才返回http 404错误。
nginx.conf
location / {
root /var/www/img;
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)/(.+\.(?:jpg|jpeg|png|gif|bmp|JPG|JPEG|PNG|GIF|BMP))$ /image.php?path=$1&file=$2 last;
}
}
image.php
<?
header('Pragma: no-cache');
$url = "";
if (!empty($_GET["path"])) {
$url = $url . strtolower($_GET["path"]);
}
if (!empty($_GET["file"])) {
$url = $url . "/" . strtolower($_GET["file"]);
}
if (strlen($url) > 0) {
if (file_exists($_SERVER{'DOCUMENT_ROOT'} . $url)){
header('Location: ' . $url);
#echo $url;
}
else {
header("HTTP/1.1 404 Not Found");
}
}
?>
cdir.sh
#!/bin/sh
############################################################
# this script will change file name recursively with option
# -u: locase to upcase
# -l: upcase to locase
############################################################
hint () {
echo " Usage: $0 [-l|-u] DIR1 [DIR2 DIR3...]
-l to lowcase
-u to upcase"
exit 1
}
if test $# -lt 2; then
echo "Too few arguments."
hint
fi
while [ "$1" ]; do
case $1 in
-l) ACTION="lo"
shift 1
;;
-u) ACTION="up"
shift 1
;;
*) if test -d $1; then
DIR="$DIR $1"
else
echo "no such directory --- $1"
hint
fi
shift
;;
esac
done
# echo $ACTION
# echo $DIR
FOUND=`find $DIR | sort -r`
for i in $FOUND; do
DN=`dirname $i`
BS=`basename $i`
loBS=`echo $BS | tr '[A-Z]' '[a-z]'`
upBS=`echo $BS | tr '[a-z]' '[A-Z]'`
NAME1=$DN/$BS
if [ "$ACTION" = "lo" ]; then
NAME2=$DN/$loBS
elif [ "$ACTION" = "up" ]; then
NAME2=$DN/$upBS
fi
if [ "$NAME1" = "$NAME2" ]; then
echo "****: $NAME1 ---x--- $NAME2 identical!"
else
echo "- renaming $NAME1 --> $NAME2"
mv $NAME1 $NAME2
fi
done