前面两篇文章:
我们分别介绍了如何在 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 | # proxy the PHP scripts to Apache listening on 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 | Listen 127.0.0.1:8080 |
保存退出编辑,重启 Nginx 服务,并启动 Apache 服务,并确保这两个服务开机自启:
1 | # service nginx restart |
此时通过浏览器访问 :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 的配置文档,根据自己的应用需求,进行更加细致而复杂的设置。