dtcms模板 Tomcat 阿里巴巴 github post mvvm ide jtable rss lazyloadjs HammerJS vue过滤器 sql数据库教学视频 seo教程下载 nginx教程视频 matlab读取dat文件 python程序界面 eclipse闪退 mysql错误代码1064 oracle重命名表名 python断言assert实例 python如何注释 python调用方法 python新手教程 python循环语句 python自学入门 python可视化编程 java替换字符 java中string的方法 linux教程 html实例教程 java电子书下载 js删除节点 python的用途 fireworks8 selinux关闭 司司网吧 深入解析windows操作系统 梦想世界科举答案 屏幕录像机
当前位置: 首页 > 学习教程  > 编程语言

一文明白 Nginx 中的反向代理,负载均衡,动静分离

2020/7/24 9:47:29 文章标签:

一. 概述:

Nginx 是一个高性能的 HTTP 和反向代理服务器 特点是占有内存少,并发能
力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx,网站用户有:百度、京东、新浪、网易、腾讯、淘宝等.

二. nginx的应用

1. 反向代理:

有反向代理,相对来说,就有正向代理,如果把局域网外的Internet 想象成一个巨大的资源库则局域网中的客户端要访问 Internet ,则需要通过代理服务器来访问,这种代理服务就称为正向代理.如下图,我们在大陆是无法直接访问谷歌的,这个时候,我们就需要一个代理服务器,来帮助我们来连接谷歌,这就被成为正向代理,
反向代理描述

那什么是反向代理呢?

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
反向代理

2. 负载均衡:

通俗来讲就是将负载通过规则分发到不同的服务器上.

在这里插入图片描述

3. 动静分离:

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

nginx动静分离

三. nginx安装

此处以Centos 7 举例说明:

1. 安装所需要的依赖:

#安装gcc
yum -y install gcc

#nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库。
yum install -y pcre pcre-devel

#zlib安装,nginx使用zlib对http包的内容进行gzip.
yum install -y zlib zlib-devel

# 安装OpenSSL
yum install -y openssl openssl-devel

#安装wget
yum install wget

2. 安装nginx:

访问http://nginx.org/en/download.html ,找到对应的版本安装.
在这里插入图片描述

此处以1.12.2版本举例,下载命令:

wget -c http://nginx.org/download/nginx-1.12.2.tar.gz

解压缩:

tar -xzf nginx-1.12.2.tar.gz -C /usr/local/

进入/usr/local/nginx-1.12.2目录,执行以下命令:

./configure

#编译并安装
make && make install

3. 启动nginx:

进入nginx中的sbin目录下,执行nginx脚本启动.

在这里插入图片描述

防火墙开启80端口:

#查看开放的端口号
firewall-cmd --list-all
#设置开放的端口号
firewall-cmd --add-service=http –permanent 
sudo firewall-cmd --add-port=80/tcp --permanent
#重启防火墙
firewall-cmd –reload

4. 测试访问:

在这里插入图片描述

5. nginx 常用的命令:

以下命令需要在nginx/sbin 目录下执行

#启动命令
 ./nginx
#关闭命令
./nginx -s stop
#重新加载:
./nginx -s reload
#查看版本号:
./nginx -v

6. nginx配置文件说明:

nginx 的配置文件其默认位置都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改.

查看配置文件:
在这里插入图片描述

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:

//第一部分,全局块
worker_processes  1;


//第二部分:events 块
events {
    worker_connections  1024;
}


//第三部分:http 块
/*
http  块也可以包括 http 全局块、server 块。

*/
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

各部分的作用.

⑴. 全局块:

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

比如第一行:

#这是Nginx服务器并发处理服务的关键配置
#worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
worker_processes  1;
⑵. events 块:

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

比如下面这一段:

#这部分的配置对  Nginx 的性能影响较大,在实际中应该灵活配置。
#work process 支持的最大连接数为 1024.
events {
    worker_connections  1024;
}
⑶. http 块:

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

http 块也可以包括 http 全局块、server 块。

①. http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

②. server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  • 全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

  • location 块

一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

本段内容摘至 https://www.cnblogs.com/knowledgesea/p/5175711.html

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

以及配置文件详解:

本段内容摘至 https://www.cnblogs.com/knowledgesea/p/5175711.html

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

四. nginx反向代理:

1. 启动一个tomcat.

2.修改配置文件:

在server 中增加一个字段, proxy_pass http://10.0.0.95:8080;

server {
        listen       80;
        server_name  127.0.0.1;

        location / {
            root   html;
            proxy_pass http://10.0.0.95:8080;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

此时,客户端访问nginx的时候,nginx会转发到tomcat,得到数据之后再响应给客户端.客户端是不知道自己其实是访问了tomcat.
在这里插入图片描述

3. 反向代理多个服务器:

修改nginx.conf配置文件,增加两个location:

server {
        #监听80端口
        listen       80;
        #server名称,可以将ip作为名字,方便区分
        server_name  10.0.0.171;
           
           #  ~ /test01  正则,大小写匹配  访问test01的时候走的代理
           location ~ /test01{
            #请求http://127.0.0.1/edu会被转发到下面的地址
            proxy_pass http:10.0.0.171:8080;
        }
            #  ~ /test02  正则,大小写匹配,  访问test02的时候走的代理
           location ~ /test02{
            #转发地址
            proxy_pass http:10.0.0.95:8080;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

4. 访问测试:

访问 http:10.0.0.95/test01/index.html
在这里插入图片描述

访问 http:10.0.0.95/test01/index.html
在这里插入图片描述

在这里插入图片描述

5. location 指令说明:

 location [ = | ~ | ~* | ^~  ] uri {
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的  uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
}

五. 负载均衡

1. 准备两个tomcat.

2. 修改nginx.conf配置文件:

http {
    include       mime.types;
    default_type  application/octet-stream;
    #添加一个upstream ,并为其命名,将你的服务器按照 server 地址 的格式书写,
    upstream myserver{
        server 10.0.0.95:8080;
        server 10.0.0.171:8080;
    }
    
    server {
        listen       80;
        server_name  10.0.0.171;
 
           location / {
            root   html;
            #将地址修改为upstream 的名称;
            proxy_pass http://myserver;
            index  index.html index.htm;
        }
        
        }
    }

3. 访问测试:

每次访问都会在不同的服务器中切换:
在这里插入图片描述
在这里插入图片描述

4. 设置权重:

就真实生产环境而言,服务器可能有的配置高一点,有配置差一点的,这个时候,我们就可以把配置高性能强的权重设置高一点,性能低的权重设置低一些,这样,负载均衡的时候,权重高的会分配的请求多一些.

upstream myserver{
    #数字越大,权重越高.
    server 10.0.0.95:8080 weight=5;
    server 10.0.0.171:8080 weight=1;
}

5. nginx负载均衡的策略:

1、轮询(默认):

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

#默认的负载均衡策略
upstream [服务器组名称]{
  server [IP地址]:[端口号];
  server [IP地址]:[端口号];
  ....
}
2、weight

weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream [服务器组名称]{
   #假如我们有一台服务器性能比较强,我们可以把权重调高,反之亦然,此策略可以和least_conn策略、iphash策略结合使用;
  server [IP地址]:[端口号] weight=2;
  server [IP地址]:[端口号];
  ....
}
3、ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,此策略适合有状态服务的程序,比如session。 例如:

upstream [服务器组名称]{
 #添加ip_hash之后,每台机器访问过后会一直访问这台服务器.
  ip_hash;
  server [IP地址]:[端口号] weight=2;
  server [IP地址]:[端口号];
  ....
}
4 、最少连接方式:

最少连接方式,把请求发给连接数最少的后端服务器。

upstream [服务器组名称]{
#将负载均衡策略设置为least_conn的时候,nginx会优先分配连接最少的服务器,但同时会考虑权重.
  least_conn;
  server [IP地址]:[端口号] weight=2;
  server [IP地址]:[端口号];
  ....
}
5 、fair-响应时间方式:

响应时间方式,按照服务器端的响应时间来分配请求,响应时间短的优先分配。

#该方式需要安装第三方插件
upstream [服务器组名称]{
  server [IP地址]:[端口号] weight=2;
  server [IP地址]:[端口号];
  ....
  fair;
}
6、依据URL分配方式:

url分配方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以在缓存中读取。

#需要安装第三方插件
upstream [服务器组名称]{
  hash $request_uri;
  server [IP地址]:[端口号] weight=2;
  server [IP地址]:[端口号];
  ....
}

六. 动静分离

为了加快网站的解析速度,我们可以把动态页面和静态页面由不同的服务器来解析,加快解析速
度。降低原来单个服务器的压力。

nginx动静分离

1. 修改配置文件:

           #当访问后缀为html|htm|gif|jpg|jpeg|png|js|css的时候,nginx会在 /usr/local/static目录中找对对应的文件
  location ~ .*\.(html|htm|gif|jpg|jpeg|png|js|css)$ {
            root   /usr/local/static;
           #给资源设置过期时间,适合不经常变动的资源,
            expires 3d;
        }
          #其他请求走tomcat,
          location / {
            proxy_pass http://10.0.0.95:8080;
        }
        

2. 测试:

静态请求:
在这里插入图片描述

动态请求:
在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_50146.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?