【Nginx】概念及原理

Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

Nginx官网:

http://nginx.org/

http://nginx.org/en/docs/

Nginx几个重要的概念

1、反向代理

Nginx一般作为反向代理服务器来实现反向代理来转发处理请求,同时也可以作为静态资源服务器来加快静态资源的获取和处理。

正向代理:

【Nginx】概念及原理

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的作用:访问原来无法访问的资源(例如你要*才能访问外国某些网站);可以做缓存,加速访问资源;对客户端访问授权,上网进行认证;代理可以记录用户访问记录,对外隐藏用户信息

反响代理:

【Nginx】概念及原理

反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理的作用:保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击;负载均衡,通过反向代理服务器来优化网站的负载。

2、负载均衡

Nginx负载均衡策略主要有 轮询,加权轮询,最少连接数以及IP Hash

轮询策略

实现请求的按顺序转发,即从服务srv1--srv2--srv3依次来处理请求

【Nginx】概念及原理

加权轮询策略

请求将按照服务器的设置权重来实现请求转发和处理,如下所示,最终请求处理数将为3:1:1

【Nginx】概念及原理

最少连接数策略

请求将转发到连接数较少的服务器上

【Nginx】概念及原理

Ip Hash策略

web服务需要共享session,使用该策略可以实现某一客户端的请求固定转发至某一服务器

【Nginx】概念及原理

轮询只是简单实现请求的顺序转发,并没有考虑不同服务器的性能差异;加权轮询设置了初始时服务器的权重,但是没有考虑运行过程中的服务器状态;IP Hash保证同一个客户端请求转发到同一个后台服务器实现了session保存,然而当某一后台服务器发生故障时,某些客户端将访问失败;最少连接数只是考虑了后端服务器的连接数情况,并没有完全考虑服务器的整体性能。

动态负载均衡

动态负载均衡策略类似于加权轮询策略,可以通过对于后端服务器集群的状态监测,量化不同服务器的性能差异,来周期性调整服务器的比重来实现权重的动态调整。

可以通过consul+nginx-upsync-module模块来实现权重的动态调整

利用consul模块来实现权重服务的配置信息

nginx周期性从consul中读取配置信息来动态改变权重

consul安装

下载consul:https://releases.hashicorp.com/consul

可提前准备下面三个软件:

【Nginx】概念及原理

【Nginx】概念及原理

关闭防火墙:

【Nginx】概念及原理

启动consul:    ./consul agent -advertise=10.112.99.152 -client=0.0.0.0 -dev 

【Nginx】概念及原理

访问图形化界面:  http://10.112.99.152:8500

nginx安装

http://nginx.org/download/

解压:tar -zxvf nginx-1.9.10.tar.gz

配置环境

【Nginx】概念及原理

nginx-upsync-module安装  

https://github.com/weibocom/nginx-upsync-module

解压该模块:

unzip nginx-upsync-module-master.zip

将nginx-upsync-module编译到nginx中

cd nginx-1.9.10

安装第三方库

yum -y install openssl openssl-devel

注意下面安装路径应与上面路径对应

./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-http_realip_module --http-client-body-temp-path=/data/dynamic/nginx/client/ --http-proxy-temp-path=/data/dynamic/nginx/proxy/ --http-fastcgi-temp-path=/data/dynamic/nginx/fcgi/ --http-uwsgi-temp-path=/data/dynamic/nginx/uwsgi --http-scgi-temp-path=/data/dynamic/nginx/scgi --with-pcre --add-module=../nginx-upsync-module-master

./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-http_realip_module --http-client-body-temp-path=/data/dynamic/nginx/client/ --http-proxy-temp-path=/data/dynamic/nginx/proxy/ --http-fastcgi-temp-path=/data/dynamic/nginx/fcgi/ --http-uwsgi-temp-path=/data/dynamic/nginx/uwsgi --http-scgi-temp-path=/data/dynamic/nginx/scgi --with-pcre --add-module=../nginx-upsync-module-master

【Nginx】概念及原理

【Nginx】概念及原理

make && make install  编译成功

动态负载均衡配置

nginx配置文件:

upstream test {
        server 127.0.0.1:11111;
        upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
        include /usr/local/nginx/conf/servers/servers_test.conf;
    }
  
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
        location = / {
            proxy_pass http://test;
        }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

启动nginx服务,如果报错

【Nginx】概念及原理

则添加nginx用户

useradd nginx -s /sbin/nologin -M

再次启动

/usr/local/nginx/sbin/nginx

在服务器的8088,8089端口启动两个tomcat

【Nginx】概念及原理

【Nginx】概念及原理

向consul中写入后端服务器信息:

curl -X PUT http://10.112.99.152:8500/v1/kv/upstreams/test/10.112.99.152:8088

curl -X PUT http://10.112.99.152:8500/v1/kv/upstreams/test/10.112.99.152:8089

观察配置文件:

cat /usr/local/nginx/conf/servers/servers_test.conf
【Nginx】概念及原理

此时访问ip实习负载均衡,可以通过改变consul中数据来实现服务器数量以及权重的改变

其余consul中参数配置命令:

upsync参数:  配置consul   key  value  后端服务器ip  port 权重

syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=second/minutes] [upsync_timeout=second/minutes] [strong_dependency=off/on]

The parameters' meanings are:

upsync_interval

pulling servers from consul/etcd interval time.

upsync_timeout

pulling servers from consul/etcd request timeout.

upsync_type

pulling servers from conf server type.

strong_dependency

when strong_dependency is on, nginx will pull servers from consul/etcd every time when nginx start up or reload.

upsync_dump_path参数: 保存consul配置信息

syntax: upsync_dump_path $path

default: /tmp/servers_$host.conf

context: upstream

description: dump the upstream backends to the $path.

利用http命令向consul中写入后端服务器以及权重信息:

增加服务器指令:  默认权重  以及添加权重
 

curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
default: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
    curl -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
or
    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend

删除服务器:

curl -X DELETE http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port

调整服务器权重:

curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
or
    curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port

标记服务器停止服务:

  curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
or
    curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port

检查服务器状态:

nginx管理命令如下:

nginx文件目录: /usr/local/nginx/

配置文件: /usr/local/nginx/conf/nginx.conf

服务器配置信息:/usr/local/nginx/conf/servers/servers_test.conf

nginx操作指令:
【Nginx】概念及原理