利用nginx concat模块合并js css

如果你网站有很多css和js文件,如果把它们分别合并到一个文件,可以大大减小http请求数,加快网站访问速度。nginx-http-concat模块是由淘宝网开发的,现在淘宝网合并js和css正是用这个模块,如链接http://a.tbcdn.cn/??s/kissy/1.2.0/kissy-min.js,p/global/1.0/global-min.js,p/fp/2012/core.js,p/fp/2012/fp/module.js,p/fp/2012/fp/util.js,p/fp/2012/fp/directpromo.js?t=2012080620120924.js就是合并了kissy-min.js、global-min.js、core.js、module.js、util.js,directpromo.js等js文件。要使用这个模块,第一步当然是安装此模块并配置nginx,第二步是修改网站源码中引用js文件的代码,如本站合并js前的代码为:

  1. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/comments-ajax.js"></script>
  2. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/js/reply.js"></script>
  3. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/js/jquery.min.js" ></script>
  4. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/js/custom.js"></script>
  5. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/js/superfish.js"></script>
  6. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/js/muscript.js"></script>

合并后js代码为:

  1. <script type="text/javascript" src="http://devops.webres.wang/wp-content/themes/HotNewspro/??comments-ajax.js,js/reply.js,js/jquery.min.js,js/custom.js,js/superfish.js,js/muscript.js"></script>

下面以本博客为例讲解如何使用此模块。

安装concat模块

下载concat模块:

  1. git clone git://github.com/taobao/nginx-http-concat.git

使用–add-module添加模块:

  1. –add-module=/path/to/nginx-http-concat

配置nginx

在nginx.conf加入:

  1. location /wp-content/themes/HotNewspro {
  2. concat on;
  3. }

这段代码表示在目录/wp-content/themes/HotNewspro启用concat模块,这样在这目录的css或js才能合并。
更详细的nginx concat模块解释请移至:https://github.com/taobao/nginx-http-concat

nginx_lua模块基于mysql数据库动态修改网页内容

最近要实现一个需求,根据查询mysql数据库返回的内容,插入到网页底部。目前前端是用varnish作的缓存,刚开始想从varnish下手,但官方varnish不支持修改网页内容,要支持的话还需要自己修改源码实现,这个有点难度放弃了,于是想在varnish的后端架设一台nginx的反向代理服务器获取网页内容,然后通过nginx_lua模块实现查询mysql数据库动态修改网页的功能。下面是使用nginx_lua模块的方法,记录一下方便下次查询。

安装luajit2.0

git的安装可以参考:http://devops.webres.wang/2012/09/centos-install-git/

  1. cd /tmp/
  2. git clone http://luajit.org/git/luajit-2.0.git
  3. cd luajit-2.0/
  4. make && make install
  5. ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit
  6. ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/

下载ngx_devel_kit、lua-nginx-module和nginx

  1. cd /tmp
  2. git clone http://github.com/simpl/ngx_devel_kit.git
  3. git clone http://github.com/chaoslawful/lua-nginx-module.git
  4. wget http://nginx.org/download/nginx-1.2.3.tar.gz

安装nginx

  1. tar xzf nginx-1.2.3.tar.gz
  2. cd nginx-1.2.3
  3. export LUAJIT_LIB=/usr/local/lib
  4. export LUAJIT_INC=/usr/local/include/luajit-2.0
  5. ./configure –prefix=/usr/local/nginx –add-module=/tmp/ngx_devel_kit –add-module=/tmp/lua-nginx-module
  6. make && make install

安装lua-resty-mysql

  1. cd /tmp
  2. git clone http://github.com/agentzh/lua-resty-mysql.git
  3. cd lua-resty-mysql/
  4. make install

nginx配置文件

  1. server {
  2.         ……
  3.         ……
  4.                resolver 8.8.8.8;
  5.     location / {
  6.         default_type  text/html;
  7.         content_by_lua_file "/usr/local/nginx/conf/lua";
  8. }
  9.     location /proxy {
  10.                 internal;
  11.                 proxy_pass $scheme://$http_host$request_uri;
  12.                 proxy_set_header Accept-Encoding ”;
  13.                  proxy_redirect          off;
  14.     }
  15.        ……
  16.        ……
  17.          }

lua内容

  1. if (ngx.req.get_method()=="GET") then
  2.         data=ngx.location.capture("/proxy")
  3.         if data.status == 200 then
  4.                 if data.header["Content-Type"] and string.find(data.header["Content-Type"],"html") then
  5.  
  6.                         –mysql connect begin
  7.                         local mysql = require "resty.mysql"
  8.                         local db, err = mysql:new()
  9.                         if not db then
  10.                                 ngx.say("failed to instantiate mysql: ", err)
  11.                                 return
  12.                         end
  13.                         db:set_timeout(1000) — 1 sec
  14.                         ok, err, errno, sqlstate = db:connect{
  15.                                 host = "127.0.0.1",
  16.                                 port = 3306,
  17.                                 database = "proxy",
  18.                                 user = "root",
  19.                                 password = "537817",
  20.                                 compact_arrays=true,
  21.                                 max_packet_size = 1024 * 1024 }
  22.                         if not ok then
  23.                                 ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)
  24.                                 return
  25.                         end
  26.                         host=ngx.req.get_headers()["Host"]
  27.                         sql="select content from cache_modify where domain=’"..host.."’"
  28.                         res, err, errno, sqlstate = db:query(sql)
  29.                         if not res then
  30.                                 ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
  31.                                 return
  32.                         end
  33.                         –mysql connect end
  34.  
  35.                         if table.getn(res)==0 then
  36.                                 for k,v in pairs(data.header) do
  37.                                 ngx.header[k]=v
  38.                                 end
  39.                                 ngx.say(data.body)
  40.                         else
  41.                                 for k,v in pairs(data.header) do
  42.                                         if (k=="Content-Length") then
  43.                                                 ngx.header["Content-Length"]=""
  44.                                         else
  45.                                                 ngx.header[k]=v
  46.                                         end
  47.                                 end
  48.                                 body,_=string.gsub(data.body,"</body>",res[1][1].."</body>")
  49.                                 ngx.say(body)
  50.                         end
  51.                 else
  52.                         for k,v in pairs(data.header) do
  53.                                 ngx.header[k]=v
  54.                         end
  55.                         ngx.say(data.body)
  56.                 end;
  57.         else
  58.                 ngx.exec("/proxy")
  59.         end;
  60. else
  61.                 ngx.exec("/proxy");
  62. end;

模块地址:http://wiki.nginx.org/HttpLuaModule

centos安装git

1、安装依赖

  1. yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel autoconf

2、开始安装

  1. wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
  2. tar xzvf git-latest.tar.gz
  3. cd git-`date +%F`
  4. autoconf
  5. ./configure
  6. make && make install

3、查看版本

  1. git –version

git version 1.7.12.GIT

NTP时间服务器工作原理

NTP简介

NTP(Network Time Protocol, 网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步,NTP基于UDP保温进行传输,使用UDP端口号为123。
使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
对于运行NTP的本地系统,既可以接受来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以喝其他设备互相同步。

NTP工作原理

NTP的基本工作原理如图1-1所示。Device A和Device B通过网络相连,他们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:

  • 在Device A和Device B的系统时钟同步之前,DeviceA的时钟设定为10:00:00am,DeviceB的时钟设定为11:00:00am。
  • 设备B作为NTP时间服务器,即设备A将使自己的时钟与设备B的时钟同步。
  • NTP报文在设备A和设备B之间单向传输所需要的时间是1秒
  • FAQ

    图1-1 NTP原理图
    系统时钟同步过程如下:

  • 设备A发送一个NTP报文给设备B,该报文带有它离开设备A时的时间戳,该时间戳为10:00:00am(T1)。
  • 当此NTP报文到达设备B时,设备B加上自己的时间戳,该时间戳为11:00:01am(T2)。
  • 当此NTP报文离开设备B时,设备B再加上自己的时间戳,改时间戳为11:00:02(T3)。
  • 当设备A接收到该响应报文时,设备A的本地时间为10:00:03am(T4)。
  • 至此,设备A已经拥有足够的信息来计算两个重要的参数:
  • NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2 秒。
  • 设备A相对设备B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。
  • 这样,设备A就能够根据这些信息来设定自己的时钟,使之与设备B的时钟同步。
    以上内容只是对NTP工作原理的一个粗略描述,更详细的资料可以参阅RFC 1305。

    NTP工作模式

    设备可以采用多种NTP工作模式进行时间同步:

  • 客户端/服务端模式
  • 对等体模式
  • 广播模式
  • 组播模式
  • 用户可以根据需要选择合适的工作模式。在不能确定服务器或对等体IP地址、网络中需要同步的设备很多等情况下,可以通过广播或组播模式实现时钟同步;服务器和对等体模式中,设备从指定的服务器或对等体获得时钟同步,增加了时钟的可靠性。
    1、客户端/服务器模式
    FAQ
    在该模式下,客户端能同步到服务器,而服务器无法同步到客户端。Mode3客户模式,mode4服务模式,
    适用于一台时间服务器接收上层时间服务器的时间信息,并提供时间信息给下层的用户。
    2、对等模式
    FAQ
    主动对等体和被动对等体可以互相同步。如果双方的时钟都已经同步,则以层数小的时钟为准。Mode1是主对等体模式,mode2被对等体模式,mode3客户模式,mode4是服务模式
    3、广播模式
    FAQ
    在广播模式中,服务器端周期性地向广播地址255.255.255.255发送时钟同步报文,报文中的Mode字段设置为5(广播模式)。客户端侦听来自服务器的广播报文。流程如图1-4所示。Mode3客户模式,mode4服务模式
    4、组播模式
    FAQ
    在组播模式中,服务端周期性地向组播地址发送时钟同步报文。报文中的mode5是组播模式,mode4是服务器模式,mode3是客户模式。

    python MySQLdb模块介绍

    当我们需要python操作mysql数据库时,可以安装MySQLdb模块以支持mysql的操作。
    1、安装MySQLdb模块
    因为CentOS有现成的rpm包,所以我们可以选择yum安装。

    1. yum install MySQL-python

    2、第一个示例

    1. #!/usr/bin/python
    2. import MySQLdb as mdb  #导入MySQLdb模块为mdb
    3. con=None #初始化con为None
    4. con=mdb.connect(‘localhost’,’root’,’root’,’mysql’) #连接数据库,参数依次为主机,用户,密码,数据库
    5. cur=con.cursor() #取得cursor对象,为了能遍历数据。
    6. cur.execute("select version()") #执行查询语句
    7. data=cur.fetchone() #取一条数据
    8. print "Database version: %s " % data #打印数据
    9. con.close() #关闭连接

    3、创建并填充表

    1. #!/usr/bin/python
    2. import MySQLdb as mdb
    3. con = mdb.connect(‘localhost’, ‘testuser’, ‘test623’, ‘testdb’);
    4.  
    5. with con:
    6.     
    7.     cur = con.cursor()
    8.     cur.execute("CREATE TABLE IF NOT EXISTS
    9.         Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))") #创建表格
    10.     cur.execute("INSERT INTO Writers(Name) VALUES(‘Jack London’)")  #填充数据
    11.     cur.execute("INSERT INTO Writers(Name) VALUES(‘Honore de Balzac’)")
    12.     cur.execute("INSERT INTO Writers(Name) VALUES(‘Lion Feuchtwanger’)")
    13.     cur.execute("INSERT INTO Writers(Name) VALUES(‘Emile Zola’)")
    14.     cur.execute("INSERT INTO Writers(Name) VALUES(‘Truman Capote’)")

    3、检索数据

    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3.  
    4. import MySQLdb as mdb
    5. import sys
    6.  
    7.  
    8. con = mdb.connect(‘localhost’, ‘testuser’,
    9.         ‘test623’, ‘testdb’);
    10.  
    11. with con:
    12.  
    13.     cur = con.cursor()
    14.     cur.execute("SELECT * FROM Writers")
    15.  
    16.     rows = cur.fetchall()  #把所有数据以元组类型赋值给rows
    17.  
    18.     for row in rows:  #循环打印数据
    19.         print row

    MySQLdb文档:http://mysql-python.sourceforge.net/MySQLdb-1.2.2/

    cacti监控磁盘IO

    1、检查net-snmp是否支持IO监控

    1. snmpwalk -v 3 -u username -A password -a md5 -l authNoPriv localhost .1.3.6.1.4.1.2021.13.15.1.1.1

    执行如上命令,如果返回类似如下数据,则表示支持disk io的监控,否则需要重新编译增加diskio-module模块。

    1. UCD-DISKIO-MIB::diskIOIndex.1 = INTEGER: 1
    2. UCD-DISKIO-MIB::diskIOIndex.2 = INTEGER: 2
    3. UCD-DISKIO-MIB::diskIOIndex.3 = INTEGER: 3
    4. ……

    2、下载Cacti_Net-SNMP_DevIO_v3.1.zip

    下载Cacti_Net-SNMP_DevIO_v3.1.zip,解压并上传net-snmp_devio.xml到 /resource/snmp_queries/目录。

    3、导入模板

    通过cacti后台的”Import Templates”导入所有的*_TMPL.xml文件,最后导入net-snmp_devIO-Data_query.xml文件。完成后,你就可以在“Data Queries”看到“ucd/net – Get Device I/O”。

    4、为已存在的”ucd/net SNMP Host”增加磁盘IO监控。

    切换到”devices”,点击已存在的”ucd/net snmp host”主机,如我的devops.webres.wang-ucd/net-snmp。往页尾看,在“Associated Data Queries”的”Add Data Query: “中选择”ucd/net – Get Device I/O”,”Re-Index Method: “选择”Index Count Changed”,点击”Add”增加Data Queries。

    5、创建IO图形监控

    接着点击页头的”Create Graphs for this Host”,在”
    Data Query [ucd/net – Get Device I/O]”下面选择需要监控的磁盘,点击”create”开始创建图形。
    至此cacti监控磁盘IO的设置已经完成。
    参考:http://forums.cacti.net/about8777-0-asc-0.html

    bind-dlz结合mysql实现智能DNS

    下面介绍bind结合mysql实现智能dns,以centos-6 32为例安装

    安装mysql

    1. yum install gcc gcc-c++ openssl-devel wget ncurses-devel make
    2. groupadd mysql
    3. useradd -g mysql mysql -s /sbin/nologin
    4. cd /tmp
    5. wget http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.65.tar.gz
    6. tar xzf mysql-5.1.65.tar.gz
    7. cd mysql-5.1.65
    8. ./configure –prefix=/usr/local/mysql/ –without-pthread –with-unix-socket-path=/tmp/mysql.sock –with-extra-charsets=gbk,gb2312,utf8
    9. make
    10. make install
    11. cp support-files/my-medium.cnf /etc/my.cnf
    12. /usr/local/mysql/bin/mysql_install_db –user=mysql
    13. chown -R root.mysql /usr/local/mysql
    14. chown -R mysql /usr/local/mysql/var
    15. cp support-files/mysql.server /etc/init.d/mysqld
    16. chown root.root /etc/rc.d/init.d/mysqld
    17. chmod 755 /etc/rc.d/init.d/mysqld
    18. chkconfig –add mysqld
    19. chkconfig  mysqld on
    20. ln -s /usr/local/mysql/bin/mysql /usr/bin
    21. ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
    22. service mysqld start
    23. mysqladmin -u root password root

    安装bind

    1. cd /tmp
    2. wget http://ftp.isc.org/isc/bind9/cur/9.9/bind-9.9.1-P2.tar.gz
    3. tar xzf bind-9.9.1-P2.tar.gz
    4. cd bind-9.9.1-P2
    5. ./configure –prefix=/usr/local/bind/ –disable-openssl-version-check –with-dlz-mysql=/usr/local/mysql
    6. make
    7. make install

    配置bind

    1. cd /usr/local/bind/etc
    2. ../sbin/rndc-confgen -r /dev/urandom >rndc.conf
    3. tail -n10 rndc.conf | head -n9 | sed -e s/#//g>named.conf
    4.  
    5. vi named.conf
    6. 在后面增加:
    7. include "/usr/local/bind/etc/CHINANET.acl"; //联通ACL
    8. include "/usr/local/bind/etc/CNC.acl"; //电信ACL
    9. include "/usr/local/bind/etc/view.conf"; //DLZ相关的配置

    下载acl文件:

    1. wget http://devops.webres.wang/wp-content/uploads/2012/02/CHINANET.acl
    2. wget http://devops.webres.wang/wp-content/uploads/2012/02/CNC.acl

    view.conf内容:
    其中需要修改的字段为user=root pass=root,即此处mysql用户为root,密码为root。

    1. view "CHINANET_view" {
    2.   match-clients  { CHINANET; };
    3.   allow-query-cache { none; };
    4.   allow-recursion { none; };
    5.   allow-transfer { none; };
    6.   recursion no;
    7.  
    8.     dlz "Mysql zone" {
    9.     database "mysql
    10.     {host=127.0.0.1 dbname=dns_data ssl=false port=3306 user=root pass=root}
    11.     {select zone from dns_records where zone = ‘$zone$’ and  view = ‘any’ limit 1}
    12.     {select ttl,type,mx_priority,case when lower(type)=’txt’ then concat(‘"’,data,’"’) when lower(type)    =  ‘soa’  then   concat_ws(‘ ‘,  data,  resp_person,  serial,  refresh,  retry,  expire,  minimum)   else   data   end   as   mydata   from   dns_records where zone = ‘$zone$’   and host = ‘$record$’ and view=(select view from dns_records where zone = ‘$zone$’ and host = ‘$record$’ and (view=’CHINANET’ or view=’any’) order by priority asc limit 1)}";
    13. };
    14. };
    15. view "CNC_view" {
    16.   match-clients  { CNC; };
    17.   allow-query-cache { none; };
    18.   allow-recursion { none; };
    19.   allow-transfer { none; };
    20.   recursion no;
    21.  
    22.     dlz "Mysql zone" {
    23.     database "mysql
    24.     {host=127.0.0.1 dbname=dns_data ssl=false port=3306 user=root pass=root}
    25.     {select zone from dns_records where zone = ‘$zone$’ and  view = ‘any’ limit 1}
    26.     {select ttl,type,mx_priority,case when lower(type)=’txt’ then concat(‘"’,data,’"’) when lower(type)    =  ‘soa’  then   concat_ws(‘ ‘,  data,  resp_person,  serial,  refresh,  retry,  expire,  minimum)   else   data   end   as   mydata   from   dns_records where zone = ‘$zone$’   and host = ‘$record$’ and view=(select view from dns_records where zone = ‘$zone$’ and host = ‘$record$’ and (view=’CNC’ or view=’any’) order by priority asc limit 1)}";
    27. };
    28. };
    29. view "any_view" {
    30.   match-clients  { any; };
    31.   allow-query-cache { none; };
    32.   allow-recursion { none; };
    33.   allow-transfer { none; };
    34.   recursion no;
    35.  
    36.     dlz "Mysql zone" {
    37.     database "mysql
    38.     {host=127.0.0.1 dbname=dns_data ssl=false port=3306 user=root pass=root}
    39.     {select zone from dns_records where zone = ‘$zone$’ and  view = ‘any’ limit 1}
    40.     {select ttl,type,mx_priority,case when lower(type)=’txt’ then concat(‘"’,data,’"’) when lower(type)    =  ‘soa’  then   concat_ws(‘ ‘,  data,  resp_person,  serial,  refresh,  retry,  expire,  minimum)   else   data   end   as   mydata   from   dns_records where zone = ‘$zone$’   and host = ‘$record$’ and view = ‘any’}";
    41. };
    42. };

    数据库配置

    1. mysql>create database dns_data;        //创建数据库名为 dns_data
    2.    mysql>use dns_data;
    3.    DROP TABLE IF EXISTS `dns_records`;
    4. CREATE TABLE `dns_records` (
    5.    `id` int(10) unsigned NOT NULL auto_increment,
    6.    `zone` varchar(255) NOT NULL,
    7.    `host` varchar(255) NOT NULL default ‘@’,
    8.    `type` enum(‘MX’,’CNAME’,’NS’,’SOA’,’A’,’PTR’) NOT NULL,
    9.    `data` varchar(255) default NULL,
    10.    `ttl` int(11) NOT NULL default ‘800’,
    11.    `view` char(20) default ‘any’,     //any 代表默认,SOA 查询需,其它可以分,CNC……
    12.    `mx_priority` int(11) default NULL,
    13.    `priority` int(3) default 255,  //any为255,其它如CNC,CHINANET等线路为200
    14.    `refresh` int(11) NOT NULL default ‘3600’,
    15.    `retry` int(11) NOT NULL default ‘3600’,
    16.    `expire` int(11) NOT NULL default ‘86400’,
    17.    `minimum` int(11) NOT NULL default ‘3600’,
    18.    `serial` bigint(20) NOT NULL default ‘2008082700’,
    19.    `resp_person` varchar(64) NOT NULL default ‘root.domain.com.’,
    20.    `primary_ns` varchar(64) NOT NULL default ‘ns1.domain.com.’,
    21.    `data_count` int(11) NOT NULL default ‘0’,
    22.    PRIMARY KEY          (`id`),
    23.    KEY `type` (`type`),
    24.    KEY `host` (`host`),
    25.    KEY `zone` (`zone`)
    26. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

    启动bind服务

    # /usr/local/bind/sbin/named -uroot -g -d 9 //调试状态,如果没有报错说明环境配置正确。
    做成启动服务. Debug 的时候多用此模式启动bind.
    # /usr/local/bind/sbin/rndc reload 重载 named.conf 相关配置文件.
    # /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 启动 bind 服务.

    #插入记录的sql实例

    1. –SOA
    2.  
    3.      INSERT   INTO   `dns_records`   (`zone`,   `host`,   `type`,   `data`,   `ttl`,`mx_priority`,   `refresh`,   `retry`,   `expire`,      `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES    (‘webres.wang’,     ‘@’,   ‘SOA’,   ‘ns1.webres.wang.’,    10,   NULL,     3600,    3600,   86400,    10,   2008082700, ‘root.webres.wang.’, ‘ns1.webres.wang.’, 0);
    4.  
    5.      –@ NS
    6.  
    7.      INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES      (‘webres.wang’, ‘@’, ‘NS’, ‘ns1.webres.wang.’),      (‘webres.wang’, ‘@’, ‘NS’, ‘ns2.webres.wang.’);
    8.  
    9.      –NS A
    10.      INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES      (‘webres.wang’, ‘ns1’, ‘A’, ‘211.100.72.137’),   (‘webres.wang’, ‘ns2’, ‘A’, ‘219.232.244.11’);
    11.  
    12.      –A
    13.  
    14.      INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`,`priority`) VALUES   (‘webres.wang’, ‘www’, ‘A’, ‘210.51.36.116’, 3600, ‘CNC’,200),      (‘webres.wang’, ‘www’, ‘A’, ‘221.238.249.178’, 3600, ‘CHINANET’,200),      (‘webres.wang’, ‘www’, ‘A’, ‘211.103.156.230’, 3600, ‘any’,255);
    15.  
    16.      –CNAME
    17.  
    18.      INSERT INTO dns_records (zone,host,type,DATA,view,,priority)      VALUES (‘webres.wang’, ‘man’, ‘CNAME’, ‘www’,’CNC’,200),      (‘webres.wang’, ‘man’, ‘CNAME’, ‘www’,’CHINANET’,200),  (‘webres.wang’, ‘man’, ‘CNAME’, ‘www’,’any’,255);

    联通acl:http://devops.webres.wang/wp-content/uploads/2012/02/CNC.acl
    电信acl:http://devops.webres.wang/wp-content/uploads/2012/02/CHINANET.acl

    使用mod_fcgid执行php脚本

    安装依赖

    1. yum -y install gcc  gcc-c++ libtool-libs autoconf freetype-devel gd libjpeg-devel  libpng-devel libxml2-devel ncurses-devel zlib-devel curl-devel cmake patch  automake make  readline-devel openssl-devel  glibc-devel  glib2-devel bzip2-devel  libcap-devel   pcre-devel libmcrypt-devel

    安装apache 2.2

    1. cd /tmp
    2. wget http://www.fayea.com/apache-mirror//httpd/httpd-2.2.22.tar.gz
    3. tar xzf httpd-2.2.22.tar.gz
    4. cd httpd-2.2.22
    5. ./configure –prefix=/usr/local/apache –with-included-apr –enable-so –enable-deflate=shared –enable-expires=shared  –enable-ssl=shared –enable-headers=shared –enable-rewrite=shared –enable-static-support
    6. make
    7. make install

    安装mod_fcgid

    1. cd /tmp
    2. wget http://www.fayea.com/apache-mirror//httpd/mod_fcgid/mod_fcgid-2.3.7.tar.gz
    3. tar xzf mod_fcgid-2.3.7.tar.gz
    4. cd mod_fcgid-2.3.7
    5. APXS=/usr/local/apache/bin/apxs ./configure.apxs
    6. make && make install

    安装mysql

    1. yum -y install mysql mysql-server mysql-devel

    安装php

    1. #安装libmcrypt(只在centos 6进行)
    2. rpm -i http://centos.googlecode.com/files/libmcrypt-2.5.8-9.el6.i686.rpm
    3. rpm -i http://centos.googlecode.com/files/libmcrypt-devel-2.5.8-9.el6.i686.rpm
    4. cd /tmp
    5. wget http://cn.php.net/distributions/php-5.2.17.tar.gz
    6. tar xzf php-5.2.17.tar.gz
    7. cd php-5.2.17
    8. ./configure –prefix=/usr/local/php  –enable-fastcgi –enable-force-cgi-redirect –enable-discard-path –with-config-file-path=/etc –with-config-file-scan-dir=/etc/php.d –with-openssl –with-zlib  –with-curl –enable-ftp  –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –enable-gd-native-ttf  –enable-mbstring –with-mcrypt –enable-zip  –with-mysql –without-pear
    9. make && make install
    10. cp php.ini-recommended /etc/php.ini

    配置apache

    1、在/usr/local/apache/conf/httpd.conf增加如下内容:

    1. NameVirtualHost *:80
    2. <VirtualHost *:80>
    3.   ServerName devops.webres.wang
    4.   ServerAlias devops.webres.wang webres.wang
    5.   DocumentRoot /var/www/html/
    6.   <IfModule mod_fcgid.c>
    7.     <Directory /var/www/html/>
    8.       Options +ExecCGI
    9.       AllowOverride All
    10.       AddHandler fcgid-script .php
    11.       FCGIWrapper /usr/local/php/bin/php-wrapper .php
    12.       Order allow,deny
    13.       Allow from all
    14.     </Directory>
    15.   </IfModule>
    16.   ServerSignature Off
    17. </VirtualHost>

    2、/usr/local/php/bin/php-wrapper内容如下:

    1. #!/bin/sh
    2. # Set desired PHP_FCGI_* environment variables.
    3. # Example:
    4. # PHP FastCGI processes exit after 500 requests by default.
    5. PHP_FCGI_MAX_REQUESTS=10000
    6. export PHP_FCGI_MAX_REQUESTS
    7.  
    8. # Replace with the path to your FastCGI-enabled PHP executable
    9. exec /usr/local/php/bin/php-cgi

    启动服务

    #启动mysql

    1. service mysqld start
    2. mysqladmin -uroot password root
    3.  
    4. #启动apache
    5. /usr/local/apache/bin/apachectl -k start

    使用bind-mysql模块增加对mysql数据库的支持

    对于bind,如果想修改或增加dns记录,是直接修改文本的,这样的话一方面不方面管理,另一方面容易出错,如果我们增加对mysql数据库的支持,再配合php或perl,python等程序直接操作mysql,这对于dns的管理将会非常的方面和不易出错。现在介绍使用mysql bind驱动模块实现这一功能。

    一、安装mysql

    安装mysql服务器可以使用yum或源码编译安装,我们这里使用yum安装。

    1. yum -y install mysql mysql-server mysql-devel

    二、安装bind和mysql-bind

    1、分别下载bind和mysql-bind

    1. cd /tmp
    2. wget http://nchc.dl.sourceforge.net/project/mysql-bind/mysql-bind/mysql-bind-0.2%20src/mysql-bind.tar.gz
    3. wget http://ftp.isc.org/isc/bind9/cur/9.9/bind-9.9.1-P2.tar.gz
    4. tar xzf bind-9.9.1-P2.tar.gz
    5. tar xzf mysql-bind.tar.gz

    2、分别复制mysql-bind的mysqldb.c和mysqldb.h到bind-9.9.1-P2/bin/named和bind-9.9.1-P2/bin/named/include

    1. cd /tmp/mysql-bind
    2. cp mysqldb.c mysqldb.h /tmp/bind-9.9.1-P2/bin/named
    3. cp mysqldb.c mysqldb.h /tmp/bind-9.9.1-P2/bin/named/include

    3、修改bind源码中的bin/named/Makefile.in文件:

    1. DBDRIVER_OBJS = mysqldb.@O@
    2. DBDRIVER_SRCS = mysqldb.c
    3. DBDRIVER_INCLUDES = -I/usr/include/mysql  -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m32 -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv
    4. DBDRIVER_LIBS = -rdynamic -L/usr/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl -lcrypto

    注:
    DBDRIVER_INCLUDES的值由命令/usr/bin/mysql_config –cflags获得。
    DBDRIVER_LIBS的值由命令/usr/bin/mysql_config –libs获得。
    4、编辑bind源文件bin/named/main.c
    4.1、包含mysqldb.h
    在#include 后面增加#include
    4.2、在函数setup(void)里面ns_server_create()的前面添加mysqldb_init(),如

    1. /*
    2.          * Add calls to register sdb drivers here.
    3.          */
    4.         /* xxdb_init(); */
    5.         mysqldb_init();
    6.         ns_server_create(ns_g_mctx, &ns_g_server);

    4.3、在函数cleanup(void)里面ns_server_destroy()的后面添加mysqldb_clear(),如

    1. ns_server_destroy(&ns_g_server);
    2.         mysqldb_clear();
    3.         /*
    4.          * Add calls to unregister sdb drivers here.
    5.          */
    6.         /* xxdb_clear(); */

    4.4、编辑bind源文件中的bin/named/mysqldb.c文件:

    1. 更改#include <named/mysqldb.h>为#include "include/mysqldb.h"

    4.5 安装bind

    1. yum -y install gcc openssl-devel
    2. cd /tmp/bind-9.9.1-P2
    3. ./configure –prefix=/usr/local/bind  –disable-openssl-version-check
    4. make && make install

    三、mysql配置

    1. 启动:service mysqld start
    2. 设置root密码:mysqladmin -uroot password root
    3. 创建数据库:mysql> create database dns;
    4. 创建表:   mysql> CREATE TABLE mydomain (
    5. name varchar(255) default NULL,
    6. ttl int(11) default NULL,
    7. rdtype varchar(255) default NULL,
    8. rdata varchar(255) default NULL
    9. ) TYPE=MyISAM;

    插入数据示例:

    1. INSERT INTO mydomain VALUES (‘mydomain.com’, 259200, ‘SOA’, ‘mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800’);
    2. INSERT INTO mydomain VALUES (‘mydomain.com’, 259200, ‘NS’, ‘ns0.mydomain.com.’);
    3. INSERT INTO mydomain VALUES (‘mydomain.com’, 259200, ‘NS’, ‘ns1.mydomain.com.’);
    4. INSERT INTO mydomain VALUES (‘mydomain.com’, 259200, ‘MX’, ’10 mail.mydomain.com.’);
    5. INSERT INTO mydomain VALUES (‘w0.mydomain.com’, 259200, ‘A’, ‘192.168.1.1’);
    6. INSERT INTO mydomain VALUES (‘w1.mydomain.com’, 259200, ‘A’, ‘192.168.1.2’);
    7. INSERT INTO mydomain VALUES (‘mydomain.com’, 259200, ‘Cname’, ‘w0.mydomain.com.’);
    8. INSERT INTO mydomain VALUES (‘mail.mydomain.com’, 259200, ‘Cname’, ‘w0.mydomain.com.’);
    9. INSERT INTO mydomain VALUES (‘ns0.mydomain.com’, 259200, ‘Cname’, ‘w0.mydomain.com.’);
    10. INSERT INTO mydomain VALUES (‘ns1.mydomain.com’, 259200, ‘Cname’, ‘w1.mydomain.com.’);
    11. INSERT INTO mydomain VALUES (‘www.mydomain.com’, 259200, ‘Cname’, ‘w0.mydomain.com.’);
    12. INSERT INTO mydomain VALUES (‘ftp.mydomain.com’, 259200, ‘Cname’, ‘w0.mydomain.com.’);

    四、bind配置

    1. zone "mydomain.com" {
    2.   type master;
    3.   notify no;
    4.   database "mysqldb dbname tablename hostname user password";
    5. };

    其中dbname是数据库名,tablename是表名,hostname是mysql主机,然后就是用户名和密码
    启动bind:

    1. /usr/local/bind/sbin/named