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实现反向代理

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

nginx服务器有什么作用以及什么是反向代理?

最近再用在配置Nginx,学习记录下。 一.背景介绍 1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。 Nginx是一款轻量级...
  • ysmh2008
  • ysmh2008
  • 2017-06-24 09:26:01
  • 994

nginx 之 反向代理理解

nginx反向代理配置 什么是代理 代理在普通生活中的意义就是本来应该你做的事情,你让别人代你做了,那么那个帮你做的人就是你的代理。而在计算机网络中代理的概念差不多,就是本来要客户端要做的网络访问...
  • zhongzh86
  • zhongzh86
  • 2017-04-14 15:57:40
  • 2700

Nginx作为反向代理

1. 反向代理简介Nginx可以作为反向代理,接收客户端的请求,并向上游服务器发起新的请求。该请求可以根据客户端请求的URI,客户机参数或其他逻辑进行拆分,原始URL中的任何部分可以以这种方式进行转换...
  • huwh_
  • huwh_
  • 2017-09-07 21:24:22
  • 208

正向代理与反向代理的区别【Nginx读书笔记】

正向代理的概念正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代理...
  • m13666368773
  • m13666368773
  • 2012-10-11 14:51:45
  • 157485

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

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

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

一、反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并...
  • yzh_2017
  • yzh_2017
  • 2016-12-17 13:23:54
  • 4054

nginx 反向代理 解决非80端口映射

写法一: http { include mime.types; default_type application/octet-stream; sendfile ...
  • OXiaoMianYiJiu
  • OXiaoMianYiJiu
  • 2016-04-27 18:40:54
  • 6001

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

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

一分钟搞定 Nginx反向代理 nginx域名代理

  • 2013年05月22日 11:38
  • 1.04MB
  • 下载
收藏助手
不良信息举报
您举报文章:Nginx作为反向代理的简单应用
举报原因:
原因补充:

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