/ 中存储网

Nginx与Apache整合配置过程记录

2013-12-13 16:04:01 来源:IT技术网

nginx监听80端口,将部分请求转发给8980端口的apache. 由于网络上各种捧NGINX的文章.这也导致我认为选择NGINX才是一件很流行的事情.

所以连续几年,一直用着NGINX从 0.6X一直到现在.自己坚持的理由很多..

网络上的各种诱惑(静态并发更高,更能强大的反向代理服务器)

配置文件更简洁

更节约资源(在小内存的VPS上)

看起来更时尚(2B)

NGINX一直用的好好的.可其中一个网站老出现502,php-fpm老是无响应

一直找不到好的解决办法..

尝试了各种办法,其中也包括脚本不断检测php-fpm,无响应是自动重启 治标不治本

直到有一天.在另外一台服务器上测试一个东西..发生了同样的情况..浏览器等待了半天.症状及其相似..而罪魁祸是file_get_contents立马想到了什么.

联想

曾经用过华夏名网的虚拟主机(09年的时候)DZ发布了UCHOME.当时名网也选择了NGINX.不过服务器同样老出现502.当时解释的原因是UC的API导致的.

状况

此网站大量使用api(主要是淘宝API),curl方式.另外还有微博等插件.都有可能使用到file_get_contents.猜测可能出现这种情况的原因是,发起远程请求的时间较长.进程被挂起..

于是想出了一个比较有意思的想法

nginx为反向代理服务器,同时安装apache,使用非80端口.将原先fastcgi的方式转发到apache使用mod_php来处理.

先安装下apache..(很少用到都没编译安装过..留档记录)

# 根据错误提示编译和安装 apr 与 apr-util 文件在httpd源码中

[[email protected] httpd-2.2.22]# cd srclib/apr

[[email protected] apr]# ./configure --prefix=/usr/local/apr-httpd/

[[email protected] apr]# make

[[email protected] apr]# make install

[[email protected] apr]# cd ../apr-util

[[email protected] apr-util]# ./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/

[[email protected] apr-util]# make

[[email protected] apr-util]# make install

[[email protected] apr-util]# cd ../../

[[email protected] httpd-2.2.22]# ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/

[[email protected] httpd-2.2.22]# make

[[email protected] httpd-2.2.22]# make install

之前是编译安装的php,只选择了fastcgi的方式,重新编译一个带mod_php的放在新文件夹避免冲突.

#细节 --prefix --with-apxs2

./configure --prefix=/usr/local/php5314 --with-apxs2=/usr/local/httpd/bin/apxs --with-libxml-dir --with-zlib --with-bz2 --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mysql=/usr/local/mysql  --enable-sockets --with-xsl --enable-zip --enable-zend-multibyte --with-curl=/usr --with-openssl

rpaf 为了让APACHE获取NGINX从到客户端转发来的真实IP

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz

tar zxvf mod_rpaf-0.6.tar.gz

cd mod_rpaf-0.6

/usr/local/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

make

make install

配置httpd.conf

vim /usr/local/httpd/conf/httpd.conf

#apache在8980端口

Listen 8980

#php模块

LoadModule php5_module        modules/libphp5.so

#rpaf

LoadModule rpaf_module          modules/mod_rpaf-2.0.so

RPAFenable On

RPAFproxy_ips 127.0.0.1 1.1.1.1 #多个Ip根据需要扩展

RPAFsethostname On

RPAFheader X-Forwarded-For

AddHandler application/x-httpd-php .php

#与php-fpm的用户一样..

User nobody

Group nobody

#另外需要注意的是目录的权限之前在nginx没的

Order Deny,Allow

Allow from all

php配置文件

根据实际需要修改吧,我比较2装了2个PHP,一个给NGINX,一个给HTTPD 只是把其中一个网站的PHP转到了HTTPD而已

带上配置启动

/usr/local/httpd/bin/apachectl -k start -f /usr/local/httpd/conf/httpd.conf

配置nginx通过proxy_pass模块将php的内容交给HTTPD处理

location ~ .php$ {

proxy_set_header  X-Real-IP $remote_addr;

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $host:80;#没加端口,网站很多链接变成了了8980端口了

proxy_pass http://xxx.com:8980;#网址已替换

}

现在访问网站一样是80端口,但是PHP请求都会被转发到HTTPD上.

另外出现502的可能跟file_get_contents有关,建议使用curl代替.