05-Nginx

作者: XAbo | 来源:发表于2021-08-06 21:22 被阅读0次

    一、Nginx概述

    Nginx是一个高性能的HTTP和反向代理服务器,占用内存少,并发能力强;支持热部署。

    • 正向代理【偏向客户端】:客户端主动改变请求地址。示例:国内访问需要代理服务访问谷歌。
    • 反向代理【偏向服务端】:服务端自动改变请求地址。示例:服务端的负载均衡
    • 负载均衡 :负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
    • Nginx的动静分离:动态网页和静态网页由不同的服务器来解析,加快解析速度,降低单个服务的压力。

    二、Nginx配置

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

    #################第一部分:全局块#################
    ##影响Nginx服务器整体运行的配置
    #user  nobody;
    worker_processes  1; #配置并发处理量
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    #pid        logs/nginx.pid;
    
    #################第二部分:events块#################
    ##影响Nginx服务器与用户的网络链接
    events {
        worker_connections  1024; #最大连接数
    }
    #################第三部分:http块#################
       ##3.1常用配置:文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限……
    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;
        #tcp_nopush     on;
        #keepalive_timeout  0;
        keepalive_timeout  65;
        #gzip  on;
    
       ##3.2 每个http块可以包含多个server块,每个server相当于一个虚拟主机;而每个server块也分为全局server块以及同时包含多个location块
        server {
            listen       80;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            #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:在浏览器中输入网址:www.123.com,跳转到tomcat的主页。
    1.修改hosts文件

      192.168.88.88     www.123.com
    

    2.Nginx反向代理设置

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  192.168.88.88;
            location / {
                root   html;
                proxy_pass http://127.0.0.1:8080;  
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    3.结果

    结果
    实例2:根据路径不同跳转到不同服务中:
    1.部署两套Tomcat: 参考:https://www.jb51.net/article/159521.htm
    2.在两套Tomcat中,部署静态页面作为测试 8080
    9090

    3.修改nginx配置

    
    worker_processes  1;
    events {
        worker_connections  1024; #最大连接数
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       8060;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
    
        }
    
        server {
            listen       8061;
            server_name  192.168.88.88;
            location  ~ /path80/ {
                proxy_pass http://192.168.88.88:8080;
               }
           location  ~ /path90/ {
                proxy_pass http://192.168.88.88:9090;
             }
    
          }
    
    }
    

    4.测试结果


    8080
    9090

    四、Nginx实例配置:负载均衡

    常用策略

    • 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    • 权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    • ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    • fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    • url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

    1.在两台tomcat中各自准备相同的页面,内容不一样的HTML。


    8080 9090

    2.nginx配置负载均衡

    
    worker_processes  1; 
    events {
        worker_connections  1024; 
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
         keepalive_timeout  65;
    
         upstream demo{
            server 192.168.88.88:8080;
            server 192.168.88.88:9090;
        }
       server {
            listen       8060;
            server_name  localhost;
               location / {
                root   html;
                index  index.html index.htm;
                proxy_pass http://demo/docs/demo.html; 
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    3.效果展示:轮询策略访问。

    8080 9090

    五、Nginx实例配置:动静分离

    1.准备环境

    jsp动态资源 html静态资源

    2.nginx配置

    worker_processes  1; 
    events {
        worker_connections  1024; 
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;  
        upstream demo{
            server 192.168.88.88:8080;
            server 192.168.88.88:9090;
        }
    
      server {
            listen       8060;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
                proxy_pass http://demo/docs/demo.html; 
             }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
    
        server {
            listen       8061;
            server_name  192.168.88.88;
            location  ~ /path80/ {
                proxy_pass http://192.168.88.88:8080;
               }
           location  ~ /path90/ {
                proxy_pass http://192.168.88.88:9090;
             }
    
          }
     
        upstream nostaticServer {
          server 192.168.88.88:8080;
          }
        upstream staticServer {
          server 192.168.88.88:9090;
         }
       server {
            listen       8062;
            server_name  192.168.88.88;
          access_log  logs/access.log;
               #匹配到静态资源时,交由后台tomcat9090处理静态资源 
              location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css) {
              proxy_pass http://staticServer;
              proxy_set_header X-Real-IP $remote_addr;
              }
               #匹配到动态资源时,交由后台tomcat8080处理动态资源
             location ~ .*\.jsp$ {
             proxy_pass http://nostaticServer;
             proxy_set_header X-Real-IP $remote_addr;
               }
          }
        
    }
    

    3.结果

    tomcat8080处理动态资源 tomcat9090处理静态资源

    六、Nginx实例配置:高可用集群

    摘抄:https://www.cnblogs.com/wenxuehai/p/15013654.html

    高可用性
    1.安装keepalived
    keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。keepalived 需要绑定一个虚拟地址 vip (Virtual IP Address ) ,这个虚拟 ip 地址绑定在哪台服务器上请求就会发送到哪台服务器,一开始会绑定在主服务器上。
    2.配置keepalived
    首先需要修改 keepalived 的配置文件,keepalived 的配置文件在 /etc/keepalived 目录下。
    2.1主配置:
    global_defs {
        notification_email {   # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个
          acassen@firewall.loc  #  收件人邮箱1
          failover@firewall.loc   #  收件人邮箱2
          sysadmin@firewall.loc   #  收件人邮箱3
        }
        notification_email_from Alexandre.Cassen@firewall.loc   #邮件发件人
        smtp_ server 192.168.32.128  #主服务器的ip地址。邮件服务器地址
        smtp_connect_timeout 30    # 超时时间
        router_id LVS_DEVEL    # 机器标识 局域网内唯一即可。 LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
    }
    vrrp_script chk_http_ port {
        script "/usr/local/src/nginx_check.sh"   #检测脚本存放的路径
        interval 2   # 检测脚本执行的间隔,即检测脚本每隔2s会自动执行一次
        weight 2  #权重,如果这个脚本检测为真,服务器权重+2
    }
    vrrp_instance VI_1 {
        state MASTER    # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
        interface ens33  # 通信端口 通过ip addr可以看到,根据自己的机器配置
        virtual_router_id 51 # vrrp实例id  keepalived集群的实例id必须一致,即主、备机的virtual_router_id必须相同
        priority 100         #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1    #心跳间隔,默认为1s。keepalived多机器集群 通过心跳检测当前服务器是否还正常工作,如果发送心跳没反应,备份服务器就会立刻接管;
        authentication {     # 服务器之间通信密码
            auth type PASS   #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
            auth pass 1111
        }
        virtual_ipaddress { # 自定义虚拟IP。自定义的虚拟ip得根据真实ip设置。比如真实ip是192.168.91.138,那么虚拟ip可以设置为192.168.91.139~255,前面三个数得一致
            192.168.32.50 # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    

    2.2备配置:

    global_defs {
        notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
        }
        notification_email_from Alexandre.Cassen@firewall.loc
        smtp_ server 192.168.32.130    #备份服务器的ip地址
        smtp_connect_timeout 30
        router_id LVS_DEVEL    # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
    }
    vrrp_script chk_http_ port {
        script "/usr/local/src/nginx_check.sh"   #检测脚本
        interval 2   # (检测脚本执行的间隔)2s
        weight 2  #权重,如果这个脚本检测为真,服务器权重+2
    }
    vrrp_instance VI_1 {
        state BACKUP    # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
        interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
        virtual_router_id 51 # 虚拟路由编号,主、备机的virtual_router_id必须相同
        priority 90         #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1    # 检查间隔,默认为1s(vrrp组播周期秒数),每隔1s发送一次心跳
        authentication {     # 校验方式, 类型是密码,密码1111
            auth type PASS   #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
            auth pass 1111
        }
        virtual_ipaddress { # 虛拟ip
            192.168.32.50 # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    

    2.3 nginx_check.sh配置
    主备服务器的 /usr/local/src 目录下分别创建一个 nginx_check.sh 脚本文件。

    #! /bin/bash
    #检测nginx是否启动了
    A=`ps -C nginx -no-header | wc - 1`
    if [ $A -eq 0];then    #如果nginx没有启动就启动nginx 
        /usr/local/nginx/sbin/nginx    #通过Nginx的启动脚本来重启nginx
        sleep 2
        if [`ps -C nginx --no-header| wc -1` -eq 0 ];then   #如果nginx重启失败,则下面就会停掉keepalived服务,进行VIP转移
            killall keepalived
        fi
    fi
    

    3.启动nginx和keepalived

    七、Nginx原理

    Nginx原理

    Nginx进程模型 master和worker工作机制

    Nginx的连接数:

    • worker_processes work数量:work数和服务器的CPU数量相等比较适宜。
    • worker_connections work的连接数:一个Nginx能建立的最大连接数,应该是worker_processes * worker_connections。这
      个最大连接数,对与HTTP请求本地资源来说,能够支持的最大并发数量是worker_processes * worker_connections;如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是(worker_processes * worker_connections)/2;而如果是HTTP作为反向代理来说,最大并发数是(worker_processes * worker_connections)/4。

    Nginx组成部分

    由内核和模块组成。摘抄:https://www.cnblogs.com/xiangsikai/p/8438772.html

    ngnix组成

    Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。

    通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。

    Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

    • 核心模块:HTTP模块、EVENT模块和MAIL模块
    • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
    • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

    Nginx的模块从功能上分为如下三类:

    • Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
    • Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
    • Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

    相关文章

      网友评论

          本文标题:05-Nginx

          本文链接:https://www.haomeiwen.com/subject/gpnbvltx.html