Nginx反向代理与负载均衡

发布 : 2018-01-10 分类 : 大数据 浏览 :

Nginx简介

Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑(这一点与NodeJS采取了相同的做法,支持高并发,Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中,是可以支持二万至四万个平行链接),削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。

什么是代理

代理在普通生活中的意义就是本来应该你做的事情,你让别人代你做了,那么那个帮你做的人就是你的代理。而在计算机网络中代理的概念差不多,就是本来要客户端要做的网络访问,现在移交给另外一个机器做,那么那个机器就被称为代理服务器,代理服务器帮你来访问。过程如下:

正常情况

1
client(send request) —> server

代理情况:

1
client(send request) —> clinet proxy(send request) —> server

正向代理,是用于代理客户端的

举个很简单的例子:你直接在大陆地区访问google.com肯定是访问不了的,原因大家都知道,现在假如你有一台在美国的主机A,并且能够正常访问,那么你可以将浏览器对google.com的请求先转发给服务器A,服务器A收到请求后,扮演客户端的角色,发起对google.com的请求,服务器A收到响应后,又扮演服务端,将此响应原封不动的返回给你,自此,一次正向代理顺利完成。

反向代理,是用于代理服务端的

我们知道google.com每秒钟要处理如洪水般的网络请求,这些请求如果仅仅让一台单一的服务器处理,肯定是处理不过来的,我们自然而然的想到让多台服务器来处理这些请求,减少每台服务器的压力。但是现在有一个问题,多个服务器那就产生了多个IP,一般的,google.com只能解析到某个固定的IP(实际情况下,通过设置也是可以让同一个域名解析到多个IP的),因为现在存在多个Server,我的一个google.com就不能解析到这些服务器上,而且用多个二级域名比如server1.google.com,server2.google.com等等也给用户造成了使用上的不便,那该怎么办呢?通过反向代理可以很好的解决这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                                                                   +-------------------+
| |
+------> server 1 |
+-------------+ | | |
| +----------+ | | |
| client 1 | | | +-------------------+
| | | |
+-------------+ | |
| +------------------+ | +-------------------+
| | | | | |
+-------------+ | | | | | server 2 |
| | | | +------------> |
| clent 2 +--------------------> reverse proxy | | | |
| | | | | | +-------------------+
+-------------+ | | | |
| | | | .
. | | | | .
. | +------------------+ | .
. | |
| | +--------------------+
+-------------+ | | | |
| | | | | server m |
| client n +----------+ +------> |
| | | |
+-------------+ +--------------------+

总结

所谓代理,就是在客户端和服务端之间强行添加了一层,用来实现流量转发的功能

1
2
3
4
5
6
7
8
9
+----------------+         +---------------+        +--------------+
| | | | | |
| | | | | |
| | http | | http | |
| client <---------> proxy <--------> server |
| | https | | https | |
| | | | | |
| | | | | |
+----------------+ +---------------+ +--------------+

反向代理

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

举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在 readme 页面,它是偷偷从另外一台服务器上取回来,然后作为自己的内容返回给用户。但是用户并不知情这个过程。对用户来说,就像是直接从 www.example.com 获取 readme 页面一样。这里所提到的 www.example.com 这个域名对应的服务器就设置了反向代理功能

反向代理服务器,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样

All text

反向代理的优点

保护了真实的web服务器,web服务器对外不可见,外网只能看到反向代理服务器,而反向代理服务器上并没有真实数据,因此,保证了web服务器的资源安全

节约了有限的IP地址资源

企业内所有的网站共享一个在internet中注册的IP地址,这些服务器分配私有地址,采用虚拟主机的方式对外提供服务

减少WEB服务器压力,提高响应速度

反向代理就是通常所说的web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加一个高速的web缓冲服务器来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,作为代理缓存,它并不是针对浏览器用户,而针对一台或多台特定的web服务器,它可以代理外部网络对内部网络的访问请求。

反向代理服务器会强制将外部网络对要代理的服务器的访问经过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存到本地,以便日后再收到同样的信息请求时,它会把本地缓存里的内容直接发给用户,以减少后端web服务器的压力,提高响应速度。此外Nginx还具有缓存功能。

请求的统一控制,包括设置权限、过滤规则等

区分动态和静态可缓存内容

实现负载均衡,内部可以采用多台服务器来组成服务器集群,外部还是可以采用一个地址访问

解决Ajax跨域问题

作为真实服务器的缓冲,解决瞬间负载量大的问题

反向代理典型应用场景

反向代理的典型用途是将防火墙后面的服务器提供给 Internet 用户访问,加强安全防护。反向代理还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供缓冲服务。反向代理还可以启用高级 URL 策略管理技术,从而使处于不同 web 服务器系统的 web 页面同时存在于同一个 URL 空间下

Nginx做HTTP反向代理

访问本地服务器上的 README.md 文件http://localhost/README.md

本地服务器进行反向代理,从 https://github.com/matrixsparse/Programming-Assignments/tree/master/deep-learning/README.md 获取页面内容

编辑配置文件

1
vim /etc/nginx/conf.d/agency.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 8088;
# listen [::]:80 ipv6only=on;

# Log files for Debugging
access_log /var/log/nginx/agency-access.log;
error_log /var/log/nginx/agency-error.log;

# Your Domain Name
server_name www.sparsematrix.com;

# location 对请求 URI 进行匹配
# 用户访问 http://ip:port,则反向代理到https://github.com
# location / {
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass https://github.com;
# }

# 用户访问 http://ip:port/README.md,则反向代理到
# https://github.com/.../README.md
location /README.md {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://github.com/matrixsparse/Programming-Assignments/tree/master/deep-learning/README.md;
}
}

关于配置文件中的配置项

location

1
2
3
location 项对请求 URI 进行匹配,location 后面配置了匹配规则。例如上面的例子中,如果请求的 URI 是 localhost/,则会匹配 location / 这一项;如果请求的 URI 是 localhost/README.md,则会匹配 location /README.md 这项。

如果要做批量配置,需要配合使用 location 的正则匹配功能

proxy_pass

1
proxy_pass 后面跟着一个 URL,用来将请求反向代理到 URL 参数指定的服务器上。例如我们上面例子中的 proxy_pass https://github.com,则将匹配的请求反向代理到 https://github.com。

proxy_set_header

1
默认情况下,反向代理不会转发原始请求中的 Host 头部,如果需要转发,就需要加上这句:proxy_set_header Host $host;

检查nginx配置文件语法是否正确

1
nginx -t

重启nginx

1
nginx -s reload

在浏览器地址栏访问http://localhost/README.md

返回的结果是 GitHub 源代码的 README 页面

All text

正向代理

正向代理就像一个跳板,例如一个用户访问不了某网站(例如 www.google.com),但是他能访问一个代理服务器,这个代理服务器能访问 www.google.com,于是用户可以先连上代理服务器,告诉它需要访问的内容,代理服务器去取回来返回给用户。例如一些常见的翻墙工具、游戏代理就是利用正向代理的原理工作的,我们需要在这些正向代理工具上配置服务器的 IP 地址等信息

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2018/01/10/Nginx反向代理与负载均衡/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹