生命不息
折腾不止

Nginx反向代理教程/不开心,不聊扶墙聊建站

我的 ss 站服务器持续起不来,不开心。。今天就不了扶墙相关的了,聊下建站相关的知识把。。说个反代

什么是反向代理?

简单的理解,反向代理其实也是跳板,你访问 A 的时候, A 就会访问 B ,并把 B 的内容返回给你。更严谨的定义,看后我文章后面复制的其他网站的资料。。。。

为什么需要反向代理?

有几种情况下你可能需要反向代理 :

  • 比如你在法国租用了一台服务器,国内速度太慢了,这时你就可以在香港找个 vps 反代这个法国服务器,这样你访问这个网站因为通过香港的中转速度就会变快。而且由于反代服务器对性能不要求,所以价格就很便宜。
  • 如果你不想暴露真实的 IP 地址,那么就可以在前端搭建一个反向代理服务器,让用户都是访问反向代理服务器。
  • 因为有些网站被墙了。。比如 google 。。你可以用没被墙的 IP 做个反代,这样大家访问这个网站就相当于访问 google 了。。

如何做反向代理?

反向代理应用最广的就是 nginx 了,所以这里以 nginx 为例。

最简单的反向代理代码

代码的位置是 nginx 的网站配置文件

server
{
listen          80;
server_name     91yun.yun;
location / {
proxy_pass          http://cache.91yun.org/;
proxy_redirect      off;
proxy_set_header    X-Real-IP       $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

这个代码的意思就是,你访问 91yun.org ,其实拿到的内容是 cache.91yun.org 的内容。就成功实现了通过 91yun.org 反向代理 cache.91yun.org 的目的。

但这样就是直接连接,如果我们能把请求到的内容临时缓存在反代服务器上,那访问速度就更快了。比如你用香港反代法国的机子,如果请求一次后就缓存在香港服务器,那后面的人访问就是直接从香港服务器上取文件,速度就快多了。

前端缓存的反向代理代码

首先我们需要建立用来存储缓存的目录:

mkdir /home/cache/path -p
mkdir /home/cache/temp -p

然后在 nginx 的配置文件 httpd.conf 里面增加缓存的设置

以下代码请插入 http{ ## 这里 } ,一般加在 log_format 上面或下面均可:

client_body_buffer_size  512k;
proxy_connect_timeout    5;
proxy_read_timeout       60;
proxy_send_timeout       5;
proxy_buffer_size        16k;
proxy_buffers            4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path   /home/cache/temp;
proxy_cache_path  /home/cache/path levels=1:2 keys_zone=cache_one:100m inactive=7d max_size=5g;

#100m 是内存占用, 7d 是 7 天无访问删除, 5g 是缓存占具硬盘空间

最后在网站的配置文件里面增加缓存的设置

server
{
listen          80;
server_name     91yun.org;
location / {
proxy_cache cache_one;
proxy_cache_valid  200 304 3d;
proxy_cache_key $host$uri$is_args$args;
proxy_pass          http://cache.91yun.org/; 
proxy_redirect      off;
proxy_set_header    X-Real-IP       $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
expires 10d;
access_log  /home/wwwlogs/vpsmm.log  access;
}
}

几个配置的说明:
server_name 91yun.org; # 主机名
proxy_cache_valid 200 304 3d; # 正常状态缓存时间 3 天
proxy_pass http://cache.91yun.org/; # 反代的网站
expires 10d; # 默认 10 天缓存
access_log /home/wwwlogs/vpsmm.log access; # 日志文件

当然你熟悉 nginx 的配置的话,根据以上代码还能实现只缓存图片, js 或者只缓存某个目录等等。

需要注意的是,这个缓存设置完,他不到期是不会自动删除的。比如你缓存了首页 3 天,你更新了文章,就不会自动更新到缓存服务器上,用户访问到的永远都是 3 天前的内容。要解决这个问题。可以把缓存时间设短,比如 1h ( 1 小时)。或者直接手动清空上面设置的 2 个缓存文件夹的内容。至于使用程序来自动更新的时候清空相应缓存的方法属于高阶应用,后面如果有时间再教大家。。

下面是关于反向代理更详细的描述,方便大家对反向代理有个更深入的了解,我复制粘帖来的。。。

======================================================================================

复制粘帖来的反向代理更详细的介绍

一、反向代理: Web 服务器的“经纪人”

1.1 反向代理初印象

反向代理( Reverse Proxy )方式是指以 代理服务器来 接受 internet 上的连接请求,然后将 请求转发 给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为 一个服务器

Nginx 搭建反向代理服务器过程详解

从上图可以看出:反向代理服务器位于 网站机房 ,代理网站 Web 服务器接收 Http 请求,对请求进行转发。

1.2 反向代理的作用

保护网站安全: 任何来自 Internet 的请求都必须先经过代理服务器;

Nginx 搭建反向代理服务器过程详解

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

Nginx 搭建反向代理服务器过程详解

实现负载均衡: 充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;

Nginx 搭建反向代理服务器过程详解

二、初识 Nginx :简单却不平凡

2.1 Nginx 是神马?

Nginx 搭建反向代理服务器过程详解

Nginx 是一款 轻量级 的网页服务器、反向代理器以及电子邮件代理服务器。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

Source : Nginx (发音同 engine x ),它是由俄罗斯程序员 Igor Sysoev 所开发的。起初是供俄国大型的门户网站及搜索引擎 Rambler (俄语:Рамблер)使用。此软件 BSD-like 协议下发行,可以在 UNIX 、 GNU/Linux 、 BSD 、 Mac OS X 、 Solaris ,以及 Microsoft Windows 等操作系统中运行。

说到 Web 服务器, Apache 服务器和 IIS 服务器是两大巨头;但是运行速度更快、更灵活的对手: Nginx   正在迎头赶上。

2.2 Nginx 的应用现状

Nginx 已经在俄罗斯最大的门户网站──  Rambler Mediahttp://www.rambler.ru )上运行了 3 年时间,同时俄罗斯超过 20% 的虚拟主机平台采用 Nginx 作为反向代理服务器。

Nginx 搭建反向代理服务器过程详解 Nginx 搭建反向代理服务器过程详解 Nginx 搭建反向代理服务器过程详解 Nginx 搭建反向代理服务器过程详解 Nginx 搭建反向代理服务器过程详解

在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、 56.com 、 Discuz! 、水木社区、豆瓣、 YUPOO 、海内、迅雷在线 等多家网站使用 Nginx 作为 Web 服务器或反向代理服务器。

2.3 Nginx 的核心特点

( 1 ) 跨平台: Nginx 可以在大多数 Unix like OS 编译运行,而且也有 Windows 的移植版本;

( 2 ) 配置异常简单: 非常容易上手。配置风格跟程序开发一样,神一般的配置;

( 3 ) 非阻塞、高并发连接: 数据复制时,磁盘 I/O 的第一阶段是非阻塞的。官方测试能够支撑 5 万 并发连接,在实际生产环境中跑到 2 ~ 3 万并发连接数。(这得益于 Nginx 使用了最新的 epoll 模型);

PS : 对于一个 Web 服务器来说,首先看一个请求的基本过程:建立连接—接收数据—发送数据,在系统底层看来 :上述过程(建立连接—接收数据—发送数据)在系统底层就是 读写事件

①如果采用 阻塞调用 的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件,那么请求就会被耽搁 。

②既然没有准备好阻塞调用不行,那么采用 非阻塞调用 方式。非阻塞就是:事件马上返回,告诉你事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得 不时地过来检查 一下事件的状态,你可以做更多的事情了,但带来的 开销 也是不小的。

( 4 ) 事件驱动: 通信机制采用 epoll 模型,支持更大的并发连接。

①非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有了 异步非阻塞的事件处理机制 。这种机制让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上面阻塞调用与非阻塞调用的两个问题。

②以 epoll 模型 为例:当事件没有准备好时,就放入 epoll( 队列 ) 里面。如果有事件准备好了,那么就去处 理;如果事件返回的是 EAGAIN ,那么继续将其放入 epoll 里面。从而,只要有事件准备好了,我们就去处理它,只有当所有事件都没有准备好时,才在 epoll 里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一 个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事 件,事实上就是这样的。

③与多线程方式相比,这种事件处理方式是有很大的优势的, 不需要创建线程 ,每个请求占用的内存也很少, 没有上下文切换 , 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于 IIS 服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时 有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的 cpu 开销很大,自然性能就上不 去,从而导致在高并发场景下性能下降严重。

总结: 通过异步非阻塞的事件处理机制, Nginx 实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级

( 5 ) Master/Worker 结构 :一个 master 进程,生成一个或多个 worker 进程。

Nginx 搭建反向代理服务器过程详解

PS : Master-Worker 设计模式核心思想是 将原来串行的逻辑并行化 , 并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件 Master 和 Worker , Master 主要将逻辑进行拆分,拆分为互相独立的部分,同 时维护了 Worker 队列,将每个独立部分下发到多个 Worker 并行执行, Worker 主要进行实际逻辑计算,并将结果返回给 Master 。

问: nginx 采用这种进程模型有什么好处?

答: 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, Master 进程则很快重新启动新的 Worker 进程。当然, Worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 Worker 上的所有请求失 败,不过不会影响到所有请求,所以降低了风险。

( 6 ) 内存消耗小: 处理大并发的请求内存消耗非常小。在 3 万并发连接下,开启的 10 个 Nginx 进程才消耗 150M 内存( 15M*10=150M )。

( 7 ) 内置的健康检查功能: 如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问。

( 8 ) 节省带宽: 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。

( 9 ) 稳定性高: 用于反向代理,宕机的概率微乎其微。

赞(3)
未经允许不得转载:91云(91yun.co) » Nginx反向代理教程/不开心,不聊扶墙聊建站

留言 10

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #0

    https://bb.exacker.com/raspi/98.html 刚弄完…

    BB8年前 (2016-07-23)回复
  2. #0

    微信已打赏

    yikyo9年前 (2016-05-06)回复
    • 感谢。。。

      91yun9年前 (2016-05-06)回复
  3. #0

    挂了几天了还没修复

    SSL9年前 (2016-05-06)回复
    • 汗。估计还要几天。。这次数据没备份亏大了

      91yun9年前 (2016-05-06)回复
  4. #0

    今天刚准备跟你买SS呢。。。

    老季9年前 (2016-05-06)回复
    • 还好我服务器都是分开放的,已经买的不受影响。不然要坑死。

      91yun9年前 (2016-05-06)回复
      • 大神的服务器咋叻

        Kevin9年前 (2016-05-06)回复
      • 你咋啦

        Oliver9年前 (2016-05-06)回复
        • 服务器挂了。数据没备份。。。

          91yun9年前 (2016-05-06)回复