nginx与apache共存

2013年 19月 01日 00:43

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代替.