推倒重做

这几个月一直在做一个基于FastDFS的分布式存储系统,从前期调研、测试到后面的设计、编码、测试等。其中设计部分,每个环节都和当时带我的一位哥们讨论过,时而愁眉不展,百思不得其解;时而一拍脑袋,找到一个很巧妙的设计方法。已经有两个月没有什么大的改动了,上周实在无聊,就把我当时赶工写的,现在看来不堪入目的代码进行了重构。

一切看起来很美好的样子,只是看起来。

部门的开发主要分为后台组和系统组,我属于系统组,主要职责是做底层linux c方面,譬如nginx模块开发,存储系统开发等;后台组的职责就是要能从web上和我们的系统对接,在更高层面上进行管理,一方面是为了便于公司内部系统的部署和监控,另一方面也是为了和客户对接。

关于proxy_pass的参数路径问题

由于工作需要,开始分析nginx的proxy模块,在分析之前,当然要先会用了。于是开始熟悉该模块的一些指令,其中最基本的指令要属proxy_pass了。nginx的英文文档总是看着感觉有些别扭,于是按惯例先google了一些文章。

这一搜,就掉进坑里了。

这些文章里都把proxy_pass的目标地址是形如“127.0.0.1:8090”和“127.0.0.1:8090/”分开讨论,认为后者“/“的作用是删除url中匹配的部分,然后再讨论目标地址中带了uri的情况。

其实根本没这么复杂,只有两种情况:

(1)目标地址中不带uri。即proxy_pass的参数形如”http://127.0.0.1:8090"。 此时新的目标url中,匹配的uri部分不做修改,原来是什么样就是什么样。

(2)目标地址中带uri。即proxy_pass的参数形如“http://127.0.0.1:8090/dir1/dir2"

利用here document携带c代码

假设你想通过一段脚本调用make来编译代码,并且在脚本中将一些编译需要的系统信息传递给makefile,可以通过bash的here document来实现。例如:

tmp_src_filename=fdfs_check_bits.c  
cat <<EOF > $tmp_src_filename  
#include <stdio.h>  
#include <unistd.h>  
#include <fcntl.h>  
int main()  
{  
        printf("%d\n", (int)sizeof(long));  
        printf("%d\n", (int)sizeof(off_t));  
        return 0;  
}  
EOF  
  
gcc -D_FILE_OFFSET_BITS=64 -o a.out $tmp_src_filename  
output=$(./a.out)  

emlog的一键备份

不知道大家平时备份是不是和我一样这么操作的:

  1. 登陆到后台,备份sql(当然,或者是用插件定期备份发送到邮箱)
  2. 用ftp备份content目录

如果你想简化操作,并且和我一样苦逼的用着虚拟主机,下面的脚本也许可以帮到你。脚本很丑陋,能完成功能即可。

漫谈logrotate与crond

什么是logrotate

logrotate是一款用来切割日志的工具,更确切的说,是切割文本的工具,但通常用在软件日志切割上。为什么要进行日志切割呢?原因可以有很多,最明显的一个就是防止日志文件变得太大。

lorotate的切割方式

以nginx为例,假设其错误日志放在/data/proclog/log/nginx/下,名为nginx_error.log,当logrotate运行时,如果满足切割要求了,则会将nginx_error.log改名为nginx_error.log.1,并重新创建一个新的空文件nginx_error.log作为新的错误日志。

当进行其二次切割时,nginx_error.log.1被改名为nginx_error.log.2,刚才创建的nginx_error.log被改名为新的nginx_error.log.1,然后再次重新创建一个新的空文件nginx_error.log作为新的错误日志投入使用。

当进行第三次切割时,nginx_error.log.2变为nginx_error.log.3,nginx_error.log.1变为nginx_error.log.2,nginx_error.log变为nginx_error.log.1,一个新的nginx_error.log被再次创建。