Nginx的使用与集群

nginx

nginx 基本概念

(1)nginx 是什么?能做什么事情

​ Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,能够支持高达 50,000 个并发连接数的响应

(2)反向代理

​ 正向代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。

​ 反向代理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

(3)负载均衡

​ 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

​ 负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

(4)动静分离

​ 动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

nginx 的安装

nginx官网下载

wget http://nginx.org/download/nginx-1.19.2.tar.gz

需要前置依赖pcre、openssl、zlib

1.安装编译工具及库文件

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

2.安装pcre
pcre2和pcre版本不一样,使用pcre2编译时,可能会编译失败,这里使用pcre

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz

2.1解压压缩包

tar -zxvf pcre-8.44.tar.gz

2.2编译安装

cd pcre-8.44
./configure
make && make install

2.3检查pcre版本

rpm -qa pcre
# pcre2-config --version

3.安装nginx,默认会把nginx相关文件放在 /usr/local/nginx,默认端口为80,注意开放防火墙

tar -zxvf nginx-1.19.2.tar.gz
cd nginx-1.19.2
./configure
make && make install

nginx常用命令

# 查看nginx版本号
./nginx -v
# nginx 启动
./nginx 
# nginx 停止
./nginx -s quit
# nginx 强制停止
./nginx -s stop
# 重新加载
./nginx -s reload
# 测试配置文件
./nginx -t

nginx 配置文件

默认安装时,配置文件在 /usr/local/nginx/conf/nginx.conf

nginx 配置文件分为三个部分

  • 全局块

    从配置文件到events块之前的内容,主要会设置一些影响nginx服务器整体运行的配置指令

  • events块

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

  • http块

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

    • http 全局块

      文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。

    • server块

      和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的机器主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

      每个http块可以包含多个server块,而每一个server块相当于一个虚拟主机。

      而每个server块也分为全局server块,以及可以包含多个location块

# 配置用户或者组,默认为nobody nobody
#user  nobody;
# 这是nginx服务器并发处理服务的关键配置,worker_process值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件等设备的制约
worker_processes  1; 

# 指定日志路径,级别。这个设置可以放入全局块,http块,server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 指定nginx进程运行文件存放地址
#pid        logs/nginx.pid;

events {
     
	# 表示每个worker_process 支持的最大连接数为1024
    worker_connections  1024;
}


http {
     
	# 文件扩展名与文件类型映射表
    include       mime.types;
    # 默认文件类型,默认为text/plain
    default_type  application/octet-stream;
	
	# 日志格式
	# 格式名称 ip 远程用户 当地时间 请求URL 状态 发送的大小 响应的头 客户端使用的浏览器 页面响应的时间
    #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方式传输文件,默认为off,可以在http块,server块,location块
    sendfile        on;
    # 防止网络阻塞
    #tcp_nopush     on;
	
	# 连接超时时间,默认为75s,可以在http,server,location块
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
     
    	# 监听端口
        listen       80;
        # 监听地址 127.0.0.1
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		# 请求的url过滤,正则匹配
        location / {
     
        	# 根目录
            root   html;
            # 设置默认页
            index  index.html index.htm;
            # 请求转向mysvr 定义的服务器列表
            # proxy_pass http://mysvr; 
            # 拒绝的ip
            # deny 127.0.0.1; 
            # 允许的ip 
            # allow 172.18.5.54; 
        }

        #error_page  404              /404.html;
 		# redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
     
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
     
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
     
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
     
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
     
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
     
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

	# HTTPS server
    #
    #server {
     
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
     
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

nginx反向代理

  1. 准备工作

    在linux系统上安装jdk和tomcat,tomcat使用默认端口8080,

    进入tomcat的bin目录中,./startup.sh 启动tomcat,防火墙开放端口8080

  2. Nginx的使用与集群_第1张图片

  3. Nginx的使用与集群_第2张图片

  4. 创建多个tomcat实例

  5. 在tomcat中加入一些静态测试页面

    在tomcat8080的webapps创建unreal文件夹,添加a.html,内容8080

    在tomcat8081的webapps创建kevin文件夹,添加b.html,内容8081

  6. 新增监听端口9001,作如下配置,并开放防火墙9001端口

  7. 访问测试

    (ip):9001/unreal/a.html

    (ip):9001/kevin/b.html

location uri 修饰符

  • = 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

  • ~ 用于表示uri包含正则表达式,且区分大小写。

  • ~* 用于表示uri包含正则表达式,并且不区分大小写。

  • ^~ 用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串作匹配。

    *注:如果uri包含正则表达式,就必须要有标识符

nginx负载均衡

  1. 在tomcat中加入一些静态测试页面

    在tomcat8080的webapps创建unreal文件夹,添加a.html,内容8080

    在tomcat8081的webapps创建unreal文件夹,添加a.html,内容8081

  2. 负载均衡配置

    在http块中添加如下配置

    upstream myserver {
           
       server 127.0.0.1:8080;
       server 127.0.0.1:8081;
    }
    

    server中location做如下修改

    server {
           
            listen       80;
            server_name  120.79.152.130;
            
            location / {
           
                root   html;
                proxy_pass http://myserver;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
           
                root   html;
            }
    
    }
    

Nginx的使用与集群_第3张图片

  1. 访问测试

    (ip)/unreal/a.html

Nginx负载均衡的常用策略

  • 轮询(默认)

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

  • weight

    weight代表权重,默认为1,权重越高被分配的客户端越多。

    upstream myserver {
           
       	server 127.0.0.1:8080 weight=10; 
       	server 127.0.0.1:8081 weight=5;
    }
    
  • ip_hash

    每个请求按访问ip的hash结果分配,这样每个访问者固定访问一个后端服务器,可以解决session的问题。

    upstream myserver {
           
    	ip_hash;
       	server 127.0.0.1:8080; 
       	server 127.0.0.1:8081;
    }
    
  • least_conn

    把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

    upstream myserver {
    	least_conn;
       	server 127.0.0.1:8080; 
       	server 127.0.0.1:8081;
    }
    
  • fair(第三方)

    按后端服务器的响应时间来进行分配请求,响应时间短的优先分配。

    upstream myserver {
           
       	server 127.0.0.1:8080; 
       	server 127.0.0.1:8081;
       	fair;
    }
    
  • url_hash(第三方)

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

    upstream myserver {
           
        hash $request_uri;    
        server 127.0.0.1:8080; 
       	server 127.0.0.1:8081;
    }
    

nginx 动静分离

​ nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是把动态页面和静态页面物理分离。可以理解为使用nginx处理静态页面,tomcat处理动态页面。动静分离从目前来说,实现方式大致分为两种。

​ 一是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流的方案。另一种是动态文件和静态文件混合在一起发布,通过nginx来分开。通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体expires定义:是给一个资源设定一个过期时间,也就是说无法去服务端验证,直接通过浏览器的自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。

  1. 准备静态资源

    /data/images/ 下添加图片 1.jpg,在/data/www/下添加index.html文件

  2. nginx配置

Nginx的使用与集群_第4张图片

  1. 访问测试

    (ip)/images/1.jpg

    (ip)/www/index.html

  • 配置项autoindex on 可以在访问文件目录时,将内容以列表展示

nginx 配置高可用集群

  1. 准备工作

    需要两台nginx服务器,都需要安装keepalived

    keepalived 安装

    yum install keepalived
    

    安装完后,配置文件在/etc/keepalived/keepalived.conf

  2. 集群配置(主从配置)

! Configuration File for keepalived

# 全局配置标识,表明这个区域{}是全局配置
global_defs {
     
   # 表示发送通知邮件时邮件源地址是谁
   notification_email {
     
     [email protected]
     [email protected]
     [email protected]
   }
   # 表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个notification_email_from [email protected]
   notification_email_from [email protected]
   # 表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
   smtp_server 192.168.200.1
   # 连接smtp连接超时时间
   smtp_connect_timeout 30
   # 机器标识
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
     
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
     
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
     
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
     
        weight 1
        SSL_GET {
     
            url {
     
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
     
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
     
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
     
        weight 1
        HTTP_GET {
     
            url {
      
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
     
        weight 1
        HTTP_GET {
     
            url {
      
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
      
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
     
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
     
        weight 1
        HTTP_GET {
     
            url {
      
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
     
        weight 1
        HTTP_GET {
     
            url {
      
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
      
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

你可能感兴趣的:(Nginx,nginx)