浏览模式: 标准 | 列表

前几天在 debian etch 上配置了一个 apache2 反向代理虚拟主机,因为不能实现代理到应用服务器的负载均衡,所以感觉不太完美。今天配置了一下 lighttpd,发现用 lighttpd 实现反向代理虚拟主机比用 apache2 还要简单,而且实现负载均衡也很容易。早知如此,就不捣鼓 apache2 了。

debian etch 中有 lighttpd 这个包,直接 apt-get 就可以安装了。

安装之后,运行一下:

lighty-enable-mod proxy

就打开 proxy 扩展了。

编辑 /etc/lighttpd/conf-enabled/10-proxy.conf,加入:

$HTTP["host"] =~ "gatetest.(ujn.edu.cn|ujn.cn|ujn6.edu.cn|ujn.org.cn)" {
 
proxy.balance = "hash"
 
proxy.server  = ( "" => ( ( "host" => "10.0.0.10" ),
                            
( "host" => "10.0.0.11" ),
                            
( "host" => "10.0.0.12" ),
                            
( "host" => "10.0.0.13" ) ) )

这样的配置信息就可以了。

至于 lighttpd.conf 文件,可以去掉一些模块和配置,一般只需要保留这些就可以了:

server.modules             = ( "mod_accesslog" )
server.document-root       = "/var/www/"
server.errorlog            = "/var/log/lighttpd/error.log"
accesslog.filename         = "/var/log/lighttpd/access.log"
server.pid-file            = "/var/run/lighttpd.pid"
server.dir-listing         = "disable"
server.username            = "www-data"
server.groupname           = "www-data"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

如果要允许 IPv6,可以加入:

server.use-ipv6 = "enable"

选项。

以上配置就实现了一个反向代理。这种方式配置的话不需要修改 /etc/hosts,而且能够实现负载均衡,相当不错。不过 debian 的 lighttpd 包是不带 mod_cache 这个模块的,因为这个模块是第三方模块,需要打补丁自己编译。为了方便,我重新编译了 lighttpd 的 debian 包,这个包里已经包含了 mod_cache 模块了,只需要安装好之后,只需要执行一下:

lighty-enable-mod cache

就可以开启 cache 模块了。

编译好的带 cache 模块的 lighttpd 包可以在这里下载:lighttpd_1.4.13-4_i386.deb.zip

» 阅读全文

最近,学校里又有许多地方要申请开通网站,因为是学校,所以校园网出口主要是教育网,虽然也有电信和网通的出口,但是 IP 跟教育网的公网 IP 比起来稀有的很,所以,一般部门申请开通网站都需要开通教育网出口,而不会给他们一个电信或者网通的 IP。但问题是,教育网出口的收费是按照流量来收费的,费用相当高,所以,如果许多部门都来开通教育网出口的话,那学校在这方面会支出很大一笔。为了解决这个问题,我于是打算搞一个反向代理,出口搞成教育网和网通双线的,属于教育网免费地址的就走教育网,非免费公网地址就走网通出口。因为网通出口是包年的,不用白不用,这样就省了给教育网交钱啦。

至于反向代理是什么我就不说了,不知道的同志上 google 搜一下就知道了。这里主要写一下如何在 debian etch 上用 apache2 配置反向代理虚拟主机。

首先用 debian-40r0-i386-netinst.iso 安装最小化的系统,任何多余的东西都不要。

安装好之后,配置好 sources.list,然后更新一下系统。

用 apt-get install apache2 安装 apache 2。

安装好之后,进入 /etc/apache2/mods-enabled 目录,所有的扩展都可以删除。

然后在 /etc/apache2/mods-enabled 目录下建立 proxy 和 url_rewrite 扩展的软链接。

ln -s ../mods-available/proxy.conf proxy.conf
ln -s ../mods-available/proxy_http.load proxy_http.load
ln -s ../mods-available/proxy.load proxy.load
ln -s ../mods-available/rewrite.load rewrite.load

然后修改 proxy.conf 内容为:

proxy.conf
<IfModule mod_proxy.c>
        ProxyRequests Off
        
<Proxy *>
                AddDefaultCharset off
        
</Proxy>
        ProxyVia Off
</IfModule>

然后再修改 /etc/apache2 目录下的 apache2.conf 文件内容为:

apache2.conf
ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile /var/run/apache2.pid
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_worker_module>
    ServerLimit          16
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>
User www-data
Group www-data
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel warn
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
Include /etc/apache2/conf.d/
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ServerTokens Prod
ServerSignature Off
Include /etc/apache2/sites-enabled/

其中,IfModule mpm_worker_module 段中的具体数据需要根据具体服务器的情况(如内存、CPU 等)进行配置。

接下来修改 /etc/apache2/sites-enabled 目录下的 000-default 文件:

000-default
NameVirtualHost *
<VirtualHost *>
        ServerName webgate1.ujn.edu.cn
        ServerAlias *.ujn.edu.cn *.ujn6.edu.cn *.ujn.org.cn *.ujn.cn
        DocumentRoot /usr/share/apache2/error
        RewriteEngine On
        RewriteCond %{HTTP_HOST} (.*)\.ujn(6*)\.(edu\.cn|org\.cn|cn)
        RewriteRule ^/(.*) http://%{HTTP_HOST}/$1 [P,L]
        ErrorLog /var/log/apache2/error.log
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
        ServerSignature Off
</VirtualHost>

这个文件是配置反向代理的关键,ServerName 指定的是该服务器的名字,可以部署多台,然后分别命名 webgate1、webgate2、webgate3 … 即可。

ServerAlias 是指定该服务器的别名,也就是我们要代理的站点的名字,为了方便,这里使用了通配符。这样做,以后增加站点时就不需要再修改该配置文件了。

RewriteEngine On 是打开 URL 重写引擎。

RewriteCond 是进行 URL 重写的条件,这里的条件是要访问的主机名与我们代理的主机名匹配。为了便于以后增加站点不需要修改配置文件,这里匹配的主机名也用了批量匹配的方式。

RewriteRule 是把允许代理的请求强制作为代理请求发送,并立即中断重写处理。

到这一步,apache2 就配置完了。剩下的就是关于 DNS 的配置了。

首先给你的 apache2 反向代理在你所管理的 DNS 服务器上配置好它的域名,例如本例中就可以将它配置为 webgate.ujn.edu.cn,这里,可以将多个反向代理服务器配置为这同一个 webgate.ujn.edu.cn 域名,这样便可以由 DNS 来实现负载均衡。

然后,将你要代理的站点的域名在你所管理的 DNS 服务器上配置为指向 webgate.ujn.edu.cn 的别名,这样所有的请求就会都发送到 webgate.ujn.edu.cn 服务器上了。

在 webgate.ujn.edu.cn 上(也就是运行 apache2 的反向代理服务器上),不要设置任何域名服务器,也就是把 /etc/resolv.conf 和 /etc/network/interfaces 中关于域名服务器的设置项删除或者注释掉。

最后修改 /etc/hosts 文件,将你要代理的站点的域名和它的真实地址写到这个文件中,例如:

192.168.1.1    gatetest.ujn.edu.cn     gatetest.ujn6.edu.cn    gatetest.ujn.org.cn     gatetest.ujn.cn

hosts 文件中,一个 IP 可以对应多个域名,都写在一行当中,用空格和 tab 分割即可。但是不可以多个 IP 对应同一个域名,否则只有最开始的那个 IP 跟域名对应关系有效。

也就是说 hosts 文件不支持这种基于域名的负载均衡。

» 阅读全文

经过 21 个月的开发,Debian GNU/Linux version 4.0 —— etch 终于发布了,它支持多达 11 款处理器架构,内置KDE,GNOME 和 Xfce 桌面环境,并提供加密软件和对 FHS v2.3 的支持。

» 阅读全文

上个月在 Debian Sarge 上架设了学校的邮件服务器,并写了一篇 Debian Sarge 邮件系统配置全攻略,虽然用 Debian Sarge 架设的邮件服务器非常稳定,但是有一点总会让人感觉上不爽,那就是软件都比较过时。昨天无意中从 Mono 项目的网站上发现了 Debian Backports 这个宝藏,有了它,我们在 Sarge 上也可以使用最新版本的软件了。正好前天何老大发布了 Extman 0.2.0 正式版,今天又发布了 Extmail 1.0.1 正式版,于是打算一起将整个系统升级到最新版本。在升级的过程中,当然遇到了许多小小的挫折,不过,最后终于都解决了。下面就是升级过程的总结。

» 阅读全文

1月
15

对付 MySQL 的死连接

最近几天,学校的 MySQL 数据库总是出现许多死连接的情况,主要表现为有过多的 Sleep 连接,并且 Time 时间很长,占满了所有的可用连接数,以至于其它用户无法再连接数据库。我开始考虑调节 MySQL 数据库参数,但是改了许多参数仍然没有解决这个问题。于是想了一个比较狠的办法,写一个 php 脚本,每 2 分钟执行一次,发现死连接(超过 120 秒)就 Kill 掉,这样再也不会让某些程序搞死数据库服务器了,下面是 Kill 死连接的小程序:

kill-mysql-sleep-proc.php
<?php
define('MAX_SLEEP_TIME', 120);
 
$hostname = "localhost";
$username = "root";
$password = "password";
 
$connect = mysql_connect($hostname, $username, $password);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
    
if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
        @
mysql_query("KILL " . $proc["Id"], $connect);
    
}
}
mysql_close($connect);
?>

将它当中的 $password 改成你实际的数据库密码,死连接的时间也可以修改。然后加入计划任务就可以了。比如用 crontab -e 命令加入:

*/2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php

就可以每隔 2 分钟检查并清除一次数据库中的死连接了。

» 阅读全文