Nginx之(正)反向代理

在配置nginx反向代理之间我们得先准备两台测试服务器,Web1与Web2。

1.安装httpd


1

2

[[email protected] ~]# yum install -y httpd

[[email protected] ~]# yum install -y httpd

2.提供测试页面


1

2

[[email protected] ~]# echo "<h1>web1.test.com</h1>" > /var/www/html/index.html

[[email protected] ~]# echo "<h1>web2.test.com</h1>" > /var/www/html/index.html

3.启动httpd服务


1

2

3

4

[[email protected] ~]# service httpd start

正在启动 httpd:                                           [确定]

[[email protected] ~]# service httpd start

正在启动 httpd:                                           [确定]

4.测试一下

5.简单说一下,正向代理与反向代理

(1).正向代理的概念

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

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

(2).反向代理的概念

继续举例:

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

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

(3).两者区别

用途上来讲:

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

安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

6.nginx 代理模块

http 代理官方中文文档http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:httpproxy

说明:代理模块的指令有很多我这里只讲解重要的proxy_pass,想了解更多代理指令请参考官方中文文档。

这个模块可以转发请求到其他的服务器。HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样浏览器就可以为浏览器处理keepalive。

如下例:


1

2

3

4

location / {

  proxy_pass        http://localhost:8000;

  proxy_set_header  X-Real-IP  $remote_addr;

}

注意,当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。

实验拓扑:

7.配置http反向代理


1

2

3

4

5

6

[[email protected] ~]# cd /etc/nginx/

[[email protected] nginx]# cp nginx.conf nginx.conf.bak #备份一个原配置文件

[[email protected] nginx]# vim nginx.conf

location / {

               proxy_pass      http://192.168.18.201;

       }

指令说明:proxy_pass

语法:proxy_pass URL

默认值:no

使用字段:location, location中的if字段

这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:proxy_pass http://localhost:8000/uri/;

8.重新加载一下配置文件


1

2

3

4

[[email protected] ~]# service nginx reload

nginx: the configuration file /etc/nginx/nginx.conf
syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is
successful

重新载入 nginx:                                           [确定]

9.测试一下

注,大家可以看到,当我们访问192.168.18.208时,被代理重新定向到Web1上。

10.查看一下Web服务器日志


1

2

3

4

5

6

7

8

9

10

11

[[email protected] ~]# tail /var/log/httpd/access_log

192.168.18.208 - - [04/Sep/2013:00:14:20
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:14:20
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:14:20
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.138 - - [04/Sep/2013:00:14:45
+0800] 
"GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.138 - - [04/Sep/2013:00:14:48
+0800] 
"GET /favicon.ico HTTP/1.1" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:14:55
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:15:05
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:15:13
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:15:16
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

192.168.18.208 - - [04/Sep/2013:00:15:16
+0800] 
"GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

注,大家可以看到我们这里的客户的IP全是,nginx代理服务器的IP,并不是真实客户端的IP。下面我们修改一下,让日志的IP显示真实的客户端的IP。

11.修改nginx配置文件


1

2

3

4

location / {

        proxy_pass      http://192.168.18.201;

        proxy_set_header  X-Real-IP  $remote_addr; #加上这一行

}

指令说明:proxy_set_header

语法:proxy_set_header header value

默认值: Host and Connection

使用字段:http, server, location

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

12.重新加载一下配置文件


1

2

3

4

[[email protected] ~]# service nginx reload

nginx: the configuration file /etc/nginx/nginx.conf
syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is
successful

重新载入 nginx:                                           [确定]

13.测试并查看日志


1

2

3

4

5

6

7

8

9

10

11

[[email protected] ~]# tail /var/log/httpd/access_log

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.208 - - [03/Sep/2013:16:26:18
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,大家可以看到日志记录的还是代理的IP,没有显示真实客户端的IP,为什么呢?我们来看一下httpd的配置文件。

14.查看并修改httpd配置文件

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf

注,大家可以这里记录日志的参数还是%h,下面我们修改一下参数。

注,这是修改后的参数,将h%修改为%{X-Real-IP}i,好的下面我们再来测试一下。

15.重启并测试


1

2

3

4

5

6

7

8

9

10

11

12

13

14

[[email protected] ~]# service httpd restart

停止 httpd:                                               [确定]

正在启动 httpd:                                           [确定]

[[email protected] ~]# tail /var/log/httpd/access_log

192.168.18.138 - - [03/Sep/2013:17:09:14
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:14
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

192.168.18.138 - - [03/Sep/2013:17:09:15
+0800] 
"GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,大家可以看到现在的日志里记录的IP地址就是真实的客户端地址了。好了,到这里Nginx代理后端一台服务器就演示到这里,下一章讲负载均衡。

时间: 2024-10-13 01:42:07

Nginx之(正)反向代理的相关文章

Nginx安装和反向代理配置

Nginx安装和反向代理配置 Nginx安装需要一些准备工作. 安装gcc等 yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel 还需要安装pcre,PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 Perl兼容的正则表达式库. yum -y install pcre 下载Nginx源码包,这里选择是1.7.8版本.并且解压缩,并且编译 wge

nginx+tomcat实现反向代理的负载均衡

nginx+tomcat实现反向代理的负载均衡 安装java环境 server12: [[email protected] ~]# sh jdk-6u32-linux-x64.bin [[email protected] ~]# mv jdk1.6.0_32/ /usr/local/ [[email protected] ~]# cd /usr/local/ [[email protected] local]# mv jdk1.6.0_32/ java [[email protected] lo

nginx是一个反向代理的软件

nginx只是一个反向代理的软件,和语言无关,理论上支持任何Web平台,当然http://Asp.net也不例外,http://51aspx.com就是http://Asp.net开发的,前端暴漏的是nginx Nginx和后端无关,他是HTTP传输过程中的一个中间层,负责将请求转发到他身后的应用服务器.对于客户端和最终的服务端,都是感知不到Nginx的存在的

Nginx高可用反向代理搭建

Nginx高可用反向代理搭建 Nginx简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名. Nginx 可以在大多数 Unix like O

Nginx 如何设置反向代理

网络结构如上图.可能你只有一个公网的Ip地址. 但是您的内网有个网站需要映射至外网.而又不想添加其它的非80端口.则你可以直接使用nginx来做反向代理即可.首先,配置nginx.conf文件. http { include mime.types; default_type application/octet-stream; client_max_body_size 8m; #############################################################

Nginx+Tomcat实现反向代理及动静分离

通常tomcat部署结构 通常tomcat前端是nginx或apache,后端都为tomcat,也就意味着无论前端是什么角色都是以代理的方式进行工作的 但是要注意的是如果基于nginx做反向代理,转发请求到tomcat的时候是基于http协议进行转发的 但注意的是tomcat的连接器有httpajp jk2 jserv 而如果基于nginx做转发的话只支持http做转发 而如果apache做代理转发的话,几乎常用协议都支持 但常用的连接类型都是ajp协议,因为ajp协议可以工作在二进制模式下,而

五、Nginx多Server反向代理配置

Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了. server_name的匹配顺序 Nginx中的server_name指令主要用于配置基于名称虚拟主机,server_name指令在接到请求后的匹配顺序分别为: 1.准确的server_name匹配,例如: 1 server { 2 listen 80; 3 server_name www.ooxx.com; 4 ... 5 } 2.以*通配符开始

tomcat配置及基于nginx、apache反向代理tomcat

如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如Php基于C和C 语言,Jsp基于Java语言.Tomcat即是一个Jsp和Servlet的运行平台. Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成.由于有了Sun的参与和支持,最新

【转】Nginx服务器的反向代理proxy_pass配置方法讲解

[转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { proxy_pass http://127.0.0.1:8008; } Apache2的反向代理的配置是: ProxyPass /ysz/ http://