07/29/14

【shell】按照月份将apache日志文件压缩

描述:nagios监控磁盘空间warning,检查发现apache日志占用空间比较大

#!/bin/sh
#将当前目录下常规apache日志文件,按照月份归集
#link: blog.phpdba.com
#date:2014-07-29
#author: chen-123

export LANG="en_US.UTF-8"
project_list=`ls -l|grep 'access\.'|awk '{print $NF}'|awk -F'-access.' '{print $1}'|uniq`
month_list=`ls -l|grep 'access\.'|awk '{print $NF}'|awk -F'-access.' '{print $2}'|sort -n|uniq|cut -c 1-2|uniq`
cur_month=`date +%m`
for project in $project_list
do
for month in $month_list
do
echo $project
log_num=`ls |grep $project'-access.'$month|wc -l`
echo $log_num
if [ $log_num -gt 0 ];then
        if [ "$month" != "$cur_month" ];then
                echo $project" "$month" "$log_num
                tar_file=${project}"_access_"${month}".tar.gz"
                files=${project}"-access."${month}"[0-9][0-9]"
                files_total_size=`ls $files|xargs du -cb|grep total|awk '{print $1}'`
                files_avg_size=`echo "$files_total_size/$log_num"|bc`
                echo $files_avg_size
                if [ $files_avg_size -gt 1073741824 ];then
                        for file in $files
                        do
                                day=`echo $file|awk -F'-access.' '{print $2}'`
                                tar_filenew=${project}"_access_"${day}".tar.gz"
                                echo $tar_filenew
                                [ -f $tar_filenew ] || /bin/tar zcf $tar_filenew $file
                                [ -f $tar_filenew ] && rm -f $file
                        done
                else
                        echo $tar_file
                        [ -f $tar_file ] || /bin/tar zcf $tar_file $files
                        [ -f $tar_file ] && rm -f $files
                fi
                #echo $files_total_size
                #/bin/tar zcf $tar_file $files
        fi
fi
done
done

脚本下载链接:https://github.com/chen-123/phper/blob/master/log_archive.sh

07/27/14

apache动态编译cgi模块

描述:

1、搭建qmailadmin过程中,要求服务支持cgi请求。

2、之前编译apache时,cgi模块没有编译进来。

3、要么重新编译apache,要么利用apxs工具编译cgi模块。两者比较,当然是选择编译模块。

操作步骤如下:

查了下网络资料,发现Apache自带的apxs工具,可以在不重新编译Apache的前提下,给Apache添加模块。

Apache运行cgi程序需要用到2个模块:mod_cgi.so 与 mod_cgid.so

操作如下:
1、查看apache是否安装mod_cgi模块
[root@chen-123 cgi-bin]# apachectl -l|grep cgi
mod_proxy_scgi.c
未发现mod_cgi.c,说明apache默认没安装cgi模块
2、添加步骤
1)、先找到mod_cgi.c及mod_cgid.c。一般在apache安装包目录下,如:/root/godaddy/html/centos/httpd-2.2.25/modules/generators
2)、编译安装cgi模块
[root@chen-123 generators]#cd /root/godaddy/html/centos/httpd-2.2.25/modules/generators
[root@chen-123 generators]#/opt/phpdba/httpd-2.2.25/bin/apxs -i -a -c mod_cgi.c
编译成功后会输出:

…. #省略掉了前部分内容
———————————————————————-
chmod 755 /opt/phpdba/httpd-2.2.25/modules/mod_cgi.so
[activating module `cgi' in /opt/phpdba/httpd-2.2.25/conf/httpd.conf] #这行表示,在httpd.conf中已经加载了cgi module

[root@chen-123 generators]# vim /opt/phpdba/httpd-2.2.25/conf/httpd.conf
LoadModule php5_module modules/libphp5.so
LoadModule cgi_module modules/mod_cgi.so #配置文件已经添加
[root@chen-123 generators]# ll /opt/phpdba/httpd-2.2.25/modules/
总用量 31252
-rw-r–r– 1 root root 9201 7月 22 17:39 httpd.exp
-rwxr-xr-x 1 root root 31913793 7月 22 17:47 libphp5.so
-rwxr-xr-x 1 root root 73503 7月 27 12:08 mod_cgi.so

#编译安装 cgid模板
[root@chen-123 generators]# /opt/phpdba/httpd-2.2.25/bin/apxs -i -a -c mod_cgid.c
编译成功后会输出:
…. #省略掉了前部分内容
———————————————————————-
chmod 755 /opt/phpdba/httpd-2.2.25/modules/mod_cgid.so
[activating module `cgid' in /opt/phpdba/httpd-2.2.25/conf/httpd.conf]#这行表示,在httpd.conf中已经加载了cgid module
[root@chen-123 generators]# vim /opt/phpdba/httpd-2.2.25/conf/httpd.conf
LoadModule php5_module modules/libphp5.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule cgid_module modules/mod_cgid.so
[root@chen-123 generators]# ll /opt/phpdba/httpd-2.2.25/modules/
总用量 31344
-rw-r–r– 1 root root 9201 7月 22 17:39 httpd.exp
-rwxr-xr-x 1 root root 31913793 7月 22 17:47 libphp5.so
-rwxr-xr-x 1 root root 92334 7月 27 12:11 mod_cgid.so
-rwxr-xr-x 1 root root 73503 7月 27 12:08 mod_cgi.so

3)、apxs参数含义:
-i 表示需要执行安装操作。
-a 自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-n 增加或启用的模块名称。
3、验证cgi模块安装是否成功
1)查看apache模块列表
[root@chen-123 generators]# apachectl -M|grep cgi
proxy_scgi_module (static)
cgi_module (shared)
cgid_module (shared)
2)、重启apache、访问cgi脚本
[root@chen-123 generators]# apachectl restart
结果报如下错误:
停止 httpd: [确定]
启动 httpd:httpd: Syntax error on line 61 of /opt/phpdba/httpd-2.2.25/conf/httpd.conf: module cgi_module is built-in and can’t be loaded [失败]
提示说:cgi_module 是内建模块,即无需手动加载,所以我们把“LoadModule cgi_module modules/mod_cgi.so”注释掉即可!
* 用命令 apachectl -l 去查看下哪些模块被内建了,及安装时编译了cgi模块。

3)、浏览器访问http://chen-123.phpdba.com/cgi-bin/test.cgi

CGI/1.0 test script report:

argc is 0. argv is .

SERVER_SOFTWARE = XXXX
SERVER_NAME = chen-123.phpdba.com
GATEWAY_INTERFACE = CGI/1.1
SERVER_PROTOCOL = HTTP/1.1
SERVER_PORT = 80
REQUEST_METHOD = GET
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
PATH_INFO =
PATH_TRANSLATED =
SCRIPT_NAME = /cgi-bin/test.cgi
QUERY_STRING =
REMOTE_HOST =
REMOTE_ADDR = 11*.*.***.239
REMOTE_USER =
AUTH_TYPE =
CONTENT_TYPE =
CONTENT_LENGTH =

cgi模块安装好了,继续qmailadmin 。

07/24/14

网站上线,运维应该知道什么?

产品经理牵头,对网站频道进行改版,失败告终。

1、为什么会失败?

2、改版过程中都存在那些问题?

3、产品经理在整个改版过程中,应该扮演什么角色?

4、程序在改版过程中的问题?

。。。。

这些问题的答案,我想他们都比我清楚。

做为一个运维,最近也一直在思考,运维在整个事件中的问题,运维应该怎样做才好?

1、网站域名、代码svn、 数据库配置、服务器硬件、memcache、 redis、 图片等资源,包括svn和系统权限控制 、ip分配
2、网站架构文档、项目配置文档、服务器配置文档、网站测试文档、高可用文档、安全文档、网站上线确认文档
3、网站并发设计、pv预估、推广途径
4、网站监控、性能监控(平均访问时间监控、 webserver每秒qps、 apahce和mysql请求数监控、web和db流量监控、 memcache和图片等存储监控 ),web监控 (可用性监控、接口调用监控、南北互通监控 ),安全监控 (监控文件变更),db锁边监控 ,qps异常监控,错误日志,慢查询日志
5、代码、数据库、图片等资源备份计划
6、备用系统构建、高可用构建
7、服务器部署信息更新
8、项目上线跟踪分析 、apache日志分析和状态统计, 爬虫统计分析

以上8点,应该是运维在整个项目过程中,应该了解到信息。

要了解这些信息,运维应该怎么做才好呢?

07/23/14

falcon 监控数据中文乱码问题

现象:falcon编译好之后,启动falcon服务,数据正常记录到数据库,但中文显示乱码。

原因:mysql_real_connect()

By default, this is latin1, but can be changed by calling mysql_options(mysql, MYSQL_SET_CHARSET_NAME, “charset_name”) prior to connecting.

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

代码展示:
       connection = mysql_init(NULL);

        if (connection == NULL) {
                printf("connection NULL\n");
                return NULL;
        }

        mysql_options(connection, MYSQL_SET_CHARSET_NAME, "utf8");//添加这行,设置默认字符集utf8

        mysql_real_connect(connection, mysqlserver, mysqlusr, mysqlpwd, mysqldb, 0,
                        NULL, 0);
        if (connection == NULL) {
                printf("%s\n", mysql_error(connection));
        } else {

        }

重新编译启动之后,数据库里面数据正常。