nginx配置文件通过使用add_header指令来设置response header,response header一般都是以key:value的形式,例如:“Content-Encoding:gzip、Cache-Control:no-store”,设置的命令为:
add_header Cache-Control no-store
add_header Content-Encoding gzip
但是有一个十分常用的response header比较特性,就是Content-Type,可以在它设置了类型的同时还会指定charset,例如:“text/html; charset=utf-8”,由于其存在分号,而分号在配置文件中作为结束符,所以在配置的时候需要用引号把其引起来,配置如下:
add_header Content-Type 'text/html; charset=utf-8';
另外由于没有单独设置charset的key,所以要设置响应的charset就需要使用Content-Type来指定charset。
php提供了mkdir来创建文件,但对应5.0一下的版本不支持递归创建多级目录,也就是说给定要创建的目录的上级目录不存在,那么就会创建失败。5.0及以上版本通过吧第三个参数设置为TRUE,就能递归创建指定的目录。不过自己实现一个递归创建多目录的函数也很简单,具体代码如下:
function mkdirs($dir){
if(!is_dir($dir)){
if(!mkdirs(dirname($dir))){
return FALSE;
}
if(!mkdir($dir, 0777)){
return FALSE;
}
}
return TRUE;
}
重命名了一个web项目,然后修改apache的配置到新目录后重启,出现如下错误提示:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
由于老的目录已经删除,开始怀疑是apache重启时候找不到老的目录报错,在网上查了一下,此错误是因为getcwd命令无法获取当前执行命令时的工作目录,可能是由于该目录已经被其他的程序删除。例如:你先用一个终端进入到目录 /home/yangyz/test,再开启另外一个终端删除目录 /home/yangyz/test,然后再第一个终端中执行某些命令或启动某些服务的时候就会看到上述的错误提示。
解决办法就是使用cd进入到任何一个实际存在的目录,然后再执行相应命令即可。
由于屏幕关闭加上长时间没有操作可能导致centos进行深度休眠,此时只能通过电源键来强制重启。可以通过修改X11的配置来禁止休眠,配置文件为/etc/X11/xorg.conf,注意修改此文件前记得备份,防止由于配置错误导致无法进行X11桌面。
修改涉及两个地方,第一个是 Section “Monitor”,查看其配置中是否有 DPMS,且其值为 false,保证配置信息如下:
Option "DPMS" "false"
第二个修改是增加一个 Section “ServerFlags”,包含的内容如下:
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
有两种方法可以在命令行下执行sql命令。第一种是使用“-e“参数来指定需要执行的sql语句;第二种是通过管道的方式。语法及例子如下:
1、
MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e"sql 语句"
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e"select host,user from user";
2、
echo "sql 语句" | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo "select host,user from user" | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql
上面命令执行的结果如下图。从图中可以看到二者的显示结果有些不一样。
使用场景多用在脚本中,例如定期执行存储过程、load data infile以及删除老数据等。
要禁止某个或一类资源,只需要增加一个location,然后在其中使用deny all即可。
禁止访问扩展名为bat的文件,配置如下:
location ~* /\.bat {
deny all;
}
禁止访问configs目录,以及其下所有子目录或文件,配置如下:
location ^~ /configs/ {
deny all;
}
注意上述configs后面的斜杠不能少,否则所有以configs开头的目录或文件都将禁止访问。
location指令是server段中的一个指令,可以对不同路径或不同文件类型进行特殊处理。例如用的比较多的就是针对网站的静态内容设置缓存。由于一个server段中可以有多个location,而http请求最终只能使用其中的一个,所以有必要弄清nginx是如何选择location的。
location 指令语法如下:
location [=|^~|~|!~|~*|!~*] uri {
}
上述配置中[]内为可选配置,但只能使用其中一个。关于具体含义,可以参考:nginx 匹配操作符。uri可以是普通字符串或正则表达式。
匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。
总结下来location指令的匹配顺序为:
1、“=”前缀指令匹配,如果匹配成功,停止其他匹配
2、普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用“^~”前缀,则停止其他匹配。
3、正则表达式指令匹配,按配置文件里的顺序,成功就停止其他匹配。
4、如果第3步中有匹配成功,则使用该结果,否则使用第二步中的匹配结果。
对于单个文件,使用sed命令很容易做到。如果需要替换某个指定文件夹下所有文件,借助grep和sed组合成一条命令也可以轻松搞定。grep命令可以查找单个文件或文件夹下文件中的内容,使用参数“r”或“-R”可以递归查找指定文件夹下的所有文件;参数“l”可以让grep输出包含指定字符串的文件名,首次匹配成功后立刻停止对同文件的查询。如果不使用“l“,grep查询单个文件时输出文件中所有包含指定字符串的行,对文件夹查询时则按照“文件名:包含字符串行”的方式输出。
有了上面提到的知识,执行批量替换的命令可以写为:
grep "netingcn" -rl /assign-path | xargs sed -i 's/netingcn/www\.netingcn/g'
或
sed -i 's/netingcn/www\.netingcn/g' `grep "netingcn" -rl /assign-path`
还有一种比较复杂的写法:
grep "netingcn" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/netingcn/www\.netingcn/g'
其中命令awk用于分割字符串、uniq对结果进行除重。
在mac osx lion中sed来进行文件内容的替换操作,使用命令为:
sed -i 's/oldstring/newstring/g' full-path-file
执行后提示出错,错误信息为:“sed: 1: command a expects \ followed by text”,但是相同的命令拿到centos下确能执行成功。 使用man查看命令的参数详细说明,两个系统下对参数“i”的要求不一样。
mac osx中为:
-i extension
Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved.
It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
centos中为:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
参数“i”的用途是直接在文件中进行替换。为防止误操作带来灾难性的后果,sed在替换前可以自动对文件进行备份,前提是需要提供一个后缀名。从上面对参数“i”的详细说明中可以看到,mac osx下是强制要求备份的(当然也可以使用空字符串来取消备份),但centos下是可选的。
如果不需要备份文件,mac osx下可以使用如下命令完成替换操作:
sed -i '' 's/oldstring/newstring/g' full-path-file
例子:
cd /tmp
echo "netingcn.com" > sed_test.txt
cat sed_test.txt
sed -i '' 's/netingcn/www\.netingcn/g' sed_test.txt
cat sed_test.txt
rm -rf sed_test.txt
cd -
以前写shell脚本或修改某些配置文件(如:nginx)时,由于没有块注释,只能一行一行的来加注释,甚是麻烦。今天无意中发现了vim中的快操作,使用此功能能很方便的实现块注释。
在非insert模式使用组合键 ctrl + v 来开启块模式,这时在窗口左下角显示“ — VISUAL BLOCK — ”,可以通过方向键或h、j、k、l来选择需要操作的块。可以对选择的块进行编辑、复制、粘贴、删除等操作。
例如注释nginx配置文件中的某一段,具体操作是:先把光标移动到需要注释的开始行的最前面,使用 ctrl + v 开启块模式,使用j向下移动光标,可以看到被选取的块,在使用 shift + i (即大写的I)进入插入模式(注意此时插入点会自动回到开启块模式的位置),输入注释符#,ESC 退出插入模式,稍等片刻,刚才选取的块自动被填充了#,就达到了快速注释一段配置的目的。操作示例如下: