apache升级到了nginx的几个注意点

最近把整站从apache升级到了nginx,客户的站点大概有30台服务器大部分架构位tomcat+apache,只有一个php页面
一下是我升级遇到的几个问题的注意点

1.
当我们去访问服务器上的一个目录时候,他不会自动加上一个/ ,浏览器会给出改页无法打开的错误,这个时候浏览器去取的地址实际上是upstream中所写的地址和端口或如果没有使用upstream时 当使用localhost做servername时候 浏览器会去访问http://127.0.0.1/dir
解决办法
在每个虚拟主机的server定义中加上
if (-d $request_filename) {
                           rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
                }
注意 root字段的定义也一定要出现在server中 如果server中没有定义root 错误还将存在
例子:
server {
                listen                800;
                server_name www.1.com;
                root   /opt/1-index;   //这边定义了 就会在目录访问的时候加上/  如果这边没有定义这个 上面的url重写依然不会生效
                include                vhost/alias.conf;
                include                vhost/proxy.conf;
                if (-d $request_filename) {
                           rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
                }
                error_page   405 =200 @405;
                location @405 {
                proxy_pass      http://PROXY_STATIC;
                }
                location / {
                        root   /opt/1-index;        //只在这边定义是没有用的,这边甚至可以不做定义
                        rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
                        index  index.html index.htm;
                }                       

2.url重写的注意事项:
原有的url支持正则  重写的url不支持正则
rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
这个重写中 ^/(\d+)\.home$ 这部分支持正则
而/index.html?userId=$1
不要用正则 也不匹配正则 /index.html?*userId=$1 这样他就会去找.html?*userId=$1这个url 然后给你个404 not found

3.post方式去访问静态文件
Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。(但是之前程序在apache上跑 没问题)
如果有这个需求呢 就要做如下配置了
error_page   405 =200 @405;
                location @405 {
                proxy_pass      http://PROXY_STATIC;
        #        root /usr/local/nginx/html;
                }
把所有405错误重定向成200 然后吧所有405错误的请求全部交给一个代理去执行
或者写上本地路径,因为我的路径比较多 所以重定向请求到一台web服务器上了

4.。关于防盗链
1.com的需求是 不是从本来来的请求给除一个403
因为在虚拟主机里配置毫无作用 可能是我们用的是虚拟目录的缘故
所以我们直接对目录做的防盗链
在alias里
别名配置
                location /res/ {
                alias   /opt/Src/;
                valid_referers none blocked server_names *.1.com ;
                if ($invalid_referer) {
        return 403;
                }
        }

5,关于动态请求转发
location  ~ ^/login/(.*\.do)$ {
                proxy_pass      http://login ;
        proxy_set_header  X-Real-IP  $remote_addr;
}
~ ^/login/(.*\.do)$ 这个表示 凡是匹配/login/ 下 .do的都转发到一个upstream池里处理 这里的$符号并不起多大作用 只要是有.do的他会全部转 并不是以.do结尾的才转

6.关于php上传文件大小的问题
只改php里的配置是没有用的
需要更改的地方还有nginx的配置

client_max_body_size 10M;
他的默认值是1M;

以上就是基本的注意点

貌似那个不自动给子目录加/的问题好像可以用两个参数解决啊

optimize_server_names off;#优化服务器名称:关
server_name_in_redirect off;#服务器名称重定向:关

用最小化方式安装FreeBSD主图解教程

本文作者:爱洞特漏 出自FAMP官方网站:www.aidong.org,转载请注明,谢谢!

查看本文前请先登陆,否则看不到图片的哦!

1、在BIOS中设定以光盘启动,插入FreeBSD7.0的第一个光盘(最小化安装只需要第一个),启动服务器,出现以上画面后直接回车确定(也可以不按,十秒过后会自动默认启动);

2、选择所在国家,如以下画面,用向方向键选择China(中国),然后回车;

3、选择键盘布局,我们一般用USA ISO键盘布局(即美国标准键盘布局),直接回车;

4、当出现上面的画面的时候,我们选择“标准的引导式安装”(我自己取的名字,即引导你一步一步安装好);

5、告诉你要用fdisk来划分硬盘啦!直接回车;

6、Fdisk的画分硬盘界面,如果是新硬盘,便会出现上面的情况,如果您的硬盘里有装别的系统,情况会不一样哦!如果确定数据不重要,按D键全部删掉, 直到变成跟这个画面一样(如果有重要数据可千万别这样做啊!我的天...)。然后直接按A(把整个硬盘都给FreeBSD用);

7、操作完后,会出现以上画面,再按Q(完成);

8、这里问您是否安装引导管理程序,由于我们用作服务器,所以不需要安装(我们不需要那选择进哪个系统的菜单,因为我们一个硬盘只有一个系统),我们选择第二个——标准的MBR,没有引导管理程序(如图所示),然后回车;

9、您是不是要创建BSD分区啦?当然,直接回车;

10、这是FreeBSD的分区画面,中第6点讲的“划分硬盘不同”,划分硬盘是把一个硬盘分成几块,一块给FreeBSD用(我们刚才把整块硬盘全给了 FreeBSD用),一块给Windows用,一块给Linux用...而这个是把已经划分给FreeBSD的“块”再分区。如果你在试着玩,可以直接按 A(自动分区),然后按Q(完成);如果是用于构建服务器用,请先看看我的建议分区方式(FreeBSD分区建议——如果您准备用FAMP来搭建服务器环 境),操作方法如下:

a:按C后出现以上画面,问我们要分多大,我们输入“512M”(不含引号);如下图所示:

b:问我们是创建swap分区(虚拟分区)呢?还是创建文件系统,我们第一个创建的分区是根分区“/”,所以选择FS(文件系统)。也就是直接回车便可; Continue reading

Freebsd6.2 使用cvsup升级ports和src

1.安装cvsup
第一种方法:
# cd /usr/ports/net/cvsup-without-gui
# make install clean
等待安装完成

第二种方法:
光盘安装:放入6.2-RELEASE-i386-disc2.iso
# sysinstall
【Configure】 -> 【Packages】 -> 【CD/DVD】 -> 【devel】
选中 [X] cvsup-without-gui-16.1h_2
再选择【OK】,返回到上一界面,选择【Install】,等待安装完成。

安装完CVSUP后 默认是装在了/usr/local/bin 下的 cvsup,将它连接到 /usr/bin下
# ln -f /usr/local/bin/cvsup /usr/bin/cvsup

2. 更新
# cd /usr/share/examples/cvsup
# ls
cvs-supfile                 # 升级CVSUP自身的
doc-supfile                # 操作系统文档升级文件
gnats-supfile             # FreeBSD BUG数据库
ports-supfile              # Ports升级档
stable-supfile             # 稳定版的FreeBSD升级
standard-supfile        # 最新版的FreeBSD升级

2.1 对ports进行升级,配置ports-supfile文件

# ee ports-supfile

更改一下部分:
*default host=CHANGE_THIS.FreeBSD.org #CVS服务器
*default base=/usr                   # cvsup接收文件的存放目录
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix

ports-all
# 更新全部Ports,这个要注意一下,默认值就是它,将会更新全部Ports,
# 若只需要更新某个Ports目录,在前面加#,将它注释掉
# 将ports-all 注释后,将后面需要更新的目录前面的#去掉,这样就是单个更新
#ports-accessibility
#ports-arabic
#ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
#ports-biology
#ports-cad
#ports-chin
#....
#ports-shells
#ports-sysutils
#ports-textproc
#ports-ukrainian
#ports-vietnamese
#ports-www
#ports-x11
#ports-x11-clocks
#ports-x11-fm
#ports-x11-fonts
#ports-x11-servers
#ports-x11-toolkits
#ports-x11-wm

修改完supfile后 保存.
执行
# cvsup -g -L 2 ports-supfile

2.2 对src进行更新,更改stable-supfile(服务器选择稳定版本比较好)
# ee stable-supfile
方法同ports的更新

3. CVS服务器列表(这里只列举中国大陆地区的)
中国大陆
cvsup.cn.FreeBSD.org
cvsup2.cn.FreeBSD.org
cvsup3.cn.FreeBSD.org
cvsup4.cn.FreeBSD.org
cvsup5.cn.FreeBSD.org

选择CVS服务器的时候, 最好使用如:
ping cvsup.cn.FreeBSD.org 来查看一下,相对于你, 哪个服务器更快一些, 这样可以加快更新的速度,节省时间。

Good luck!!!

http://hi.baidu.com/zhulinywj/blog/item/4a9411d161c4403b9a502705.html

php中传值与引用的区别?

函数

函数参数传递的方式有两种:
1
、传值方式。缺省情况下,函数参数通过传值的方式传递,因此即使在函数内部改变参数的值,它并不会改变函数外部参数的值。
2、传址方式。传址时只需在函数调用时在参数的前面加上“&”号即可。将函数外部的值的内存地址传递给内部的参数,在函数内部的所有操作都会改变函数外部参数的值。所以希望函数修改外部参数的值,必须使用传址传址方式。

  1. <?php
  2. //定义一个函数
  3. function f3($a){
  4. $a++;
  5. }
  6. $x=1;
  7. f3($x);
  8. echo "x=$x";//传值方式调用函数
  9. $x=1;
  10. f3(&$x);
  11. echo "x=$x";//传址方式调用函数
  12. ?>
  13. <?php
  14. function add_some_extra(&$string)
  15. {
  16. $string .= 'and something extra.';
  17. }
  18. $str = 'This is a string, ';
  19. add_some_extra($str);
  20. echo $str; // 输出'This is a string, and something extra.'
  21. ?>

  1. <?php
  2. /* 在PHP中,函数不需要在被调用之前定义,在调用后才进行定义也是允许的。
  3. 在少数情况下,函数在需要一定的判断条件下,才能被定义。这样函数的定义必须在函数被调用之前完成。 */
  4. $makefoo = true;
  5. bar(); /*你不能调用foo()函数,它在这里不存在。但是能够调用bar(),调用之后在后面进行定义即可。*/
  6. if ($makefoo) {
  7. function foo()
  8. {
  9. echo "foofoo";
  10. }
  11. }
  12. if ($makefoo) foo(); /* 现在我们可以正常调用foo(),因为只有$makefoo为true和定义了foo()函数后,foo()函数才存在。 */
  13. function bar()
  14. {
  15. echo "barbar";
  16. }
  17. ?>
  18. <?php
  19. function foo()
  20. {
  21. function bar()
  22. {
  23. echo "I don't exist until foo() is called. ";
  24. }
  25. }
  26. /* 这里不能调用bar(),因为它不存在。 */
  27. foo();
  28. /* 现在我们可以调用bar(),只有在调用foo()后,bar()才存在。 */
  29. bar();
  30. ?>

为函数指定默认参数的值

  1. <?php
  2. function test_defaultargs($arg="default value"){
  3. echo "参数值为:".$arg."<br>";
  4. }
  5. test_defaultargs();
  6. test_defaultargs("new value");
  7. ?>
  8. <?php
  9. function makecoffee($type = "cappuccino")
  10. {
  11. return "Making a cup of $type. ";
  12. }
  13. echo makecoffee();
  14. echo makecoffee("espresso");
  15. ?>

请注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,可能函数将不会按照预期的情况运行。

  1. <?php
  2. function makeyogurt($type = "acidophilus", $flavour)
  3. {
  4. return "Making a bowl of $type $flavour. ";
  5. }
  6. echo makeyogurt("raspberry"); // 这个例子将不会按照我们预期的情况运行。
  7. ?>
  8. <?php
  9. function makeyogurt($flavour, $type = "acidophilus")
  10. {
  11. return "Making a bowl of $type $flavour. ";
  12. }
  13. echo makeyogurt("raspberry"); // 这个例子的输出是:Making a bowl of acidophilus raspberry.
  14. ?>

函数名可变

  1. <?php
  2. function f1(){
  3. echo "这是函数f1()。<br>";
  4. }
  5. function f2(){
  6. echo "这是函数f2()。<br>";
  7. }
  8. $var1="f1";
  9. $var1(); //调用函数f1()
  10. $var1="f2";
  11. $var1(); //调用函数f2()
  12. //注意:调用可变函数名需要在变量前加$。
  13. ?>
  14. <?php
  15. function foo() {
  16. echo "foofoo.<br>";
  17. }
  18. function bar($arg = '') {
  19. echo "barbar'$arg'.<br>";
  20. }
  21. function echoit($string)
  22. {
  23. echo $string;
  24. }
  25. $func = 'foo';
  26. $func(); // 调用foo()
  27. $func = 'bar';
  28. $func('test'); // 调用bar()
  29. $func = 'echoit';
  30. $func('test'); // 调用echoit()
  31. ?>

函数可变长度参数

  1. <?php
  2. //向函数传递数组
  3. function takes_array($input)
  4. {
  5. echo "$input[0] + $input[1] = ", $input[0]+$input[1];
  6. }
  7. ?>

func_num_args() -- 返回传递给函数的参数的数量

  1. <?php
  2. function foo()
  3. {
  4. $numargs = func_num_args();
  5. echo "Number of arguments: $numargs .'<br>'";
  6. }
  7. foo(1, 2, 3);
  8. ?>

func_get_arg() -- 从参数列表中返回一个参数值

  1. <?php
  2. function foo()
  3. {
  4. $numargs = func_num_args();
  5. echo "Number of arguments: $numargs .'<br>'";
  6. if ($numargs >= 2) {
  7. echo "Second argument is: " . func_get_arg(1) ."<br>";
  8. }
  9. }
  10. foo (1, 2, 3);
  11. ?>

func_get_args() -- 返回一个包含函数参数的数组

  1. <?php
  2. function foo()
  3. {
  4. $numargs = func_num_args();
  5. echo "Number of arguments: $numargs .'<br>'";
  6. if ($numargs >= 2) {
  7. echo "Second argument is: " . func_get_arg(1) . "<br>";
  8. }
  9. $arg_list = func_get_args();
  10. for ($i = 0; $i < $numargs; $i++) {
  11. echo "Argument $i is: " . $arg_list[$i] . "<br>";
  12. }
  13. }
  14. foo(1, 2, 3);
  15. ?>

一段指定时间后隐藏层的js代码

法一:
//指定时间隐藏层
function hiddenDiv(layer, sec){
 if(sec < 1) sec = 3;
 sec = (sec<1 ? 3 : sec) * 1000;
 setTimeout("document.getElementById('" + layer + "').style.display = 'none';", sec);
}

 

法二:
function hideDiv(id){
 document.getElementById(id).style.display = "none";
}

function delayedHide(id, time){
 var fn = function(){
  hideDiv.apply(this, [id]); 
 }
 setTimeout(fn, time);
}

delayedHide("mydiv", 2000);

第二种方法没有试验过,不知能否成功,大家不仿参考一下

FreeBSD下安装mysql基本步骤

cd /usr/ports/databases/mysql51-server
make WITH_XCHARSET=all WITH_CHARSET=utf8 WITH_PROC_SCOPE_PTH=yes SKIP_DNS_CHECK=yes BUILD_OPTIMIZED=yes install clean

FreeBSD下安装mysql基本步骤

/usr/local/bin/mysql_install_db
chown -R mysql:mysql /var/db/mysql

ee /etc/rc.conf
mysql_enable="YES"

cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf
ee /etc/my.cnf

# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
后面加入:

bind-address = 127.0.0.1
max_connections = 1000
max_user_connections = 1000

/usr/local/etc/rc.d/mysql-server start

/usr/local/bin/mysqladmin -u root password '123456'

配置线程库为libthr.so:
ee /etc/libmap.conf
加入
[mysqld]
libpthread.so.2 libthr.so.2
libpthread.so libthr.so

最新的没时间实验了,回家过年了

http://bbs.bsdlover.cn/thread-2218-1-1.html

apache apx 添加模块[基本语法]

Apache安装完成后,添加mod_proxy模块
作者:wind | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://60.190.88.90/ljf/2008/05/apachemod-proxy.html
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用LoadModule指令在运行时加载到Apache服务器中。

1. 进入apache源代码的modules目录

2. 运行如下命令自动编译、安装和修改httpd.conf文件,激活mod_proxy模块:

apache path/bin/apxs -c -i -a mod_proxy.c proxy_util.c

选项说明:
-c 执行编译操作
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#)
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块

3. 重启apache。

如何向已经安装好的apache添加一个模块

以前一直有这样的需求,是说apache缺少我需要的模块,可是如何在不影响现有程序的基础上,直接添加一个loadModule呢,但是模块文件从哪里来?从另外一个系统复制一份过来是否可行?虽然只是一个 foo.so 文件,放到module文件夹就可以了,但我还是查了一下资料,找到合适的方法,并且尝试过了。

这个是原文

引用
apache 添加 mod_rewrite 模块

我使用的是httpd 2.0.55 注意配置httpd.conf 时 是 rewrite_module 而不是 mod_rewrite

1、Apache安装rewrite模块的时候需要DBM支持,否则无法编译。使用rpm -qa gdbm 查询,如果没有,需要先下载并安装gdbm:
下载地址:ftp://ftp.gnu.org/gnu/gdbm/

安装步骤:
./configure
make
make install
make install-compat (如果不执行此步,无法编译出ndbm.h头文件)

2、安装
#cd /root/src/httpd-2.0.55/modules/mappers
#/usr/local/apache/bin/apxs -c mod_rewrite.c
#gcc -shared -o mod_rewrite.so mod_rewrite.o -lgdbm
#/usr/local/apache/bin/apxs -i -A -n mod_rewrite mod_rewrite.so

/usr/local/apache/bin/ 是我正在使用的apahce的目录

3、配置httpd.conf
加入 LoadModule rewrite_module modules/mod_rewrite.so

注意是 rewrite_module 而不是 mod_rewrite

过程其实很容易理解:
1 在httpd的源文件里面找到 foo.c
2 运行程序编译出 foo.so
3 在httpd.conf添加进来

这里面要注意的两点:
1 foo.c是按功能放置在modules目录的,自己找到相应目录
2 loadModule命令默认是注释的,要去掉后还要改一下名称

下面是尝试expires功能的添加:

cd modules/metadata/
(expires属于metadata功能部分的)
/Data/apps/apache/bin/apxs -c mod_expires.c
gcc -shared -o mod_expires.so mod_expires.o -lgdbm
/Data/apps/apache/bin/apxs -i -A -n mod_expires mod_expires.so

编辑httpd.conf文件
LoadModule expires_module modules/mod_expires.so

然后测试一下:

引用
[root@localhost apache]# ./bin/apachectl -t
Syntax OK
[root@localhost apache]# ./bin/apachectl graceful

这个模块很实用,可以给你带来带宽的节省
比如如下配置:

   <IfModule mod_expires.c>
       ExpiresActive On
       ExpiresDefault "access plus 6 hours"
       ExpiresByType text/html "access plus 0 hours"
   </IfModule>

启用expires,默认缓存6小时,但不缓存 text/html
也就是访问阿权的网页
http://www.aslibra.com/blog/read.php?132 不会缓存网页
http://www.aslibra.com/blog/up/1158240093.jpg 缓存图片和脚本等

意思就是这样了

添加mod_rewrite.c模块

/etc/apache2/httpd.conf

加入

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

如果你的服务器apache还没有安装,那很简单,在编译apache时将mod_rewrite模块编译进去就可以,相关文档可以在 www.gbunix.com中找到。如果你的apache已经安装好了,现在只想编译出mod_rewrite.so模块,在apache中进行加载,下面我们就介绍这个方法。

以Solaris操作系统进行举例:

Ruby代码
  1. # PATH=/usr/local/bin:/usr/sfw/bin:/usr/ccs/bin:$PATH   
  2. # export PATH   
  3. # which gcc   
  4. # which make   
  5.   
  6. # find ./ -name mod_rewrite.c //在apache的安装目录中寻找mod_rewrite.c文件   
  7. # cd PATH/to/mod_rewrite.c //进入包含mod_rewrite.c文件的目录   
  8. # apxs -c mod_rewrite.c //apxs请指定绝对路径,在你当前正在使用apache的bin目录里   
  9. # apxs -i -a -n mod_rewrite mod_rewrite.c   
  10.   
  11.   
  12. [color=indigo]以下是加GeoIP模块的install方法。借鉴:[/color]   
  13. To build mod_geoip as a dynamically loadable module:   
  14.   
  15. apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c   
  16.   
  17. -I/usr/local/include is where the GeoIP.h header file is installed   
  18. -L/usr/local/lib is where the libGeoIP library is located   
  19.   
  20. This will put the correct LoadModule statement.  

如果没有什么错误的话,应该在你的apache的modules目录中编译出一个mod_rewrite.so文件。

编辑httpd.conf文件,确认httpd.conf中已经包含mod_rewrite.so的加载语句,如下:

LoadModule rewrite_module modules/mod_rewrite.s

怎么才能向一个已安装的程序里面添加模块?

前提:你的apache是支持dso模式的,否则只能重新完全编译:
方法1:
安装一份全新全新的完全相同版本的apache到另外一个目录,记得打开你需要的模块,然后把安装之后的模板拷贝或者调用到现在的。

方法2:
apxs方法,这个很简单:http://w.yi.org/ftp/FAPM/apache/Apache2/zh/programs/apxs.html
apxs - APache扩展工具
apxs是一个为Apache超文本传输协议(HTTP)服务器编译安装扩展模块的工具, 用于编译一个或多个源程序或目标代码文件为动态共享对象, 使之可以用mod_so中的LoadModule指令 在运行时刻加载到Apache服务器中。

因此,要使用这个扩展机制,你的平台必须支持DSO特性, 而且Apache的httpd必须内建了mod_so模块。 apxs工具能自动探测是否具备这样的条件,你也可以自己用这个命令手动探测

$ httpd -l

该命令的输出列表中应该有mod_so模块。 如果所有这些条件均已具备, 则可以很容易地借助apxs安装你自己的DSO模块以扩展Apache服务器的功能:

Ruby代码 复制代码
  1.   
  2. $ apxs -i -a -c mod_foo.c   
  3. gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c   
  4. ld -Bshareable -o mod_foo.so mod_foo.o   
  5. cp mod_foo.so /path/to/apache/modules/mod_foo.so   
  6. chmod 755 /path/to/apache/modules/mod_foo.so   
  7. [activating module `foo' in /path/to/apache/etc/httpd.conf]   
  8. $ apachectl restart   
  9. /path/to/apache/sbin/apachectl restart: httpd not running, trying to start   
  10. [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module   
  11. /path/to/apache/sbin/apachectl restart: httpd started   
  12. $ _  

其中的参数files可以是任何C源程序文件(.c)或者目标代码文件(.o),甚至是一个库(.a)。 apxs工具会根据其后缀自动编译C源程序,或连接目标代码和库。 但是,使用预编译的目标代码时,必须保证它们是独立地址代码(position independent code [PIC]), 使之能被动态地加载。如果使用GCC编译,则应该使用-fpic参数;如果使用其他C编译器,则应该查阅其手册,为apxs寻找相应的编译参数。

有关Apache对DSO的支持的详细信息,可以阅读mod_so的文档, 或者直接阅读源程序src/modules/standard/mod_so.c。

apache安装完成后,如何添加模块

    apache安装后,如果想再添加模块,往往不想重新安装一次,再者,我在安装中发现,并不是安装文件中所有的modules都会被默认安装,即使在安装中使用了 ./configure --prefix=/usr/local/apache --enable-so --enable-modules=all --enable-mods-shared=all也是如此。我使用上述方法安装的apache2.2.6就没有安装proxy相关模块。这时,需要手工生成so文件,但会自动的被复制到你的apache安装目录的modules中,然后修改apache的配置文件,加载相关模块,验证apache配置并重启服务即可。以上描述的具体操作步骤如下:

操作系统:linux redhat 4.5 ES
apache版本:2.2.6 可自行下载tar包
 

1. 拷贝安装包到/usr/local,并在目标目录下进行解压。
[root@localhost local]# cd /usr/local
[root@localhost local]# tar -zxvf httpd-2.2.4.tar.gz
2. 配置安装参数,安装的目标目录为/usr/local/apache,建议设置enable-mods-shared=all,不用的module注释掉就行了!
[root@localhost local]# cd httpd-2.2.4
[root@localhost httpd-2.2.4]# ./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared=all
3. 编译并安装。
[root@localhost httpd-2.2.4]# make
[root@localhost httpd-2.2.4]# make install
4. 启动Apache,并测试。
[root@localhost httpd-2.2.4]# cd /usr/local/apache/bin
[root@localhost bin]# ./apachectl start

打开浏览器,并在地址栏中输入主机的IP地址
http://Localhost/
如果出现以下画面则说明安装成功。
It works!

 注意:安装完成后检查系统服务中的HTTPD服务是否已经启动,如果启动需要先停止。

5. 编译mod_proxy.so.
[root@localhost httpd-2.2.4]# cd modules
[root@localhost modules]# /usr/local/apache/bin/apxs -c -i mod_proxy.c proxy_util.c
这时生成的mod_proxy.so会被自动复制到/usr/local/apache/modules
6. 修改配置文件
[root@localhost modules]# cd /usr/local/apache/conf
[root@localhost conf]# vi httpd.conf
添加一行  LoadModule proxy_module modules/mod_proxy.so
7. 测试配置是否正确
[root@localhost conf]# cd ..
[root@localhost apache]# cd bin
[root@localhost bin]# ./apachectl configtest
出现如下信息证明配置正确
[Fri Nov 23 15:45:55 2007] [warn] module rewrite_module is already loaded, skipping
Syntax OK
8. 重新启动apache
[root@localhost bin]# ./apachectl stop
[root@localhost bin]# ./apachectl start
完成!!