为什么要使用反向代理

具体请参考这篇博文:【Linux常识篇(1)】所谓的正向代理与反向代理

在虚拟机上配置反向代理的步骤

首先假设你已经假设好了LNMP架构了,这时我们还要安装Apache和php,为什么还要再装一次PHP?因为Apache默认是把PHP作为本身的一个模块(mod_php)来运行的,与Nginx的运行方式不同.

step1: 安装与配置Apache与php

我们的目的是在localhost:88上配置web1和web2的站点

安装

yum -y install httpd httpd-devel # Ubuntu里面叫做Apache2
yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml

配置

Apache配置文件/etc/httpd/conf/httpd.conf修改如下信息(不同的就修改,没有的就添加)

Listen 88
ServerName localhost:88
NameVirtualHost *:88 <VirtualHost *:88>
DocumentRoot /home/wwwroot/web2/
ServerName web2.com
ErrorLog logs/web2-error_log
CustomLog logs/web2-access_log common
</VirtualHost> <VirtualHost *:88>
DocumentRoot /home/wwwroot/web1/
ServerName web1.com
ErrorLog logs/web1-error_log
CustomLog logs/web1-access_log common
</VirtualHost>

然后配置hosts后通过以下能正常访问到默认的index.php就代表完成第一步

web1.com:88
web2.com:88

step2: 在Nginx.conf中配置反向代理

通过proxy_pass指向代理服务器Apache

语法:proxy_pass URL
默认值:no
作用域:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:proxy_pass http://localhost:8000/uri/;
# 在Nginx的web1的server段加上
location / {
proxy_pass http://127.0.0.1:88;
}

重启Nginx服务,然后再访问web1.com(客户端192.168.42.196 -> 服务端192.168.42.188),这个时候访问的是Nginx监听的80端口,进的是Nginx服务,然后Nginx的location命中,再然后由Nginx访问88的httpd(Apache)服务,然后通过Apache来解析执行该文件,这时产生两条日志分别是Nginx服务和Apache服务的两条访问日志

# Nginx
192.168.42.196 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0" - #Apache
192.168.42.188 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.0" 200 20

我们注意到访问Apache的ip就是服务器的ip,这跟我们想要的客户端ip不符,这时我们就要用到另外一个指令proxy_set_header

通过proxy_set_header向代理服务器Apache发送真实客户端IP

这个指令允许将发送到被代理服务器的请求头重新定义或者增加一些字段。这个值可以是一个文本,变量或者它们的组合。proxy_set_header在指定的字段中没有定义时会从它的上级字段继承。

语法:proxy_set_header header value
默认值: Host and Connection
使用字段:http, server, location
location / {
proxy_pass http://127.0.0.1:88;
proxy_set_header X-Real-IP $remote_addr; #加上这一行,把$remote_addr赋给变量X-Real-IP,然后该变量可以被后端服务器(被反向代理的服务器)的日志格式中接收到(不管是Nginx和Apache都可以)
}

注意: 此时Nginx已经通过proxy_pass向代理服务器Apache发送真实客户端IP了,但是Apache还没接受Nginx发送过来的IP

所以我们还要去更改Apache的配置文件

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

# 将%h修改为%{X-Real-IP}i,这里要注意在虚拟主机中的日志格式是不是combined,反正就是修改对应的日志格式既可;

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

此时我们就可以把PHP动态文件返回给Apache处理,然后Nginx本身就只处理静态文件,这时我们就可以通过Nginx使用到Apache强大的伪静态功能了

也可以通过配置缓存功能加速Web请求,缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力

location ~ \.(jpg|jpeg|png|gif)$ {
proxy_pass http://192.168.1.204:8080;
expires 1d;
}

step3: 推荐配置

事实上Nginx需要反向代理过去的,不仅仅有ip,还包含着客户端http请求头必要信息,比如cookie,host,referer等信息,所以推荐如下配置:

location /
{
try_files $uri @apache; #try_files 将尝试你列出的文件并设置内部文件指向
} location @apache
{
internal; # internal指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found”
proxy_pass http://127.0.0.1:88; proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

LNMPA

通过Nginx强大的反向代理功能,把动态文件给Apache处理,这就形成了LNMPA架构

LNMP或LAMP的劣势

Nginx是一个小巧而高效的Linux下的Web服务器软件,与Apache相比,消耗资源更少,支持的并发连接,更高的效率,反向代理功能效率高、静态文件处理快等,但动态页面处理能力不如Apache等老牌软件成熟。单独使用Nginx处理大量动态页面时容易产生频繁的502错误。

Apache是一款老牌的Web服务器软件,在高并发时对队列的处理比FastCGI更成熟,Apache的mod_php效率比php-cgi更高且更稳定、对伪静态支持好,不需要转换、多用户多站点权限等方面有着更好的效果,而单独使用Apache处理静态页面时,对内存的占用远远超过Nginx。

LNMPA的优势

LNMPA使用Nginx作为前端服务器,能够更快、更及时地使用更少的系统资源处理静态页面、js、图片等文件,当客户端请求访问动态页面时,由Nginx反向代理给作为后端服务器的Apache处理,Apache处理完再交予Nginx返回给客户端。

采用LNMPA能够更好的解决LNMP架构中由于PHP-FPM方面产生的502错误,同时能够以很简单的方式提供更安全的多用户多站点环境。

【nginx网站性能优化篇(2)】反向代理实现Apache与Nginx的动静分离(LNMPA)的更多相关文章

  1. 【nginx网站性能优化篇(3)】反向代理实现负载均衡

    注意,本篇文章为负载均衡的理论篇,后续找个机会推出实战篇.理论篇主要讲述如何配置负载均衡,配置负载均衡不难.难的是真正的实战,比如如何做到多服务器之间的数据共享(session,file等),多cac ...

  2. 【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存

    gzip压缩 概述 网页在服务器端经过了gzip或者其他格式的压缩后的输出明显减少了content-length字节,当访问过百万时,这些减少的字节就会变为客观的流量给节约下来;从而减轻服务器的压力以 ...

  3. 网站性能优化实战——从12.67s到1.06s的故事

    文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...

  4. 反向代理负载均衡之nginx

    一.集群 1.1 什么是集群 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性 ...

  5. Nginx服务器性能优化与安全配置实践指南

    转载自:https://www.bilibili.com/read/cv16151784?spm_id_from=333.999.0.0 1.引言 1.1 目的 为了更好的指导部署与测试艺术升系统ng ...

  6. 网站性能优化(Yahoo 35条)

    Yahoo 网站性能优化 35条 一.内容部分 尽量减少 HTTP请求 减少 DNS查找 避免跳转 缓存 Ajxa 推迟加载 提前加载 减少 DOM元素数量 用域名划分页面内容 使 frame数量最少 ...

  7. Yahoo团队经验:网站性能优化的34条黄金法则

    Yahoo团队总结的关于网站性能优化的经验,非常有参考价值.英文原文:http://developer.yahoo.com/performance/rules.html 1.尽量减少HTTP请求次数 ...

  8. Nginx配置性能优化与压力测试webbench【转】

    这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...

  9. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

随机推荐

  1. lighttpd的超时参数详解

    今天服务器上传大文件,服务器php一直没有响应,响应为0KB,经排查发现是lighttpd的超时设置问题 server.max-keep-alive-idle = 5server.max-read-i ...

  2. 从word中提取图片的三种方法

    方法1:使用截图方法来提取并保存图片,如果你安装了QQ并且运行了的话,你可以使用Ctrl+Alt+A来截图,然后在QQ聊天框中按CTRL+V来保存图片,当然你可以在PS新建文档按CTRL+V来粘贴图片 ...

  3. OSM 中国数据(每天都在更新)

    http://download.geofabrik.de/asia/china.html

  4. Go在linux下的安装

    在Ubuntu.Debian 或者 Linux Mint上安装Go语言 下面是在基于Debian的发行版上使用apt-get来安装Go语言和它的开发工具. $ sudo apt-get install ...

  5. iOS常见问题(4)

    一.非ARC内存管理问题. 有些同学在创建项目的时候忘记点ARC了,导致一些成员属性都莫名其妙的释放了.然后出现了一系列莫名其妙的错误. 在滚动UITableView的时候出现野指针错误. 一出现这些 ...

  6. C#位操作符

    位操作符是对数据按二进制位进行运算的操作符.c#位操作符包括: 按位与 & 按位或 | 按位取反 ~ 左移 << 右移 >> 例如:   6:00000110 3:00 ...

  7. 关于json的知识整理

    一.什么是json JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML,但JSON 比 XML 更 ...

  8. Python标准库之os模块

    1.删除和重命名文件 import os import string def replace(file, search_for, replace_with): # replace strings in ...

  9. 1067: [SCOI2007]降雨量 - BZOJ

    Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...

  10. stdint.h 文件 int8_t uint8_t int16_t uint16_t

    http://blog.chinaunix.net/uid-26588712-id-3068151.html c++ 数据类型 按照posix标准,一般整型对应的*_t类型为:1字节     uint ...