Nginx作为反向代理的简单应用

转载 2015年07月16日 16:14:17

原文:http://zhou123.blog.51cto.com/4355617/840837

对于Nginx的反向代理主要在四个方面:
1、URL重写 URL rewirte
2、反向代理 reverse proxy 并启用缓存功能 
3、负载均衡
4、安装第三方模块,实现健康状态检测。

  关于一些Nginx的应用,可以在Nginx的官方网站上看到,内容介绍的也相当的详细。这里只浅谈一些我对于Nginx服务器学习到和一些认识。网站地址:
http://wiki.nginx.org/Modules

一、URL重写 URL rewirte

  要想使Nginx有rewirte功能,要在编译Nginx时要用到--with-http_rewirte_module这个模块,这个功能在编译的时候也是默认打开,如果不想使用这个功能就用--without-http_rewirte_module
 这个功能也支持URI重写。

  在这个功能中有 if(URL重写在什么的条件下) set rewirte等相关的应用,有兴趣的可到其官方网站到看。
 下面来说一下rewirte 和 if 的使用。

1、rewirte
这是个模式匹配如下:
rewrite regex replacement flag
来简单的解释一下这句的意思:rewirte 是关键字,regex是匹配的模式,replacement 是把匹配到的替换成什么,flag是标志位。
例如:将htt://www.zhou123.com/attatch.php?value=111223 改写为http://www.zhou123.com/111223/attatch
 就可如下所示的形式:
rewirte ^/(attatch)\.php\?value=(.*)$ /$2/$1 last;

下面来说一下标志位:
last: 当前的内容已经完成了,可以继续以后的语句(如果有多条语句时)
break: (当重写的语句执行完成后就直接跳出去支行后面的语句)
redirect: 重定向到一个完整的URL中去如:http://。用302来表示,这个是临时性的。
permanent: 永久重定向 用301表示;
下面来举个小例子:
  如用户访问:www.zhou123.com/forum/ 重写为www.zhou123.com/bbs/
rwirte ^/forum/?$ /bbs/ permanent;

编辑nginx的配置文件来测试一下:
vim /etc/nginx/nginx.conf
 定位到 server 这行在这个server加入如上内容即可:
location / {
root html;
rwirte ^/forum/?$ /bbs/ permanent; #####这行是新加的内容。
index index.html;
}
在浏览器中输入:http://www..zhou123.com/forum/就会把地址改成www.zhou123.com/bbs/。
rewirte比较简单这里就不测试了。

2、 关于if的应用

语法: if (condition) {...}
应用环境;server,location
条件:
1、变量名: false values are:empty string ("",or any string starting with "0";)
2、对于变量进行的比较表达式,可使用=或!= 进行测试 ;
3、正则表达式的模式匹配:
~ 区分大小的模式匹配
~* 不区分字母的大小写的模式匹配
!~ 和!~* 分别对上面的两种测试取反
4、测试文件是否存在-f 或!-f
5、测试目录是否存在-d或!-d
6、测试目录、文件或链接文件的存在性-e或!-e
7、检查一个文件的执行权限-x或!-x
在正则表达式中,可以使用圆括号标记匹配到的字符串,并分别可以使用$1、$2....

3、实现域名跳转:
要在配置文件中修改成如下所示的内容:
server
{
listen 80;
server_name jump.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/ http://www.magedu.com/;
}
这样就可以把jump.magedu.com 改成http://www.magedu.com/这个域名了。
4、实现域名镜像
server
{
listen 80;
server_name mirror.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/(.*)$ http://www.magedu.com/$1 last;
}
对于Nginx的URL重写就简单的介绍到这。

二、下面来谈谈Nginx的反向代理功能:

1、proxy 
这个模块在Nginx编译时也是默认开启的。
用法:proxy_pass URL地址。
就说通过Nginx要反向代理到什么地方去,后面的URL就是要代理的后台服务器的地址 。
下面用一个事例来说明一下:
在Nginx服务器的ip为:192.168.35.1/24 
后台的服务器ip是: 172.16.35.3/16 安装了apachen服务器,提供网页。
在nginx的配置文件中只要加入如下所示的内容即可:
location / {
#root html;
#index index.html;
proxy_pass http://172.16.35.3; ## 添加这条内容即可。
}

在后台的apache服务器的网页内容:
# echo "172.16.35.3" > /var/www/html/index.html
在浏览器中输入:http://192.168.35.1就会如下图所示的结果:


此时的Nginx的反向代理并没有什么实际的意义,只是在用户和服务器之间多加了一台服务器而已。要为Nginx添加缓存功能此时才能把Nginx的优势发挥出来。

2、为反向代理启用缓存功能:
在配置文件中加入如下所示的内容:

http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
server {
location / {
proxy_pass http://172.16.35.3;
proxy_set_header Host $host;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; 
}
}
}
下面要实现的环境与上面所提到的例子的环境一样。
在Nginx服务器的ip为:192.168.35.1/24 
后台的服务器ip是: 172.16.35.3/16 apache服务
添加完成后来进行一下压力测试:
在另外的一台服务器上用命令:
ab -c 100 -n 10000 http://192.168.35.1/index.html ###通过nginx服务器
来访问apache服务器。
在结果中找到如下一行:

Requests per second: 7354.40 [#/sec] (mean) 
####### 7354表示每秒接受请求的个数

ab -c 100 -n 10000 http://172.16.35.3/index.html ###来访问apache服务器。
同样在结果中找到如下一行:
Requests per second: 1489.96 [#/sec] (mean)
从两个结果就可以清晰的看到Nginx的反向代理加上缓存功能是多么的强大。几乎是apache服务器的10倍。

三、反向代理多台服务器实现负载均衡:

再添加一台后台的服务器:ip:172.16.35.2/16 也提供apache服务器。
这时的实验环境是:三台虚拟机了

nginx:192.168.35.1/24
两台apache服务器ip分别为:
172.16.35.2/16
172.16.35.3/16
要保证三台服务器之间的网络能正常通信哟!!!

新加入的服务器网页内容为:“172.16.35.2”
# echo "<h1>172.16.35.2</h1>" > /var/www/html/index.html

在nginx的配置文件中加入如下所示的内容:

http {
...
...

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
upstream myload {
server 172.16.35.2;
server 172.16.35.3 weight=2;
#################### 定义这两个后台服务器并加上了权重。
}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myload; #### 这个名称一定要与前面定义的相同。 
}


在浏览器中输入:http://192.168.35.1如图所示的结果:


经过刷新网页的内容在如此图所示的结果来回切换。这是为了显示结果所以为两个服务器设置了不同的网页。

四、安装配置第三方模块,实现upstream中对后端http

server的健康状态检测
  说明:这需要为nginx打补丁才能应用,所要重新源码编译nginx。

模块下载地址:https://github.com/cep21/healthcheck_nginx_upstreams;模块名称:ngx_http_healthcheck_module

安装配置方法:
1、首先解压healcheck模块到某路径下,这里假设为/tmp/healthcheck_nginx_upstreams

2、对nginx打补丁

首先解压nginx,并进入nginx源码目录:
# tar xf nginx-1.0.11.tar.gz
# cd nginx-1.0.11
# patch -p1 < /tmp/healthcheck_nginx_upstreams/nginx.patch

而后编译nginx,在执行configure时添加类似下面的选项:
--add-module=/tmp/healthcheck_nginx_upstreams

所以,这里就使用如下命令:
# ./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--with-pcre \
--add-module=/tmp/healthcheck_nginx_upstreams
# make && make install

ngx_http_healthcheck_module模块的使用方法:

1、此模块支持的指令有:
healthcheck_enabled
启用此模块

healthcheck_delay
对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000;

healthcheck_timeout
进行一次健康检测的超时时间,单位为毫秒,默认值2000;

healthcheck_failcount
对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器;

healthcheck_send
为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: www.zhou123.com';

healthcheck_expected
期望从后端服务器收到的响应内容;如果未设置,则表示从后端服务器收到200状态码即为正确;

healthcheck_buffer
健康状态检查所使用的buffer空间大小;

healthcheck_status
通过类似stub_status的方式输出检测信息,使用方法如下:
location /stat {
healthcheck_status;
}

一个例子:
在配置文件中写上如下内容:
http {
...
...

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
upstream myload {
server 172.16.35.2;
server 172.16.35.3 weight=2;
healthcheck_enabled;
healthcheck_delay 1000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send "GET /.health.html HTTP/1.0"; ## 这个是检测网页,这个网页的内容不作要求。只要这个网页存在即可。
}

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://myload; 
}

location /stat {
healthcheck_status;
} ##############这个可以查看状态;
在浏览器中输入:http://192.168.35.1/stat
 下图是测试的结果:


上图是两个服务器都正常的情况的结果。

当有一个服务器挂了就会显示如下的结果:



OK! 这些关于Nginx服务器反向代理的应用,就先说到这吧。
  有想了解的更多的最好在nginx的官方网站阅读nginx的文档。其文档是相当的详细,唯一缺点就这个是用英语写的,看的好不辛苦啊!英语不好,也是个大问题啊!要努力学习这个又爱又恨的英语。

相关文章推荐

浅谈什么是正向代理和反向代理,如何使用nginx搭建正向代理和反向代理

转自:http://mengkang.net/78.html

使用Nginx实现反向代理

一、代理服务器 1、什么是代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理...

nginx proxy反向代理兼内部重定向

nginx proxy反向代理兼内部重定向nginx proxy是nginx的王牌功能,利用proxy基本可以实现一个完整的7层负载均衡,它有这些特色:1、功能强大,性能超强,bug不多工作稳定。2、...

最简单实现跨域的方法----使用nginx反向代理

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 现在随着RESTFUL的流行,很多应用提供http/https接口的AP...
  • shendl
  • shendl
  • 2015年09月14日 18:54
  • 19607

最简洁的nginx反向代理例子配置

首先在nginx 的conf 目录下建立fzjh.conf 文件,由于默认的nginx.conf 比较重要,所以不在这里面修改配置,故建立一个新的文件作为例子。 然后在fzjh.conf 里面添加一...

Nginx应用场景(二)反向代理,负载均衡

关于http服务器,我在以前的篇博客里有这样的介绍 《nginx+ftp实现图片的上传与访问》在这里通过ftp上传图片,nginx作为图片服务器,这样就可以通过http访问服务器中的图片。     ...
  • lxy344x
  • lxy344x
  • 2016年07月22日 15:33
  • 1503

搭建nginx反向代理用做内网域名转发

基于域名的7层转发的实现(NAT+反向代理) 在实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分,这在实际使...
  • tham_
  • tham_
  • 2015年05月25日 20:10
  • 14261

利用Nginx实现tornado的反向代理

1.tornado的demo 首先写一个tornado的demo 在生产环境中,一般使用单个的进程启动,为了简单起见,这里我们使用multiprocessing模块启动多个进程,模拟生产环境 ...

Haproxy反向代理MySQL底层原理分析

Haproxy反向代理MySQL底层原理分析 最近研究了一下Haproxy反向代理的机制,它支持俩中模式的反向代理,有4层模式与7层模式。 @:使用7层模式作为Web代理,下面是官方的解释...

Nginx是什么,有什么优点?为什么选择Nginx做web服务器软件?

1、基础知识 代理服务器:     一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。应用比如:GoAgent,FQ神器.     一个完整的代理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Nginx作为反向代理的简单应用
举报原因:
原因补充:

(最多只允许输入30个字)