300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

时间:2019-08-21 22:34:49

相关推荐

nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。

废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)搭建过程做一记录:

一、后端的Real Server的准备

两台RS服务器(192.168.1.104/192.168.1.105)要事先配置好nginx。

并且nginx访问均是用ip访问即可,方便实验效果!

二、nginx代理服务器192.168.1.103(假设外网ip是111.112.114.23)的配置

1.nginx反向代理和缓存

0)安装依赖软件(如果是ubuntu系统,则sudo apt-get update && sudo apt-get upgrade && sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential openssl libssl0.9.8 libssl-dev)

[root@node1 ~]# yum install -y pcre pcre-devel openssl openssl-devel gcc

1)首先添加用户nginx,实现以之运行nginx服务进程:

[root@node1 ~]# groupadd -r nginx

[root@node1 ~]# useradd -r -g nginx -s /bin/false -M nginx #-M参数表示创建用户时不创建用户家目录

2)接着开始编译和安装:

[root@node1 ~]# cd /usr/loca/src

[root@node1 src]# wget /download/nginx-1.8.0.tar.gz

[root@node1 src]# tar -zxvf nginx-1.8.0.tar.gz

[root@node1 src]# cd nginx-1.8.0

[root@node1 nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre

[root@node1 src]# make && make install

#以上编译安装nginx后,--http-client-body-temp-path、--http-proxy-temp-path、--http-fastcgi-temp-path、--http-uwsgi-temp-path、--http-scgi-temp-path默认的路径就在/usr/local/nginx下,分别是client_body_temp、proxy_temp、fastcgi_temp、scgi_temp、uwsgi_temp

[root@node1 src]# cd /usr/local/nginx/

[root@node1 nginx]# ls

conf html logs sbin

[root@node1 nginx]# /usr/local/nginx/sbin/nginx //nginx启动后,就会出现下面的目录

[root@node1 nginx]# ls /usr/local/nginx/

client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp

3)反代的实现,和缓存的开启(可参考:nginx缓存配置的操作记录梳理)

[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf

worker_processes 1;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

#要想开启nginx的缓存功能,需要添加此处的两行内容!

#这一行分别表示:定义缓存存储目录,手动创建;缓存级别,表示缓存目录的第一级目录是1个字符,第二级目录是2个字符;内核中建立用于缓存缓存数据源数据的空间,查找缓存的时候,先从这个内核空间中找到,缓存数据的源数据,然后再到对应目录中查找缓存;这一行分别表示:缓存空间最大值;缓存的数据,60分钟内没有被访问过就删除

proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20mmax_size=2048m inactive=60m;

#这一行分别表示:创建缓存的时候可能生成一些临时文件存放的位置,自动创建

proxy_temp_path /var/www/cache/tmp;

server {

listen 80;

server_name localhost;

location / {

#root html;

#index index.html index.htm;

proxy_pass http://192.168.1.104/; #代理哪个web服务器

proxy_cache mycache; #内存缓存源数据空间名字,对应我们前面的设定

proxy_cache_valid 200 302 60m; #页面返回码为200 302 的缓存60分

proxy_cache_valid 404 1m; #页面错误响应吗404缓存时间1分

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

[root@node1 src]# mkdir /var/www/cache

[root@node1 src]# /usr/local/nginx/sbin/nginx

4)验证结果

访问http://111.112.114.23,则显示的是http://192.168.1.104的访问结果(如上配置,RS2的反向代理类似)

---------------------------------------------------------------------------------------------------------

再看如下的一个实例配置(nginx.conf文件中已开启缓存功能)(max_fails默认值为1,fail_timeout默认值为10s,连接失败的情形由proxy_next_upstream 指定)

?

proxy_set_header参数解释

?

---------------------------------------------------------------------------------------------------------

2.url的重写

-----------------------------------------------------------------------------

介绍下url重写的格式,写在配置文件中

rewrite regex replacement [flag]

Regex:被代替的原URL路径,可以是莫须有的,不存在的,支持正则表达式

Replacement:用来实现代替的URL路径,必须真实存在的

Flag:标志位,定义URL重写后进行的操作,有4种,分别是:

a)

last:匹配重写后的URL,再一次对URL重写规则进行匹配,当使用last的需要注意的是如下:

rewrite /images/.*\.jpg /images/a.jpg last;

这样写的话,将会造成死循环。

b)

break:匹配重写URL后,终止匹配,直接使用

c)

redirect:临时重定向,返回代码302

d)

permanent:永久重定向,返回代码301

-----------------------------------------------------------------------------

下面是nginx配置文件中的配置,简单实现url的重写配置(可以在vhosts虚拟主机配置里设置)

[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf

...............

server {

listen 80;

server_name localhost;

root /var/www/html;

index index.html index.htm;

location / {

rewrite /abc break;#本机站点目录下并不需要创建abc这个目录,对其的访问都重写到

}

location /text {

rewrite / break; #本机站点目录下不需要创建text目录,对其的访问都重写到

}

}

[root@node1 src]# mkdir /var/www/html/text

注意:

nginx的rewrite重写规则后的url必须要是能在外网访问的真实url!

这一点要和nginx的反向代理区别开,proxy_pass代理后的url可以是内网访问,在内网之间代理!

3.nginx实现带健康状态检测的负载均衡

nginx要能够检测后端nginx的健康状态,需要新的模块,重新编译nginx

模块的使用:healthcheck_nginx_upstreams-master.zip

下载模块,下载到本机的/usr/loca/src目录下

下载地址:/s/1o8IrpbG

提取密码:vp4y

[root@node1 ~]# cd /usr/local/src

[root@node1 src]# unzip healthcheck_nginx_upstreams-master.zip

[root@node1 src]# ll healthcheck_nginx_upstreams-master

接下来切换到nginx解压目录,打补丁~

[root@node1 src]# cd nginx-1.8.0

[root@node1 nginx-1.8.0]# patch -p1 < ../healthcheck_nginx_upstreams-master

然后重新编译nginx,加上healthcheck_nginx_upstreams-master模块

[root@node1 nginx-1.8.0]# ./configure --prefix=/usr/loca/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --add-module=/usr/local/src/healthcheck_nginx_upstreams-master

[root@node1 src]# make && make install

接下来配置实现nginx带健康状态的负载均衡:

[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf

..................

..................

upstream cluster {

server 192.168.1.104 weight=1;

server 192.168.1.105 weight=1;

healthcheck_enabled;

healthcheck_delay 1000;

healthcheck_timeout 1000;

healthcheck_failcount 3;

healthcheck_send "GET /.health HTTP/1.0";

#healthcheck_expected 'I_AM_ALIVE'; #从RS上收到的http body部分的响应内容,如果未设置,则表示从后端服务器收到200状态码即可,这里我们不启用

# Optional supervisord module support

#supervisord none;

#supervisord_inherit_backend_status;

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.php index.html index.htm;

proxy_pass http://cluster;

}

location /stat {

healthcheck_status;

}

}

----------------------------------------------------------------------------------------

上面参数解释:

upstream cluster //定义后方的服务器群组

Server 192.168.1.104 weight=1 //指明后方的一台服务器地址,权重设置为1;也可以IP:PORT指定端口实现端口映射

Server 192.168.1.105 weight=1 //指明后方的另一台服务器地址,权重设置为1

healthcheck_enable //开启健康探测功能

healthcheck_delay 1000 //设置健康检测的时延;即对同一台RS两次检测之间的时间间隔,单位毫秒,默认为1000

healthcheck_timeout 1000//设置一次健康检测的超时时间

healthcheck_failcount 1//后方某台服务器有一次检测不到即视为宕掉;即对同一台RS检测成功或失败多少次,才决定其成功或失败,并实现启用和禁用此服务

healthcheck_send "GET /.health HTTP/1.0" //使用GET方法访问后方服务器站点下的.health来进行探测;即从RS上获得用于检测健康状态的文件,默认只支持http1.0协议

proxy_pass http://cluster //与upstream cluster相对应,在访问http://111.112.114.23时将流量转发到cluster组内机器上

location /stats//定义一个站点,用来查看后方服务器的健康状况

----------------------------------------------------------------------------------------

最后,重启nginx

[root@node1 src]# /usr/local/nginx/sbin/nginx -s reload

测试:

假如:

RS1机器上访问的结果是“welcome to 192.168.1.104”

RS2机器上访问的结果是“welcome to 192.168.1.105”

访问http://111.112.114.23,第一次出现的如果是RS1的访问结果,那么再刷一下,就会出现RS2的访问结果,这样就看出了负载均衡的效果。

可以查看后端两台Real Server服务器的健康状态:

访问http://111.112.114.23/stat即可!

关闭RS1的nginx服务,再次访问http://111.112.114.23/stat查看后端机器状态,就会发现RS1的健康状态已提示Bad,即显示后端的192.168.1.101的RS1不能正常连接。

这样就实现了负载均衡和健康探测,但依然不能满足高并发量,再次用ab进行测试:

但是,这样通过nginx代理可以满足的最大连接请求依然没有直接访问RS的大!

这个通过下面结果可知:

[root@node1 src]# ab -c 100 -n 10000 http://192.168.1.104/test.jpg

[root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg

继续做优化!如下:

[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=24h;

proxy_temp_path /var/www/cache/tmp;

upstream cluster {

server 192.168.1.104 weight=1;

server 192.168.1.105 weight=1;

healthcheck_enabled;

healthcheck_delay 1000;

healthcheck_timeout 1000;

healthcheck_failcount 3;

healthcheck_send "GET /.health HTTP/1.0";

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.php index.html index.htm;

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;

proxy_pass http://cluster;

}

location /stat {

healthcheck_status;

}

}

--------------------------------------------------------------

参数解释:

proxy_cache_path //设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。 levels参数定义了缓存的层次结构。

proxy_set_header //允许重新定义或者添加发往后端服务器的请求头。

proxy_cache //指定用于页面缓存的共享内存。

proxy_cache_valid //为不同的响应状态码设置不同的缓存时间。

proxy_cache_use_stale //指定后端服务器出现状况时,nginx可以使用的过期缓存

---------------------------------------------------------------

接着重启nginx服务

[root@node1 src]# /usr/local/nginx/sbin/nginx -s reload

[root@node1 src]# mkdir /var/www/cache#这个前面做缓存时,已经创建了。

再次进行压力测试,可以看到通过nginx代理可以满足的最大连接请求已经达到了5000多,超过了直接访问RS的最大连接请求了!

这样负载均衡+健康探测+缓存已经完成!

[root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg

接下来一个问题就是在启用缓存之后的访问问题,试着重新访问一下该站点http://111.112.114.23:

即第一次访问http://111.112.114.23时访问到了192.168.1.104(即RS1),显示结果是:“welcome to 192.168.1.104”,前端nginx将本次的访问结果放入本地缓存,在缓存未失效之前,访问http://111.112.114.23时实际上是nginx的本地缓存提供的访问结果,依然显示“welcome to 192.168.1.104”的页面。

可以试着多刷新几次,可以发现再怎么刷新页面内容依然是“welcome to 192.168.1.104”!

这就证明现在访问到的是nginx缓存在本地的结果!

看看缓存目录中有没有内容

[root@node1 src]# ll /var/www/cache#发现缓存目录下已经有了缓存结果;可以将这个缓存结果清除,再次刷次页面,就会是新页面了。

total 4

drwx------ 3 nginx nginx 4096 Sep 18 16:44 e

[root@node1 src]#

***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。