各种域名跳转方式

一个是使用bind的view功能。
这个首先就需要定义一个ACL列表,然后在name.conf中include一下就可以了。Acl定义的格式如下:

acl "company"{
1.1.1.1/32;
2.2.2.2/32;
};

每行定义记得用分号结尾就行。

下面这个是named.conf的配置。View也就是这里进行配置完成的。记得所有的zone必须在view中。

options {
directory "/usr/local/bind/var";
};
include "/usr/local/bind/var/company_acl.conf";
view "view_company"{
match-clients { company; };
#这里的company就是你前面acl中定义的acl名字

zone "abc.com" {
       type master;
       file "abc.com.company";
       allow-update { none; };
};
zone "." in {
       type hint;
       file "named.root";
};
zone "0.0.127.in-addr.arpa" in {
       type master;
       file "empty";
};
};

view "view_any"{
match-clients { any; };
zone "abc.com" {
       type master;
       file "abc.com.ns";
       allow-update { none; };
};
zone "." in {
       type hint;
       file "named.root";
};
zone "0.0.127.in-addr.arpa" in {
       type master;
       file "empty";
};
};

这些定义完成之后就是添加zone记录了。
下面这个是view_company的实例,其他类似就成。

$TTL 3h
@ IN SOA abc.com. ns.abc.com. (
 2009071601; serial
 3h  ; Refresh after 3hours
 1h  ; Retry after 1 hour
 1w  ; Expire fter 1 week
 1h )  ; Negative caching TTL of 1 hour
;
;name server
 IN NS ns.abc.com.
;
;address
;address
@  in mx 30   mail
abc.com. IN MX 10 mail.abc.com.
mail IN A 10.2.9.98
ns IN A 10.2.9.99
* IN CNAME update.microsoft.com.

总结一下,使用view功能就很容易可以把自己访问和其他访问进行区分对待,这个CDN的原理的一部分就是这样的。但是由于DNS本身是需要所有DNS来进行学习的。所以每次生效和失效当中的间隔比较长,如果只是短期更改,那最好不要使用DNS来进行。

第二种方式是用IPTABLES的转发功能来进行。
这里我们假设有2台机器。10.2.9.118是我本机。这个IPTABLES是设置在10.2.9.33上,10.2.9.99是被转发的机器,也就是除了我10.2.9.118能够正常访问10.2.9.33,其他人的访问都转发到10.2.9.99:80上。这里主要用到iptables得nat功能和filter功能。在redhat中就是替换/etc/sysconfig/iptables的内容。

# Firewall configuration written by system-config-securitylevel
*nat
:--PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:--POSTROUTING ACCEPT [0:0]
#上面3行都没有--这个符号,这里没办法才加的
-A PREROUTING -s ! 10.2.9.118 -p tcp --dport 80 -j DNAT --to-destination 10.2.9.99:80
#这个表示除了10.2.9.118来的访问10.2.9.33的80端口全部转发到10.2.9.99:80上
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth1 -j ACCEPT
-A FORWARD -i eth0 -p tcp --dport 80 -d 10.2.9.99 -j ACCEPT
#这个表示允许10.2.9.33可以转发到10.2.9.99上。
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#上面2个表示开通本机的22和80端口允许任何人访问
COMMIT

上面修改完成后海不能算最后生效,还需要打开10.2.9.33的ip转发功能。修改

/etc/sysctl.conf 中net.ipv4.ip_forward = 1 

默认这个值为0,表示禁止转发,改成1就行,然后执行

sysctl –p /etc/sysctl.conf

就行了。
最后我们还要在10.2.9.99上建立一个默认网站。因为iptables中转发过来的是ip+端口的形式。所以必须让10.2.9.99有默认网站。这个默认网站上。在nginx中,在配置文件最上面的网站就是默认网站。

    server {
        listen       80;
        server_name  update.abc.com;

        location / {
            root   /opt/update/;
            expires      180d;
            index  index.html index.htm;
            access_log  logs/defalut.access.log  main;
        }
        error_page   500 502 503 504  /index.htm;
        error_page   404          /index.htm;
        location = /index.htm {
            root   /opt/update/;
        }
        }

这里设置了所有的404和500错误全部被转向到index.htm上了。当然你可以使用rewrite来完成这样的功能。这样无论用户访问10.2.9.33上的任何网站都会被转到10.2.9.99的默认网站,除了我自己以外,哈哈!

最后一种重定向方式就是使用nginx的geo模块。这个在以前的日志已经有写,可以参考https://zauc.wordpress.com/2008/11/22/nginx-ge/

crontab无法运行三解

我们经常可以发现某个shell程序手动运行的是完全正常的,但是放到crontab中却没有定时运行。这个时候我们可以查看下/var/log/cron这个日志文件看看你的应用程序是否被准时调用了。
如果在日志文件中我们没有发现这个应用程序执行的相关日志,那估计你是在crontab中把shell程序路径给写错了。这个时候你就得检查一下路径问题了。
还有一种情况是发现日志当中也有执行的信息,但是我们找不到运行之后的结果。这个时候我一般碰到的就是环境变量的问题。
解决环境变量问题首先可以输入export看下自己的环境变量,如果这里没有,那可以在shell程序头部增加

source /etc/profile

,这样就可以导入完整的系统环境变量。这个是我以前的办法。
最近由于涉及到得shell程序比较多,这些shell本来是在crontab中能够正常执行的,但是在系统重装后这些程序却都不执行了。而系统的环境变量是相同的,这让我想到了是不是crontab自己有一个环境变量。
搜索了一遍果然发现crontab自己的环境变量设置。

vim /etc/crontab

文件中我们就可以看到PATH的设置,这个就是crontab自己的环境变量了。汗死啊!