为什么要使用反向代理详见本博文:【Linux常识(一)】so-称为normalProxy和反向代理LNMPA通过Nginx强大的反向代理功能将动态文件传递给Apache,这就形成了LNMPA架构中LNMP或LAMP的劣势。Nginx是Linux下一款小巧高效的Web服务器软件,与Apache相兼容,具有占用资源少、支持并发连接、效率更高、反向代理功能效率高、静态文件处理速度快等优点,但动态页面处理能力不如Apache等老牌软件成熟。单独使用Nginx处理大量动态页面时,很容易出现频繁的502错误。Apache是一种老式的网络服务器软件。它在高并发下比FastCGI更成熟地处理队列。Apache的mod_php比php-cgi更高效、更稳定。支持伪静态,不需要转换,用户多。站点权限等方面有较好的效果,单独使用Apache处理静态页面时,内存占用远超Nginx。LNMPA的优势LNMPA使用Nginx作为前端服务器,能够以更少的系统资源更快更及时地处理静态页面、js、图片等文件。端服务器上的Apache处理,Apache处理后,会交给Nginx返回给客户端。使用LNMPA可以更好的解决LNMP架构中PHP-FPM导致的502错误,同时以非常简单的方式提供一个更加安全的多用户多站点环境。在虚拟机上配置反向代理的步骤首先假设你已经假设了LNMP架构。这个时候我们需要安装Apache和php。为什么我们需要重新安装PHP?因为Apache默认使用PHP作为自己的模块。(mod_php)运行,这与Nginx不同。step1:安装配置Apache和php我们的目的是在localhost:88上配置web1和web2站点安装yum-yinstallhttpdhttpd-devel#Ubuntu叫做Apache2yum-yinstallphpphp-mysqlphp-commonphp-gdphp-mbstringphp-mcryptphp-develphp-xml配置Apache配置文件/etc/httpd/conf/httpd.conf修改以下信息(不同则修改,不加则不加)Listen88ServerNamelocalhost:88NameVirtualHost*:88DocumentRoot/home/wwwroot/web2/ServerNameweb2.comErrorLoglogs/web2-error_logCustomLoglogs/web2-access_logcommonDocumentRoot/home/wwwroot/web1/ServerNameweb1.comErrorLoglogs/web1-error_logCustomLoglogs/web1-access_logcommon然后配置好hosts后,可以通过下面的方式正常访问默认的index.php,即完成第一步web1.com:88web2.com:88step2:在Nginx.conf中配置反向代理通过proxy_pass指向代理服务器Apache语法:proxy_passURL默认值:no适用范围:location,location中的if字段此命令设置代理服务器的地址和映射的URI。地址可以是主机名或IP加端口号的形式,例如:proxy_passhttp://localhost:8000/uri/;#在Addlocation/{proxy_passhttp://127.0.0.1:88;}中Nginx的web1的server部分,重启Nginx服务,然后访问web1.com(客户端192.168.42.196->服务器192.168.42.188),此时访问的是Nginx监听的80端口,进入Nginx服务,并且然后命中Nginx的位置,然后Nginx访问88的httpd(Apache)服务,然后通过Apache解析执行文件。这时候分别产生两条日志这是Nginx服务和Apache服务的两条访问日志#Nginx192.168.42.196--[27/Sep/2015:16:06:10+0800]"GET/HTTP/1.1"20020"-""Mozilla/5.0(WindowsNT6.1;WOW64;rv:40.0)Gecko/20100101Firefox/40.0"-#Apache192.168.42.188--[27/Sep/2015:16:06:10+0800]"GET/HTTP/1.0"20020我们注意到访问Apache的ip是服务器的ip,与我们想要的客户端ip不匹配。这时候我们就需要使用另外一个命令proxy_set_header,将真实的客户端IP通过proxy_set_header发送给代理服务器Apache。该命令允许发送到代理服务器的请求头重新定义或添加一些字段。该值可以是文本、变量或它们的组合。当指定字段没有定义proxy_set_header时,会继承其上级字段。语法:proxy_set_headerheadervalue默认值:Host和Connection使用的字段:http,server,locationlocation/{proxy_passhttp://127.0.0.1:88;proxy_set_headerX-Real-IP$remote_addr;#添加这一行,把$remote_addr赋值给变量X-Real-IP,然后这个变量就可以接收后端服务器(被反向代理的服务器)的日志格式(无论是Nginx还是Apache)}注:此时Nginx已经通过proxy_pass将真实的客户端IP发送给代理服务器Apache,但是Apache还没有接受Nginx发送的IP,所以我们要更改Apache的配置文件LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined#将%h更改为%{X-Real-IP}i,注意虚拟主机中的日志格式是否合并?反正修改相应的日志格式即可;LogFormat"%{X-Real-IP}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""合并此时,我们可以将PHP动态文件返回给Apache进行处理,然后Nginx自己只处理静态文件。这时候我们可以利用Apache强大的fake静态功能,也可以通过配置缓存功能来加速web请求,将一些静态资源缓存在真实web服务器上,减轻真实web服务器位置的负载压力~\.(jpg|jpeg|png|gif)${proxy_passhttp://192.168.1.204:8080;expires1d;}step3:推荐配置其实Nginx需要一个反向代理,不仅仅是ip,还需要客户端HTTP请求头的必要信息,比如cookie,host,referer等信息,所以下面的配置就是推荐:location/{try_files$uri@apache;#try_files将尝试您列出的文件并将内部文件设置为指向}location@apache{internal;#internal指令指定一个location只能被“内部”请求调用,外部调用将返回“Notfound”proxy_passhttp://127.0.0.1:88;proxy_connect_timeout300s;proxy_send_timeout900;proxy_read_timeout900;proxy_buffer_size32k;代理缓冲区432k;proxy_busy_buffers_size64k;proxy_redirect关闭;proxy_hide_header变化;proxy_set_header接受编码'';proxy_set_header主机$host;proxy_set_header引用$http_referer;proxy_set_headerCookie$http_cookie;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}