这个东西确实挺容易让我们迷糊。其实也不难,只要你掌握这样一条规律即可:
首先举个例子:
Order deny,allow
deny from all
allow from 127.0.0.1我们判断的依据是这样的:
1. 看Order后面的,哪个在前,哪个在后
2. 如果deny在前,那么就需要看deny from 这句,然后看allow from 这一句
3. 规则是一条一条的匹配的,不管是deny在前还是allow在前,都是会生效的。比如例子中,先deny 了所有,然后又allow了127.0.0.1,所以127.0.0.1是通过的。
不妨再多举几个例子:
Order allow,deny
deny from all
allow from 127.0.0.1这个就会deny所有了,127.0.0.1也会被deny。因为顺序是先allow然后deny,虽然一开始allow了127.0.0.1,但是后面又拒绝了它。
Order allow,deny
deny from all全部都不能通行
Order deny,allow
deny from all全部都不能通行
Order deny,allow全部都可以通行(默认的),记住即可
Order allow,deny全部都不能通行(默认的),记住即可
要使用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
问题,如题。怎么折腾都是一直访问第一个虚拟主机,后来找到问题所在。是我配置的不对。错误配置是这样的:
<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
找到: 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是否有相应的模块
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
网上说,可以使用 apachectl -V 或者 apachectl -l 查看相关的编译的模块看。但是很显然看到的结果根本不是我们想要的。那么如何看呢?
如果你还没有删除源码包的目录,那恭喜你你可以得到一个完美的答案。
cat apache源码包目录/config.log |head 就能看到你的编译参数了。
但,不幸的是你已经删除了目录或者已经make clean过,那么我只好想你说声抱歉,你得不到你想要的东东啦。 的确,就像是你看到大街上有一个非常漂亮的美女,但是却不是你的一样。这样形容可能不太恰当,那倒不如说,你想你是国家主席,那肯定是不可能的。是不是,节哀顺便吧!
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的扩展工具 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
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 模式。
<VirtualHost *:80>
ServerName sub1.domain.com
ServerAlias sub2.domain.com
DocumentRoot /var/www/sub/
# other settings
</VirtualHost>
在httpd.conf 中有一个参数是控制apache的默认编码的,AddDefaultCharset 它的作用就是当开发者没有指定程序的编码时,apache会按照这里的配置来显示效果。一般这个参数是不需要的,因为很少有程序不指定编码。为了引起不必要的麻烦,建议开启这个编码的童鞋去掉吧。
在编译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
mysql> GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD ON *.* TO 'repl'@' 172.16.140.108' IDENTIFIED BY 'bbsrep';
本帖最后由 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);
}
?>
只需在my.cnf中的[mysqld]字段中加入一行
bind-addr = 1.1.1.1
- «
- 1
- ...
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- ...
- 63
- »