nginx学习小结

nginx


【0】README

本文po处理 nginx的主要内容,包括反向代理,负载均衡,动静分离,高可用集群等;
本文引用链接:
vmware安装centos8,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119510351
centos8安装 nginx,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119479024
centos安装 tomcat9, refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119487438


【1】介绍

【1.1】基本概念

1)nginx是什么,做什么事情;

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。
    能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

[服务器]
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
无缓存的反向代理加速,简单的负载均衡和容错。
FastCGI,简单的负载均衡和容错。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
2)反向代理

2.1)正向代理

正向代理服务器扮演的是客户端角色,是位于客户端和目标服务器之间的代理服务器(中间服务器),需要在本地配置要访问的目标服务器。

为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。

正向代理的情况下客户端必须要进行一些特别的设置才能使用
在这里插入图片描述

2.2)反向代理

反向代理服务器扮演的是服务器角色,因此客户端不需要进行任何设置,因为代理配置在反向代理服务器中配置。

客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务。
在这里插入图片描述

2.3)正向代理与反向代理的区别

  • 区别1:正向代理中,代理服务器作为客户端的代理,反向代理中,代理服务器是服务端的代理(干货——这句真的是说清楚了正向代理与反向代理的区别);
  • 区别2:正向代理一般是客户端架设的,比如本地安装一个代理软件(翻墙软件就是典型的正向代理的例子)。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器 ( 前后端统一域名就是反向代理的例子)
  • 区别3:正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
  • 区别4:正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度;
  • 区别5:正向代理中,浏览器与代理服务器在同一个LAN 局域网中;而反向代理中,代理服务器与目标服务器在同一个LAN ;
    在这里插入图片描述在这里插入图片描述
3)负载均衡;

定义: 单个服务器无法满足访问请求,我们增加服务器数量,然后将请求分发到各个服务器上。即将原先请求集中到单个服务器上的情况改为 发送到多个服务器上,即把负载或访问压力分发到不同服务器,具体是哪台服务器由 负载均衡器根据给定策略来选择 ; 这种把请求负载分发到多个服务器的请求转发策略,称为负载均衡;

4)动静分离

为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;
动静分离部署图:
但现在 servlet,jsp用的比较少了,所以应用场景不多;
在这里插入图片描述

【1.2】nginx安装,常用命令和配置文件

1)在linux系统中安装nginx

参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024

2)nginx常用命令

安装完成后,nginx 命令在

[root@localhost sbin]# which nginx
/usr/sbin/nginx 

参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024
在这里插入图片描述

3)nginx配置文件

安装完成后,nginx配置文件在 /etc/nginx/nginx.conf 下面;

3.0)nginx.conf 配置文件由3部分组成;
3.1)部分1:全局块;

从开始到events 块之间的内容,主要设置 nginx运行的配置指令;

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

worker_process auto或1 ; 表示支持的并发请求;

3.2)部分2:events块;

主要是配置nginx服务器与用户网络连接;


events {
    worker_connections 1024;
}

worker_connections 表示每个worker进程支持的最大连接数是多少;

3.3)部分3:http块;

配置了 代理,缓存和日志定义等; http块下面包括 http全局块, server块

3.3.1)http全局块

配置的指令包括 文件引入, MIME-TYPE定义,日志定义,连接超时时间 等;

媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。

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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
3.3.2)server块
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

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

1个server块就是一个虚拟主机;1个http可以包含多个server块;

每个server块分为全局server, 也可以通过包含多个location块;


【2】nginx配置实例1-反向代理

1)实现效果

浏览器输入地址 www.123.com ; 直接跳转到 tomcat主页面;

2)步骤
step1) 启动tomcat

安装并启动tomcat 参见 https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;

firewall-cmd --zone=public --add-port=8080/tcp --permanent  开放8080端口被访问 
firewall-cmd --reload  重启防火墙 
step2) 通过nginx 配置反向代理策略

在这里插入图片描述

step3) 配置 host

添加 www.abc.com 的ip地址映射 ,如下:

192.168.163.204 www.abc.com

step4) 添加nginx反向代理配置

在这里插入图片描述

server {
        listen       80;
        server_name  192.168.163.204;

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

效果如下: 访问www.abc.com , 被代理到 tomcat首页, 即127.0.0.1:080 d端口
在这里插入图片描述


【3】nginx配置实例2-反向代理

1)实现效果

使用nginx反向代理,根据访问路径的不同代理到请求不同端口;
如 nginx监听端口 9001
访问 www.abc.com/test01 直接跳转到 http://192.168.163.204:8080/test01/index01.html
访问 www.abc.com/test02 直接跳转到 http://192.168.163.204:8080/test02/index02.html

2)步骤
step1)配置tomcat测试页面

在这里插入图片描述

step2)配置nginx反向代理

在这里插入图片描述

server {
        listen       80;
        server_name  192.168.163.204;

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

        location /test01 {
            proxy_pass http://127.0.0.1:8080/test01/;
        }
        location /test02 {
            proxy_pass http://127.0.0.1:8080/test02/;
        }
    }
补充: 反向代理proxy_pass绝对路径与相对路径

注意 https://www.jianshu.com/p/ec14f55fd209 , nginx反向代理proxy_pass绝对路径和相对路径 ;

  • 绝对路径: 127.0.0.1:8080/test01/ 后面带了斜杠,就是 绝对路径 ; 绝对路径会把 location中的 /test01 给删除掉;
  • 相对路径: 127.0.0.1:8080/test01 后面不带斜杠,就是 相对路径; 相对路径会把 location中的 /test01 也作为请求路径一部分传给服务器;
step3)反向代理设置访问成功

在这里插入图片描述
在这里插入图片描述

补充2: 详解Nginx location 匹配规则

https://blog.csdn.net/bigtree_3721/article/details/106105924


【4】nginx配置实例2-负载均衡

1)负载均衡定义

通过增加服务器数量,把请求负载分发到各个服务器上,以减少单个服务器访问压力的访问模型;

2)实现效果

访问 http://www.abc.com/test01/index01.html , nginx 把请求分发到 192.168.163.201 和 192.168.163.204 ;

3)步骤
step1)负载均衡配置

在http 块中添加 upstream块,并取名为 myserver;
在 location块中设置 反向道理到myserver;
在这里插入图片描述

http {

    # load balance config       
    upstream myserver {
        server 192.168.163.201:8080;
        server 192.168.163.204:8080;
    }

    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  192.168.163.204;

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

        location /test01 {
            proxy_pass http://myserver/test01/;
        }
        location /test02 {
            proxy_pass http://myserver/test02/;
        }
    }

}
step2)执行效果

(请求被平均分发到 centos201 centos204 服务器)
在这里插入图片描述
在这里插入图片描述

3)负载均衡分发策略
策略1:轮询(默认*)

按照请求时间先后顺序分配到不同的后端服务器;如果后端服务器down掉,则自动剔除;

策略2:weight 权值 (默认值为1)
    upstream myserver {
        server 192.168.163.201:8080 weight=10;
        server 192.168.163.204:8080 weight=20;
    }
策略3:ip hash方式(散列分发)

每个请求按照访问 ip 的hash结果进行分配,这样每个访客在同一个ip都会被分发到固定的服务器

upstream myserver {
        ip_hash; 
        server 192.168.163.201:8080;
        server 192.168.163.204:8080;
    }
策略4: fair 公平分发

按照后端服务器的响应时间来分配,响应时间越短,则优先分配;

upstream myserver {
        fair;
        server 192.168.163.201:8080;
        server 192.168.163.204:8080;    	
    }

补充: fair是第三方模块,需要重新安装 依赖包;


【5】ngxinx配置实例-动静分离

1)动静分离定义

为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;

更直白点: nginx处理静态资源, tomcat处理动态资源
在这里插入图片描述

2)动静分离实现策略(两种策略)

策略1: 把静态资源单独放在独立服务器上,主流推崇的方式;
策略2: 动态与静态文件混合放在一起发布在同一台服务器上,通过nginx来分开 ;

通过location 指定不同的后缀名实现不同的请求转发; 通过expires 参数设置, 可以让浏览器缓存过期时间 ,减少与服务器之间的请求和流量;

策略3:expires缓存静态资源例子

若设置 expires为3d(3天),表示在3天内访问某个静态资源的请求, 若比对服务器该文件的最后修改时间没有变化,则不会从服务器抓取,返回304状态码,让浏览器从本地获取资源; 若发送了变化,则服务器重新从发送资源到 浏览器,状态码200;

3)步骤
step1)nginx静态资源

在这里插入图片描述

step2)nginx配置访问静态资源

nginx静态资源准备及访问 https://blog.csdn.net/PacosonSWJTU/article/details/119505771
在这里插入图片描述


【6】nginx配置高可用集群

1)高可用定义

若nginx是单个接口,则当nginx宕机了,请求无法顺利进行;
若是高可用,则启动一台服务器节点宕机了,服务还是可以正常访问;
在这里插入图片描述

1.1)高可用集群架构

在这里插入图片描述

1.2)高可用环境准备

step1)需要两台nginx 服务器;
安装nginx, https://blog.csdn.net/PacosonSWJTU/article/details/119479024
安装tomcat, https://blog.csdn.net/PacosonSWJTU/article/details/119487438

step2)需要keepalived ;
两台机器都要装 keepalived
yum -y install keepalived ;
rpm -q -a keepalived 查看是否安装成功;

[root@centos205 nginx]# rpm -q -a keepalived
keepalived-2.1.5-6.el8.x86_64

其配置文件在 /etc/keepalived/ 目录 下;

[root@centos205 nginx]# cd /etc/keepalived/
[root@centos205 keepalived]# pwd
/etc/keepalived
[root@centos205 keepalived]# ll
总用量 4
-rw-r--r--. 1 root root 3550 1月  27 2021 keepalived.conf
2)高可用集群配置
step1) 修改keepalived配置

/etc/keepalived/keepalived.conf
centos204 MASTER

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.163.204  
   smtp_connect_timeout 30
   router_id LVS_DEVEL    # /etc/hosts 添加 127.0.0.1 LVS_DEVEL
}

vrrp_script chk_http_port {
        script "/usr/script/nginx/nginx_check.sh" 
        interval 2  # 检测脚本执行间隔时间
        weight 2
}

vrrp_instance VI_1 {
    state MASTER    # MASTER OR BACKUP
    interface ens160  
    virtual_router_id 51 # 主从机器的virtual_route_id 必须相同
    priority 100         # 主从机器的优先级,主机值较大, 从机较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.163.200  # 虚拟ip地址 主从机器配置相同
    }
}

centos205 SLAVE

! Configuration File for keepalived
  
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.163.204 
   smtp_connect_timeout 30
   router_id LVS_DEVEL     # /etc/hosts 添加 127.0.0.1 LVS_DEVEL 
}

vrrp_script chk_http_port {
        script "/usr/script/nginx/nginx_check.sh"
        interval 2  # 检测脚本执行间隔时间
        weight 2
}

vrrp_instance VI_1 {
    state BACKUP    # MASTER OR BACKUP
    interface ens160  # 网卡 ifconfig 查看
    virtual_router_id 51 # 主从机器的virtual_route_id 必须相同
    priority 90         # 主从机器的优先级,主机值较大, 从机较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.163.200  # 虚拟ip地址 主从机器配置相同
    }
}

/usr/script/nginx/nginx_check.sh 检测master是否存活的脚本;

#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [ $A -eq 0 ]; then
        /usr/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
                        killall keepalived
        fi
fi
step2)启动两台服务器的 nginx 和 keepalived
  • 启动nginx: nginx;
  • 启动keepalived: systemctl start keepalived.service
  • 停止nginx: nginx -s stop;
  • 停止 keepalived: systemctl stop keepalived.service
3)执行效果
3.1)访问虚拟ip 192.168.163.200

http://192.168.163.200/www2/home.html 可用;
在这里插入图片描述

3.2)停用 centos205机器的 nginx 和 keepalived;
[root@centos205 keepalived]# nginx -s stop
[root@centos205 keepalived]# systemctl stop keepalived.service  
3.3)再次访问虚拟ip 192.168.163.200成功

再次访问 192.168.163.200 成功,因为 centos205 宕机,当因为centos204 , centos205 属于高可用集群,所以centos204继续提供服务;
在这里插入图片描述

【7】nginx小结

1)1个master和多个worker进程好处

好处1: 可以使用 nginx-s reload 热部署;
好处2: 每个worker 是独立的进程,如果有其中一个worker 出现问题,其他worker是独立的,会继续进行争抢,实现请求过程,不会造成服务中断;

2)设置多少个worker进程合适

worker进程数量与cpu核数相等是最为合适的;

worker_processes  4; // nginx.conf 中进行配置 
3)连接数 worker_connection

问题1: 发送一个请求,占用了worker进程的几个连接数 ? 2个
客户端请求nginx (第1个连接), nginx请求tomcat(第2个连接) ;
问题2: nginx中有1个 master,4个worker进程; 每个worker进程 支持的最大连接数是 1024 ; 那worker支持的最大并发数是多少?4*1024/2 = 2k

// nginx.conf 中的events 块中设置  
events {
    worker_connections  1024;  # 每个worker进程的最大连接数  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值