Nginx实现 反代并开启缓存+url地址重写+带RS健康状态检查的负载均衡
规划图如下
1.RS的准备
方便实验,rpm软件包安装,能使用ip访问网页即可
2.nginx的编译安装
# yum -y install pcre-devel
2.1首先添加用户nginx,实现以之运行nginx服务进程:
# groupadd -r nginx
# useradd -r -g nginx -s /bin/false -M nginx
2.2接着开始编译和安装:
- # ./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/ \
- --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi \
- --with-pcre
- # make && make install
3.反代的实现,和缓存的开启
3.1配置步骤
- #cd /etc/nginx
- # sed -i '/^[[:space:]]*#.*/d' nginx.conf
- # sed -i '/^$/d' nginx.conf
- # vim /etc/nginx/nginx.conf
- worker_processes 1;
- events {
- worker_connections 1024;
- }
- 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
- *$1:定义缓存存储目录,手动创建
- *$2:缓存级别,表示缓存目录的第一级目录是1个字符,第二级目录是2个字符
- *$3:内核中建立用于缓存缓存数据源数据的空间,查找缓存的时候,先从这个内核空间中找到,缓存数据的源数据,然后再到对应目录中查找缓存。
- max_size=2048m inactive=60m;
- *$1:缓存空间最大值
- *$2:缓存的数据,60分钟内没有被访问过就删除
- 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;
- }
- }
- #mkdir /var/www/cache
- #/usr/sbin/nginx /etc/nginx/nginx.conf
3.2验证结果
1)实验之前nginx的页面
2)反代192.168.1.104的页面
4.url的重写
4.1url重写的格式,写在配置文件中
rewrite regex replacement [flag]
$2 Regex:被代替的原URL路径,可以是莫须有的,不存在的,支持正则表达式
$3 Replacement:用来实现代替的URL路径,必须真实存在的
$4 Flag:标志位,定义URL重写后进行的操作,有4种,分别是:
1)last:匹配重写后的URL,再一次对URL重写规则进行匹配,当使用last的需要注意的是如下:
rewrite /images/.*\.jpg /images/a.jpg last;
这样写的话,将会造成死循环。
2)break:匹配重写URL后,终止匹配,直接使用
3)redirect:临时重定向,返回代码302
4)permanent:永久重定向,返回代码301
4.2简单实现url的重写
配置文件中的配置
- #vim /etc/nginx/nginx.conf
- location / {
- root html;
- index index.html index.htm;
- rewrite /abc http://192.168.1.104 break ;
- *根下并不创建abc这个目录,对着虚拟目录的访问都重写到192.168.1.104
- }
- location /text {
- rewrite / http://192.168.1.104 break;
- *在根下创建text目录,对其的访问都重写到192.168.1.104
- }
- kdir /var/html/text
5.nginx实现带健康状态检测的负载均衡
5.1nginx 要能够检测后端nginx的健康状态,需要新的模块,重新编译nginx
5.1.1模块的使用
healthcheck_nginx_upstreams.zip
- #unzip healthcheck_nginx_upstreams.zip
- # ln -s cep21-healthcheck_nginx_upstreams-16d6ae7 health
- *将解压出来的模块所在目录重命名,查看目录下README文件,了解此模块支持的nginx版本,我使用的这个模块对于nginx1.2.0以上的版本无效。
- #tar xf nginx-1.0.14.tar.gz
- #cd nginx-1.0.14
- 打上补丁:
- # patch -p1 < /root/health/nginx.patch
- patching file src/http/ngx_http_upstream.c
- Hunk #1 succeeded at 4296 (offset 3 lines).
- patching file src/http/ngx_http_upstream.h
- Hunk #1 succeeded at 110 (offset 1 line).
- patching file src/http/ngx_http_upstream_round_robin.c
- Hunk #1 succeeded at 5 (offset 1 line).
- Hunk #3 succeeded at 36 (offset 1 line).
- Hunk #5 succeeded at 390 (offset 1 line).
- Hunk #7 succeeded at 497 (offset 1 line).
- Hunk #9 succeeded at 633 (offset 1 line).
- patching file src/http/ngx_http_upstream_round_robin.h
- Hunk #1 succeeded at 27 (offset 1 line).
5.1.2进行重新编译安装
- # ./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/ \
- --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi \
- --with-pcre \
- --add-module=/root/health 指定模块所在的目录
- # make && make install
5.2带健康状态的负载均衡的实现
- #vim /etc/nginx/nginx.conf
- http {
- upstream cluster {
- server 192.168.1.104 ;
- server 192.168.1.105;
- *指定RS,后边可以跟weight N,添加权重,也可以IP:PORT指定端口实现端口映射
- 模块参数的配置:
- healthcheck_enabled;
- *启用此模块
- healthcheck_delay 1000;
- *对同一台RS两次检测之间的时间间隔,单位毫秒,默认为1000
- healthcheck_timeout 1000;
- *进行一次健康检测的超时时间,单位为毫秒,默认值2000
- healthcheck_failcount 3;
- *对同一台RS检测成功或失败多少次,才决定其成功或失败,并实现启用和禁用此服务
- healthcheck_send "GET /.health HTTP/1.0";
- *从RS上获得用于检测健康状态的文件,默认只支持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;
- location / {
- #proxy_set_header Host $http_host;
- *开启使用cip作为代理的请求地址,可省略
- proxy_pass http://cluster;
- *前面定义的upstream cluster
- #proxy_connect_timeout 3;
- *代理连接超时时间,可省略
- }
- location /stat {
- healthcheck_status;
- *可以通过查看这个目录,参看RS的状态信息
- }
- }
- }
- #mkdir /usr/html/stat
5.3.1分别在RS上创建文件,内容中的大小写要和配置文件中的一致
# echo 'ok' > /var/www/html/.health
5.3.2重启服务,进行验证
1)访问192.168.1.103/stat,
2)停止192.168.1.104上的web服务,超过配置文件中时间(超时时间*失败次数)后再进行查看192.168.1.103/stat