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

对于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的文档。其文档是相当的详细,唯一缺点就这个是用英语写的,看的好不辛苦啊!英语不好,也是个大问题啊!要努力学习这个又爱又恨的英语。