现在的位置: 首页 > IT运维 > 正文

利用Nginx反向代理实现流量清洗

2014年02月19日 IT运维 ⁄ 共 3168字 暂无评论 ⁄ 被围观 698+

一、正向代理与反向代理的概念

1.正向代理

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来。

结论:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

2.反向代理

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

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

3.两者区别

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

二、实现方法:

Nginx [engine x] is a HTTP and reverse proxy server,注意看Nginx的功能介绍后半部分,reverse proxy server即反向代理服务器。

实现流量清洗的架构:

利用Nginx反向代理清洗流量

利用Nginx反向代理清洗流量

从上图可以看出,先将包含用户请求及网络攻击的流量引向流量清洗设备,流量经过清洗后,纯净数据经过Nginx反向代理服务器到达原始服务器,由原始服务器处理用户的访问请求并给用户返回数据。

流量清洗的过程需要将域名(www.opensoce.com)解析的A记录由原始服务器IP变更为Nginx反向代理服务器的IP地址,而对原始服务器增加www2.opensoce.com的解析记录,用于Nginx代理服务器找寻匹配原始服务器。注意,这里不是匹配原始服务器的IP地址,而是干完www2.opensoce.com去匹配,原因是同IP的服务器未必只有1个网站,或IP默认网站不一定是我们www.opensoce.com对应的网站。

Nginx配置

下面重点介绍如何通过Nginx反向代理功能配置方法。

1.一台服务器一个网站

我们假定主域名为 www.opensoce.com,那么www.opensoce.com的A记录应指向到你NGINX反向代理服务器的 IP上,然后可以建立个www2.opensoce.com指向你被封的服务器IP,修改NGINX反向代理服务器的Nginx.conf配置文件。在末尾处(“}”号之 前)添加如下内容:

[php]server {
listen 80;
server_name www.opensoce.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log /home/www/logs/opensoce.com_access.log;
location /robots.txt {
root /home/www/www.opensoce.com;
}
location / {
proxy_pass http://www2.opensoce.com;
#如果原始服务器改用80之外的端口,此处填写你的IP或者域名外加你服务器开放的端口
}
}[/php]

执行

[php]kill -HUP `ps aux|grep "nginx: master "|awk '{print $2}'`[/php]

平滑重启nginx即可。

这个是一个网站的反向代理,如果你有多个网站,那么在服务器的Apache的httpd.conf中分配不同的端口给不同的站点,然后在NGINX反向代理服务器的 Nginx.conf按照上面的代码复制一份修改端口和域名即可,有多少个网站服务器就要开多少个端口,相应的 Nginx反向代理服务器上的nginx.conf也要有相关配置才能正常访问。

2.一台服务器多个站

在nginx.conf同目录建立 proxy.conf

内容如下:

[php]proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_ignore_client_abort on;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;[/php]

在nginx.conf 末尾的”}”前加上一行:

include proxy.conf;

然后你要支持几个网站就在 nginx.conf添加几行:

[php]server {
listen 80;
server_name www.opensoce.com;
location / {
proxy_pass http://www2.opensoce.com;
}
}[/php]

示例:

[php]server { listen 80; server_name www.opensoce.com; location / { proxy_passhttp://www2.opensoce.com; }}
server { listen 80; server_name www1.opensoce.com; location / { proxy_passhttp://www3.opensoce.com; }}
server { listen 80; server_name www5.opensoce.com; location / { proxy_passhttp://www6.opensoce.com; }}[/php]

【上篇】【下篇】

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#