当今最流行的WEB服务器当属Nginx和Apache了,最近接触了nginx,那么nginx的一大特点就是它本身是一个反向代理服务器,且支持7层负载均衡,相比于apache,nginx对静态内容对处理能力很强,对于动态内容还是apache性能更优,于是我突发奇想使二者结合使用,也即使用Nginx处理静态内容,动态内容反向代理交给Apache处理。
首先需要了解一下什么是反向代理?这个概念貌似很耳熟,正向代理(也就是常说的“代理”)是我们经常接触的概念,那么接下来就通过正向代理与反向代理进行比较来更加形象的解释什么是反向代理。
正向代理
如下图,我们本地计算机想要访问google,被残忍的”墙“阻断了。于是乎我们在国外搭建一台代理服务器,让这台代理服务器去请求google,然后把返回的内容传递给我,这就是一个正向代理的过程,在这个过程中客户端隐藏了身份,google并不知道是谁真正请求的它,这个代理服务器就是充当了正向代理服务器的角色。
反向代理
如下图,我们本地计算机访问baidu,baidu后面有大量的服务器在运作,但是究竟是哪一台为我们服务,我们不知道,但是我们只需要对反向代理服务器发出请求即可,然后反向代理服务器就会将我们对请求发到其后面对服务器进行处理,然后返回信息给代理服务器,代理服务器将信息传递给我们,这个过程中对真正服务端进行隐藏。
两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端
Apache+Nginx
我的系统是macos10.13.3版本,首先使用brew安装apache+nginx+php并进行简单的配置(网上教程很多就不多说了)
这些安装配置好后,我们首先需要修改Apache的httpd.conf配置文件,将端口改为8080(其他也可),重启。
然后修改Nginx的nginx.conf文件,使其监听端口80(我这里默认是8080),并且将php文件交给apache处理(去掉这三行前面的#即可,不开启下面的php部分以及不需要启动php-fpm)
接下来进行测试:
分别在两个服务器根目录下(假设为apache_www和nginx_www)创建index.html,并写入不同内容“apache”、“nginx”。
然后分别访问http://localhost:80/与http://localhost:8080/。
输出结果为“apache”、“nginx”,表示二者分别都可以处理静态文件
接下来将两个index.html文件名修改为index.php,并分别写入“<?php echo "apache";?>“、“<?php echo "nginx";?>”
然后分别访问http://localhost:80/与http://localhost:8080/。
输出结果均为apache,如果将上面三行注释掉,访问http://localhost:80/会显示找不到相应文件。
这就表示当我们使用nginx访问php文件的时候它会去把请求发给apache进行处理,然后接收apache返回的结果显示到浏览器。
当我进行使用的时候就将两个服务器的根目录apache_www和nginx_www合成一个www,这样我们将项目放到里面直接访问localhost就默认将nginx当作前端服务器,发挥其长处,处理高并发并交给apache去处理动态内容。
注意:
如果单台服务器的话,NGINX+APACHE+PHP 纯粹多此一举,多了一次请求转发,效率肯定低,而且现在FPM已经足够稳定。完全没必要。
只有多台服务器集群的话,apache+nginx反代才有意义.NGINX+APACHE+PHP 这种架构存在的原因除了apache出现比较早外,还因为当时FPM不如module模式稳定,如今的FPM/fastcgi模式性能并不比module差。