• Nginx反向代理


    1.简介

    Nginx是一个反向代理服务器,其启动速度极快、占用内存极少、抗高并发能力强,因此大量在互联网项目中应用。

    Nginx访问速度快的原因:

    1.动静分离,静态资源由Nginx直接进行管理,动态请求转发到后端。

    2.Worker进程中的线程是AIO的(异步非阻塞),当接收到一个请求后将其放入到队列中,然后继续处理下一个请求。

    3.能够指定Master和Worker之间的IO多路复用模型。

    2.关于正向代理与反向代理

    2.1 正向代理 

    正向代理,代理的是客户端,服务器并不知道客户端是通过VPN进行访问的。

    2.2 反向代理

    反向代理,代理的是服务器,客户端并不知道请求具体发送到哪一台服务器当中。

    3.Nginx的工作模型

    Nginx使用Master-Worker工作模型,一个Nginx服务由一个Master进程和多个Worker进程组成。

    3.1 Master进程

    Master进程负责读取nginx.conf配置文件以及管理Worker进程。

    3.2 Worker进程

    Worker进程负责处理连接和请求,且每个Worker进程中维护一个线程。

    4.Nginx常用功能

    4.1 通过Nginx管理静态资源

    location ~ .(gif|jpg|png|js|css)$ {
        root static;
    }

    *使用root表示返回静态资源,root指定资源的根目录(相对于Nginx安装目录)

    *当匹配到此Location后,会进入root指定的根目录,然后根据请求的/path访问静态资源。 

    4.2 通过Nginx进行反向代理到某个指定URL

    location = /baidu{
        proxy_pass  http://ip:port/adserving/baidu;
    }

    *使用proxy_pass表示反向代理,将用户的请求动态转发到某个URL。 

    *当使用了反向代理,那么对于Tomcat而言用户的IP即Nginx的地址,如果想要查看用户的IP,那么需要从Nginx日志中查看。

    4.3 通过Nginx实现负载均衡

    upstream name{
        server ip:port ;
        server ip:port ;
        server ip:port ;
    }
    
    location /path {
        proxy_pass  http://name;
    }

    *当使用了负载均衡,那么请求在动态转发时会携带请求的/path。 

    *当使用了负载均衡集群,那么要注意集群间Session的共享问题,可以将Session对象放入一个公共区域,当获取Session时从公共区域中查找。 

    关于Nginx中的负载均衡策略

    1.轮询

    当不指定weight时,各个服务器的权重相同,每个请求会按照访问的时间逐一分配到各个服务器中,如果服务器发生故障,能被自动剔除。

    upstream name{
        server ip:port ;
        server ip:port ;
        server ip:port ;
    }

    2.指定权重

    权重与访问率成正比,如果服务器发生故障,能被自动剔除。

    upstream name{
        server ip:port weight=1 ;
        server ip:port weight=2 ;
        server ip:port weight=3 ;
    }

    3.根据用户的IP进行Hash

    以用户的IP作为关键字K,通过H(K)散列函数计算出散列值,以该散列值坐落在Hash环上的位置,找到其对应处理的节点,如果服务器发生故障,不会自动被剔除。

    upstream name{
        ip_hash ;
        server ip:port ;
        server ip:port ;
        server ip:port ;
    }

    *如果使用根据用户的IP进行Hash的负载均衡策略,那么每个用户就固定访问后端的一个节点,就能避免集群间Session共享问题。

    5.Nginx配置

    #Nginx全局配置
    
    events {
        #Event事件配置
    }
    
    http {
        #HTTP全局配置
        server {
            #Server全局配置
            #Location配置
        }
    }

    5.1 Nginx全局配置

    Nginx全局配置主要包括:运行Nginx服务的所属组、 Worker进程的数量、错误日志存放路径、Master进程ID等。

    #指定运行Nginx的所属组
    user root;
    
    #worker进程数量(建议CPU数量 x 核数)
    work_processed 12;
    
    #错误日志存放路径(相对于Nginx安装目录)
    error_log logs/error.log;
    
    #Master进程ID的存放路径(相对于Nginx安装目录)
    pid logs/nginx.pid;

    5.2 Event事件配置

    Event事件配置主要包括: Worker进程处理连接与请求的细节、事件驱动模型的选择等。

    #设置多个Worker进程接收一个新连接的方式
    #当值为on时,当一个新的连接到达时,只有一个Worker进程被唤醒(默认)
    #当值为off时,当一个新的连接到达时,所有的Worker进程都被唤醒,共同争夺这个连接。
    accept_mutex on;
    
    #设置Worker进程一次是否能处理多个新的连接
    #当值为on时,Worker进程一次能够接收多个新的连接(默认)
    #当值为off时,Worker进程一次只能接收一个新的连接。
    multi_accept on;
    
    #事件驱动模型选择,可选select、poll、epoll、kqueue
    use epoll;
    
    #Worker进程最大连接数(默认512)
    worker_connections 1024;

    5.3 HTTP全局配置

    HTTP全局配置主要包括:请求的MIME类型、是否允许sendFile方式传输文件、负载均衡、长连接超时时间、长连接的最大请求数。

    #指定请求的MIME类型,可以指定多个
    types{
       text/html        html htm shtml;
       text/css         css;
       text/xml         xml;
       ......
    }
    
    #负载均衡
    upstream name{
        server ip:port;
        server ip:port;
        server ip:port;
    }
    
    #整个HTTP服务的访问日志(相对于Nginx安装目录),会应用到所有的Server中,并且指定日志打印的格式
    access_log logs/access_all.log main
    
    #定义日志的打印格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
    
    #设置是否允许sendFile传输文件
    sendFile on;
    
    #长连接的超时时间,若在指定时间内连接没有发送新的请求,那么该连接将会被关闭
    keepalive_timeout 600s;
    
    #长连接可发送的最大请求数,当连接累计发送的请求数到达指定大小时,连接将会被关闭
    keepalive_requests 1000;

    Nginx与客户端之间默认使用长连接。

    Nginx与后端服务器之间默认使用短连接,每次进行反向代理都需要建立一个新的短连接,如果系统对延时性有高要求的,可以开启Nginx与后端服务器之间使用长连接的方式。

    *可以在upstream中使用keepalive参数开启Nginx与后端服务器之间使用长连接的方式,keepalived指定连接池中连接的初始化个数,每个server对应一个连接池(基于host和port),在Master中共同进行维护,Nginx会根据实际情况调整连接池中的连接个数。

    *HTTP全局配置中的长连接参数只适用于Nginx与客户端之间的长连接,不适用于Nginx与后端服务器之间的长连接。

    5.4 Server全局配置

    Server全局配置主要包括:绑定基于域名或IP的虚拟主机、监听的TCP端口。

    #绑定基于域名或者IP的虚拟主机
    server_name 192.168.2.90;
    
    #监听的TCP端口
    listen 80;
    
    #整个Server的访问日志,并且指定日志打印的格式
    access_log logs/192.168.2.90.access.log main;
    
    #Nginx直接返回的指定状态码直接重定向
    error_page 404 500 502 /error.html

    *server_name只能绑定本机的IP或者域名,不能是其他主机的。 

    *error_page只适用于由Nginx直接返回的状态码,不适用于转发到后端返回的状态码。

    *不允许在Server中定义日志的打印格式,只能使用HTTP全局配置中定义的日志打印格式。 

    *如果在Server中应用了访问日志,那么将会替换HTTP全局配置中的访问日志。

    5.5 Location配置

    Location主要为了匹配用户访问的URL,使其进入相应的逻辑处理。

    location 匹配符 path{
    
    }

    *匹配符优先级:精确匹配 > 正则匹配(第一个符合的正则)> URL最长匹配

    *其中^~与不使用直接/path作用一样,都是URL后缀匹配。

    *access_log、error_log、pid、root都是相对于Nginx的安装目录,而include是相对于nginx.con所在目录。  

    6.Nginx访问流程

     

    1.客户端向Nginx发起HTTP请求。

    2.进入Nginx的HTTP模块,然后根据请求的IP与端口进入相应的Server。

    3.根据请求的/path匹配Location,若找不到相应的Location,则由Nginx直接返回404状态码,否则进入相应的Location进行处理。

    4.日志中记录请求的相关信息。

    7.Nginx安装与使用

    7.1 下载Nginx安装包并解压

    http://nginx.org/en/download.html 

    7.2 编译以及安装

    #配置,指定Nginx的安装目录
    ./configure --prefix=/usr/nginx
    
    #编译与安装
    make & make install

    *Nginx是由C语言进行编写的,因此需要使用gcc编译器进行编译。

    安装成功后的目录结构:

    *其中conf目录存放着Nginx的相关配置文件,html目录存放nginx预定义的静态资源文件,logs目录用于存放日志,sbin目录包含nginx进程,用于启动Nginx。

    7.3 修改nginx配置文件

    user  root;
    worker_processes  8;
    error_log  logs/error.log;
    pid        logs/nginx.pid;
    
    
    events {
        accept_mutex on;
        multi_accept on;
        use epoll;
        worker_connections 1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
    
        sendfile        on;
        keepalive_timeout  600s;
        keepalive_requests 1000; 
    
        upstream loadBalance {
           server 192.168.2.90:8080;
           server 192.168.2.91:8080;
           server 192.168.2.93:8080;
        }
    
        server {
            listen       80;
            server_name  192.168.2.90;
            access_log  logs/192.168.2.90.access.log  main;
    
            #精确匹配,适用于网站首页
            location = / {
                proxy_pass http://192.168.2.90:8080/web/index.html;
            }
    
            #匹配URL,负载均衡
            location / {
                proxy_pass http://loadBalance;
            }
    
            #正则匹配,静态资源直接返回
            location ~ .(gif|jpg|png|js|css)$ {
                root static;
            }
    
        }
     
    
    }

    7.4 启动Nginx

    *当Nginx服务启动后,会启动一个Master进程和多个Worker进程。

    7.5 Nginx常用命令

    #启动nginx,默认加载conf/nginx.conf配置文件,可以使用-c选项配置
    ./nginx
    
    #检查nginx.conf配置文件
    ./nginx -t
    
    #重启Nginx(热部署)
    ./nginx -s reload
    
    #关闭nginx
    ./nginx -s stop

    8.通过Keepalived实现Nginx的高可用 

    由于Nginx作为流量的入口,一旦Nginx发生故障时则无法对外提供服务,因此可以通过Keepalived实现Ngixn的高可用。

    Keepalived是一个高可用集群的解决方案,其使用VRRP协议(Virtual Router Redundancy Protocol),其对外提供一个虚拟IP,用户的请求直接到达虚拟IP,然后进入状态为Master的Keepalived节点,当状态为Master的Keepalived节点故障时,会自动将状态为Backup的Keepalived节点切换为Master状态。

    *每个包含Nginx服务的节点中都需要安装Keepalived服务,并且需要自定义一个脚本去定时检测Nginx的进程状态,当发现Nginx故障时,及时kill掉本节点的Keepalived服务。

     
  • 相关阅读:
    2、Qt Project之鼠标事件监控
    1、Qt Project之基本文件打开与保存
    Qt界面设计基础
    基于Keil软件的MCU环境搭建
    一次性将word中的数字和字母全部改为“Times New Roman”字体
    PAT 1004 Counting Leaves
    PAT 1003 Emergency
    DevC++ 控制台项目初始代码修改方法
    Win7在命令提示符(cmd.exe)中如何进行复制、粘贴工作
    VMware虚拟机如何在后台运行,后台运行怎么设置其在电脑右下角显示托盘图标
  • 原文地址:https://www.cnblogs.com/funyoung/p/10844536.html
Copyright © 2020-2023  润新知