apache 代理模块 proxy应用

要使用proxy功能,首先编译apache的时候,需要加上参数 --enable-proxy --enable-proxy-http
如果,不想重新编译,也可以以扩展的形式安装proxy模块,具体请参考 http://mylinux.5d6d.com/thread-939-1-1.html

具体配置为:<VirtualHost *:80>
    ServerName www.test.com
    CustomLog "/dev/null" combined
   ProxyRequests Off
        <Proxy *>
        Order deny,allow
        Allow from all
        </Proxy>
    ProxyPass / http://www.test.com/
     ProxyPassReverse / 192.168.13.111/
</VirtualHost>
另外需要注意的是,需要在/etc/hosts 中加一条记录  
192.168.13.111  www.test.com

apache的proxy代理总访问后端web的第一个虚拟主机

问题,如题。怎么折腾都是一直访问第一个虚拟主机,后来找到问题所在。是我配置的不对。错误配置是这样的:<VirtualHost *>

    ServerName www.test.com

    CustomLog "/dev/null" combined

   ProxyRequests Off

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

    ProxyPass / http://192.168.13.111/

     ProxyPassReverse / 192.168.13.111/

</VirtualHost>
问题出在了:  ProxyPass / http://192.168.13.111/
要改成这样:  ProxyPass / http://www.test.com/

所以正确的配置是这样的:<VirtualHost *>

    ServerName www.test.com

    CustomLog "/dev/null" combined

   ProxyRequests Off

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

    ProxyPass / http://www.test.com/

     ProxyPassReverse / 192.168.13.111/

</VirtualHost>
另外需要注意的是,需要在/etc/hosts 中加一条记录  
192.168.13.111  www.test.com

使apache的日志文件里不记录图片文件

找到: 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
  再后面加上图片文件的类型
  SetEnvIf Request_URI \.gif$ gif-image
  SetEnvIf Request_URI \.GIF$ gif-image
  SetEnvIf Request_URI \.jpg$ gif-image
  SetEnvIf Request_URI \.JPG$ gif-image
  SetEnvIf Request_URI \.png$ gif-image
  SetEnvIf Request_URI \.js$ gif-image
  SetEnvIf Request_URI \.bmp$ gif-image
  SetEnvIf Request_URI \.css$ gif-image
  SetEnvIf Request_URI \.mid$ gif-image
  SetEnvIf Request_URI \.swf$ gif-image
  SetEnvIf Request_URI \.mmf$ gif-image
  SetEnvIf Request_URI \.wma$ gif-image
  SetEnvIf Request_URI \.midi$ gif-image
  记日志时
  CustomLog /usr/local/apache/logs/access.log combined env=!gif-image

apache的server status 功能

首先要查看,你的apache是否有相应的模块
ls  /usr/local/apache2/modules/mod_status.so
如果没有,请重新编译你的apache
加上 --enable-module=so , 然后再安装一下扩展模块 mod_status.so (http://mylinux.5d6d.com/thread-848-1-1.html)
如果你使用的是rpm包安装的apache,就无需做这一步了,因为rpm安装的是有该模块的。

接下来,就需要配置你的apache了。
vi  http.conf   增加:
LoadModule status_module      modules/mod_status.so

还需要增加:
ExtendedStatus On

<Location /Server-status>
SetHandler Server-status
Order deny,allow
Deny from all
Allow from 192.168.111.36
</Location>

为了安全期间,一定要做一个allow deny的规则。

重启apache就可以使用这个功能了,查看方法:
http://www.example.com/Server-status

apache 安装好后如何查看编译时的参数

网上说,可以使用 apachectl -V   或者 apachectl -l 查看相关的编译的模块看。但是很显然看到的结果根本不是我们想要的。那么如何看呢?
如果你还没有删除源码包的目录,那恭喜你你可以得到一个完美的答案。
cat   apache源码包目录/config.log  |head  就能看到你的编译参数了。
但,不幸的是你已经删除了目录或者已经make clean过,那么我只好想你说声抱歉,你得不到你想要的东东啦。 的确,就像是你看到大街上有一个非常漂亮的美女,但是却不是你的一样。这样形容可能不太恰当,那倒不如说,你想你是国家主席,那肯定是不可能的。是不是,节哀顺便吧!

apache 日志切割问题

apache的日志是可以自动切割的。
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined

也可以按小时
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined

方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

每小时
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined

再看apache rotatelogs语法

rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项

-l

使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。

logfile

它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。

rotationtime

日志文件滚动的以秒为单位的间隔时间。

offset

相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。

filesizeM

指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

apache的扩展模块安装

这个用到了apache的扩展工具  apxs
在使用这个功能之前,请先确认是否已经加载了 mod_so 模块,方法是:/usr/local/apache2/bin/httpd -l在列出的内容中,如果有 mod_so 那么说明已经加载了该模块。

下面,举个例子来演示一下,如何编译安装扩展模块,例如,我想增加  mod_status.so 这个模块/usr/local/apache2/bin/apxs  -i -a  -c  mod_status.c请注意,这里的mod_status.c 的路径一定要写对了,不然会报错,一般情况下,这个C文件在你的源码包下,比如:
/usr/local/src/httpd-2.0.59/modules/generators/mod_status.c  

编译的结果类似这样:
/usr/local/services/apache-2.0.59/build/libtool --silent --mode=compile gcc -prefer-pic  -DAP_HAVE_DESIGNATED_INITIALIZER -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/services/apache-2.0.59/include  -I/usr/local/services/apache-2.0.59/include   -I/usr/local/services/apache-2.0.59/include   -c -o /root/httpd-2.0.64/modules/generators/mod_status.lo /root/httpd-2.0.64/modules/generators/mod_status.c && touch /root/httpd-2.0.64/modules/generators/mod_status.slo
/usr/local/services/apache-2.0.59/build/libtool --silent --mode=link gcc -o /root/httpd-2.0.64/modules/generators/mod_status.la  -rpath /usr/local/services/apache-2.0.59/modules -module -avoid-version    /root/httpd-2.0.64/modules/generators/mod_status.lo
/usr/local/services/apache-2.0.59/build/instdso.sh SH_LIBTOOL='/usr/local/services/apache-2.0.59/build/libtool' /root/httpd-2.0.64/modules/generators/mod_status.la /usr/local/services/apache-2.0.59/modules
/usr/local/services/apache-2.0.59/build/libtool --mode=install cp /root/httpd-2.0.64/modules/generators/mod_status.la /usr/local/services/apache-2.0.59/modules/
cp /root/httpd-2.0.64/modules/generators/.libs/mod_status.so /usr/local/services/apache-2.0.59/modules/mod_status.so
cp /root/httpd-2.0.64/modules/generators/.libs/mod_status.lai /usr/local/services/apache-2.0.59/modules/mod_status.la
cp /root/httpd-2.0.64/modules/generators/.libs/mod_status.a /usr/local/services/apache-2.0.59/modules/mod_status.a
ranlib /usr/local/services/apache-2.0.59/modules/mod_status.a
chmod 644 /usr/local/services/apache-2.0.59/modules/mod_status.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/services/apache-2.0.59/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/services/apache-2.0.59/modules

完成后,请看提示 Libraries have been installed in:  模块就会安装到这里了。

参考:http://httpd.apache.org/docs/2.2/programs/apxs.html

server/mpm/worker/worker.c:1203: undefined reference to `ap_thread_stacksize'

apache编译,使用worker模式时,竟然出现这样的错误:
server/mpm/worker/.libs/libworker.a(worker.o): In function `child_main':
/usr/local/src/httpd-2.2.17/server/mpm/worker/worker.c:1203: undefined
reference to `ap_thread_stacksize'
collect2: ld returned 1 exit status
make[1]: *** [httpd] Error 1
make[1]: Leaving directory `/usr/local/src/httpd-2.2.17'
make: *** [all-recursive] Error 1

网上搜了一下,说是make clean  重新make 就行了。这难道是这源码的bug吗?
于是,我照做了,果真解决了!
后来,我分析了一下,可能是在我make 之前,已经编译过一次,而且当时是默认的,并没有指定那种模式,默认是prefork 模式吧。 反正我apachectl -l的时候看是 prefork 模式。

apache nameserver 两个如何设置

<VirtualHost *:80>
        ServerName sub1.domain.com
        ServerAlias sub2.domain.com
        DocumentRoot /var/www/sub/
        # other settings
</VirtualHost>

apache 的默认编码

在httpd.conf 中有一个参数是控制apache的默认编码的,AddDefaultCharset  它的作用就是当开发者没有指定程序的编码时,apache会按照这里的配置来显示效果。一般这个参数是不需要的,因为很少有程序不指定编码。为了引起不必要的麻烦,建议开启这个编码的童鞋去掉吧。

如何使用apache的 work模式还是 prefork 模式

在编译apache的时候,有一个参数叫做  
--with-mpm=...    等号后边用于指定那种模式,可选的有 beos|event|worker|prefork|mpmt_os2   其中,咱们都知道 prefork 以及 worker 其他模式就不晓得了,感兴趣不妨你去google一下。

当你编译时,不指定哪种模式,就是说,不加该参数,那么默认apache会以prefork模式来为我们提供服务。不信,你编译试试看
./configure --prefix=/usr/local/apache2  
验证的话,就是用  apachectl -l  看看是否有
prefork.c

而,如果你想要worker模式,那么请指定吧   ./configure --prefix=/usr/local/apache2   --with-mpm=worker
apachectl -l 看,有
worker.c 而没有 prefork.c

在从的数据库上使用Load data from master的权限赋予

mysql> GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD ON *.* TO 'repl'@' 172.16.140.108' IDENTIFIED BY 'bbsrep';

检测mysql主从是否同步的脚本内容

本帖最后由 andy 于 2009-11-18 09:45 编辑

#!/usr/local/php/bin/php
<?php
$master = mysql_connect('192.168.111.36', 'discuz', 'mysqlpaswd');
$slave['35'] = mysql_connect('192.168.111.35', 'discuz', 'mysqlpaswd');
$slave['28'] = mysql_connect('192.168.111.28', 'discuz', 'mysqlpaswd');


while(1) {
        $members_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_members", $master), 0);
        $threads_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_threads", $master), 0);
        $posts_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_posts", $master), 0);
        echo "\r\n";
        echo "\033[05;32mShou\033[0m \033[01;031mshou\033[0m";
        echo "\r\n".date("Y-m-d H:i:s");
        echo "\r\n"."host      members      threads      posts"."\r\n";
        echo "master    ".$members_master."      ".$threads_master."      ".$posts_master."\r\n";

        foreach($slave as $k=>$v){
                $slave_members_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_members", $v), 0);
                $slave_threads_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_threads", $v), 0);
                $slave_posts_master = mysql_result(mysql_query("SELECT COUNT(*) FROM discuz.cdb_posts", $v), 0);
                echo $k."        ".
                        $slave_members_master.($slave_members_master==$members_master?" ":"*")."     ".
                        $slave_threads_master.($slave_threads_master==$threads_master?" ":"*")."     ".
                        $slave_posts_master.($slave_posts_master==$posts_master?" ":"*")."\r\n";
        }
        sleep(2);
}


?>

mysql 在指定IP上启动端口

只需在my.cnf中的[mysqld]字段中加入一行
bind-addr       = 1.1.1.1

MySQL的MyISAM和InnoDB对比及优化

本帖最后由 andy 于 2009-11-17 09:58 编辑

MyISAM和InnoDB是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

MyISAM是ISAM表的新版本,有如下扩展:
1、二进制层次的可移植性。
2、NULL列索引。
3、对变长行比ISAM表有更少的碎片。
4、支持大文件。
5、更好的索引压缩。
6、更好的键码统计分布。
7、更好和更快的auto_increment处理。

InnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。
InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。
InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

以下是一些细节和具体实现的差别:

1、InnoDB不支持FULLTEXT类型的索引。
2、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5、LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
6、InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

MyISAM和InnoDB优化:
key_buffer_size - 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 -- 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。
innodb_buffer_pool_size - 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 -- 如果你的数据量不大,并且不会暴增,那么无需把
innodb_additional_pool_size - 这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。
innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。
innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 -- 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。
innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置为 0 就快很多了,不过也相对不安全了 -- MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。
table_cache -- 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。
thread_cache -- 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。
query_cache -- 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。
sort_buffer_size --如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。