1.正向代理与反向代理的区别?

正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。正向代理的典型用途为在防火墙内的局域网客户端提供访问Internet的途径.

nginx动态代理,负载均衡学习_第1张图片

反向代理:反向代理是代理服务器的一种,服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址或者域名,而不知道在代理服务器后面的服务器簇的存在.

nginx动态代理,负载均衡学习_第2张图片

2.nginx概述

Nginx是一款优秀的反向代理服务器程序,能够为若干台服务器提供反向代理服务,一方面为客户端提供的统一的访问地址,另一方面为后台多个服务器提供了负载均衡的能力。Nginx是目前最主流的反向代理服务器,能够提供可靠的负载均衡、动静分离的能力。
        a. 下载地址
            http://nginx.org/en/download.html
        b. 安装
            将下载好的安装包解压到一个没有中文没有空格的目录下即可。
        c. windows下常用命令
            验证配置是否正确: nginx -t
            查看Nginx的版本号:nginx -V
            启动Nginx:start nginx
            快速停止或关闭Nginx:nginx -s stop
            正常停止或关闭Nginx:nginx -s quit
            配置文件修改重装载命令:nginx -s reload
        d. 配置
            nginx的工作是基于[conf/nginx.conf]配置文件来进行的。
            nginx.conf的配置结构:
                http{ #代表处理http请求
                         #配置一个虚拟服务器
                        server{
                                #此虚拟服务器接收对80端口的访问
                                listen 80; 
                                #此虚拟服务器接收对localhost主机名的访问
                                server_name localhost; 
                                #当访问/user资源时由此配置处理
                                location /user{
                                        规则
                                }
                                #当访问/order资源时由此配置处理
                                location /order{
                                        规则
                                }
                                ...
                        }

                        #其他Server配置
                        server ...
                        ...
                }

3.nginx案例实现请求转发

通过Nginx实现请求转发,通过配置nginx.conf转发策略,使得本来访问tomcate:8080端口转交由访问nginx:8088端口
        当客户端访问http://www.aaa.com时,由nginx转发给http://127.0.0.1:8080端口进行处理
        配置hosts文件
            127.0.0.1 www.aaa.com
        在nginx.conf中配置
            http{
                    #为nginx配置一个虚拟服务器,
                    server {
                            #监听本机8088端口
                            listen 8088;
                            #接收对www.aaa.com主机名的访问
                            server_name www.aaa.com;
                            #对/即任意路径的访问进行处理
                            location / {
                                    #转发到指定地址,tomcate访问地址
                                    proxy_pass http://127.0.0.1:8080;
                            } 
                            #可以配置多个location
                            ...
                    }
                    #可以配置多个server
                    ...
            }
        启动 tomcat
            startup.bat
        启动nginx
            start nginx

nginx动态代理,负载均衡学习_第3张图片

4. location路径配置和匹配规则

        a. location路径的写法
        在配置虚拟服务器时,可以配置多个location,指定不同路径采用不同的处理方案,location支持多种写法,规则如下:
        1.  =   =/aaa/1.jpg 路径严格匹配,路径必须一模一样才会匹配到
        2.  ^~  ^~/aaa  只要是指定路径开头的路径都可以匹配
        3.  ~   ~.png$  区分大小写按正则匹配路径
        4.  ~*  ~*.png$ 不区分大小写按正则匹配路径
        5. /    /   通用匹配,所有路径都可以匹配到
        b. location路径配置的优先级
        由于location的路径配置非常灵活,所有有可能一个路径被多个location所匹配,此时按照如下规则判断匹配优先级:
            • 首先匹配 =
            • 其次匹配 ^~
            • 其次是按文件中顺序的正则匹配
            • 最后是交给 / 通用匹配
            • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求
            ----总的规律是,精度越高优先级越高
        案例:
        location = / {
                     #规则A
                            }
        location = /login {
                    #规则B
                            }
        location ^~ /static/ {
                     #规则C
                            }
        location ~ \.(gif|jpg|png|js|css)$ {
                    #规则D
                            }
        location ~* \.png$ {
                             #规则E
                        }
        location / {
                             #规则F
                        }
     访问根目录 /, 比如 http://localhost/ 将匹配规则 A
     访问 http://localhost/login 将匹配规则 B
     http://localhost/register 则匹配规则 F
     访问 http://localhost/static/a.html 将匹配规则 C
     访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则 D和规则 E,但是规则 D 顺序优先,规则 E不起作用
     http://localhost/static/c.png则优先匹配到规则 C
     访问 http://localhost/a.PNG 则匹配规则 E,而不会匹配规则 D,因为规则 E 不区分大小写
     访问 http://localhost/category/id/1111 则最终匹配到规则 F

5. Ngnix的负载均衡策略

    nginx在分发资源到后端服务器时,如何分配请求是可以配置的,称之为nginx的负载均衡策略。
        轮询  默认不配置就是轮询   连接请求轮流分配给后端服务器
        http{ 
                            upstream sampleapp { 
                            server <>; 
                            server <>; 
                            } 
                            .... 
                            server{ 
                                    listen 80; 
                                    ... 
                                    location / { 
                                            proxy_pass http://sampleapp; 
                            }  
                    } 
        ip哈希    ip_hash;    abs(客户端ip.hash())%服务器数量,根据余数决定连接请求去往哪个服务器
        http{ 
                            upstream sampleapp { 
                            ip_hash; 
                            server <>; 
                            server <>; 
                            } 
                            .... 
                            server{ 
                                    listen 80; 
                                    ... 
                                    location / { 
                                    proxy_pass http://sampleapp; 
                            }  
                    } 
        最少连接    least_conn; 将连接请求分配给目前连接数最少的服务器
        http{ 
                            upstream sampleapp { 
                            least_conn; 
                            server <>; 
                            server <>; 
                            } 
                            .... 
                            server{ 
                                    listen 80; 
                                    ... 
                                    location / { 
                                    proxy_pass http://sampleapp; 
                            }  
                    } 
        基于权重    直接在地址后配置weight=x    根据权重进行分配,权重值越大,被分配的连接越多。可以直接配置为down,则不再分配连接。    
        http{ 
                            upstream sampleapp { 
                                    server <> weight=2; 
                                    server <> weight=5; 
                                    server <> down;
                            } 
                            .... 
                            server{ 
                                    listen 80; 
                                    ... 
                                    location / { 
                                    proxy_pass http://sampleapp; 
                            } 
                    } 

7. Nginx的动静分离实现

        a. 动静分离原理
        动 --> 动态资源  --> servlet jsp --> 程序 
        静 --> 静态资源 --> jpg mp3 mp4 html css js --> 文件 
        tomcat能够处理动态和静态资源,但本质上是为处理动态资源而设计的服务器,过多静态资源交由tomcat管理会降低tomcat处理动态资源的能力,得不偿失。

        nginx本身无法处理动态资源,但可以处理静态资源,而且性能优良。

        因此可以将静态资源和动态资源拆分,将静态资源交由ngin处理,动态资源仍由tomcat处理,从而解放了tomcat对动态资源的处理能力,整体上实现动静分离,提升了效率。
        b. 动静分离实现
        配置方式:
            server {
                    listen 8088;
                    server_name www.aaa.com;
                    location / {
                            #root可以指向nginx服务器中的本地磁盘地址
                            #静态文件就放置在这个磁盘地址中
                            #之后对server中资源的访问会被转换到对本地磁盘资源的访问
                                                #www.aaa.com/aaa/bbb/1.html-->d://html/aaa/bbb/1.html
                            root D://html;
                            #默认访问的首页配置
                            index index.html;
                    } 
            }