LNMP + Apache 架构配置:Nginx 做前端代理 + Apache 做后端服务

前面两篇文章:

我们分别介绍了如何在 Win7 虚拟机中安装 CentOS 服务器、如何在本地主机 Win7 中通过 PuTTY “远程”登录虚拟机中的 CentOS 服务器,以及如何在 CentOS 中搭建 LAMP 环境和 LNMP 环境。

本文将介绍如何配置 LNMPA 环境,即用 Nginx 做前端反向代理服务器,接收 HTTP 请求,并处理静态文件(如 js/css/jpg/png/swf/… 等),而把动态脚本 .php/.py 等交给后端的 Apache 解析处理。

Apache 和 Nginx 说是当今最流行的两个 Web 服务器一点也不为过,Apache 用户基数大,稳定,兼容性高(比如 jsp/php/cgi/python 等等),但与 Ngnix 相比,Apache过于臃肿以及对静态文件响应过于缓慢让很多使用者感到头疼,而 Nginx 对于高并发性能出众,Proxy 功能强效率高,占用系统资源少。

但是 Nginx 也有劣势,它在处理 php 脚本时需要通过 php-fpm(FastCGI) 解析,而 php-fpm 不够稳定,经常出现 502 错误,生成相对复杂的页面没有优势,反而会使 php-cgi 进程变为僵尸进程。而 Apache 在高并发时对队列的处理比 FastCGI 更好,并且在处理动态 php 页面时,mod_php 模块也比 php-cgi 模块更稳定更高效。

事实上很多大型的网站都是采用 Nginx 前端 + Apache 后端的服务器架构,这样可以很好地结合了 Nginx 高并发和静态页面高效率以及 Apache 稳定的动态页面处理特点,再也不用担心 Nginx 以 FastCGI 模式运行 PHP 时的502问题和 Apache 处理静态页面过慢、负载过高的问题。

PS:我们都说 Nginx 一个高性能的 HTTP 和反向代理服务器,至于什么是反向代理,对应的正向代理又是什么意思,这篇文章已经讲得很清楚了,这里不再赘述:图解正向代理、反向代理、透明代理

配置 LNMP + Apache 架构

上一篇文章中,我们已经在 CentOS 服务器中分别搭建了 LAMP 环境和 LNMP 环境,这里接上文继续进行配置。

打开编辑 Nginx 的默认配置文件:

1
# vi /etc/nginx/conf.d/default.conf

注释掉之前 FastCGI 监听的配置,并添加如下代码:

1
2
3
4
# proxy the PHP scripts to Apache listening on 127.0.0.1:8080
location ~ \.php$ {
proxy_pass http://127.0.0.1:8080
}

即当 Nginx 接收 http 请求遇到需要解析 php 脚本时,则交给 127.0.0.1:8080 端口来处理,而我们等下配置让 Apache 来监听处理这个端口发来的请求。

最终 Nginx 的配置文件 default.conf 如下,此处保留 Nginx 的默认网站目录 /var/share/nginx/html 不变,可自行修改。

接下来打开编辑 Apache 的配置文件:

1
# vi /etc/httpd/conf/httpd.conf

找到 Listen 字段,并改为:Listen 127.0.0.1:8080,让 Apache 来监听这个端口,修改 Apache 的网站根目录为:”/usr/share/nginx/html”,与上述 Nginx 对应的网站目录保持一致,具体的修改细节如下加粗文字所示:

1
2
3
4
5
6
7
8
9
10
Listen 127.0.0.1:8080
...
ServerName localhost
...
DocumentRoot "/usr/share/nginx/html"
...
<Directory "/usr/share/nginx/html">
...
<⁄Directory>
...

保存退出编辑,重启 Nginx 服务,并启动 Apache 服务,并确保这两个服务开机自启:

1
2
3
4
# service nginx restart
# service httpd start
# chkconfig nginx on
# chkconfig httpd on

此时通过浏览器访问 :http://192.168.211.132/phpinfo.php(此处 192.168.211.132 为 CentOS 服务器的 IP,不同机器不同,phpinfo.php 为 PHP 测试脚本,内容为:<? php phpinfo(); ?>,放在网站目录 /usr/share/nginx/html 下)

发现出现 502 Bad Gateway 信息!!!

经查阅相关资料发现是由于开启了 selinux 服务导致的,关闭 selinux 即可。

打开 selinux 配置文件:

1
# vi /etc/selinux/config

SELINUX=enforcing 改为 SELINUX=disabled,如下所示:

修改保存后,通过 reboot 命令重启 CentOS 服务器,重新通过浏览器访问:http://192.168.211.132/phpinfo.php,得到如下信息。

借助于谷歌浏览器的工具我们可以发现,当浏览器向服务器发起 http://192.168.211.132/phpinfo.php 这个 HTTP 请求时,是由 Nginx 接收的,当 Nginx 发现需要处理 PHP 脚本时,则通过 127.0.0.1:8080 端口交给 Apache 处理,PHP 的输出信息也显示了 phpinfo.php 脚本正是由 Apache 2.0 Handler 解析处理的。

至此,LNMP + Apache 架构配置完成!

当然,这里只是简单介绍了如何配置让 Nginx 和 Apache 协同工作,在实际的生产环境中,需要详细阅读 Nginx 和 Apache 的配置文档,根据自己的应用需求,进行更加细致而复杂的设置。

Reference