• Nginx知识汇总


    一、Nginx的简介

    nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。

    二、Nginx的优点
    1. 跨平台、配置简单;
    2. 采用单线程来异步非阻塞处理请求、避免多线程CPU 的上下文切换带来的损耗;
    3. 内存消耗小,支持高并发连接;
    4. 成本低廉,且开源;
    5. 稳定性高,宕机的概率非常小;
    三、Nginx的安装
    1. 使用docker拉取nginx镜像;
    docker pull nginx
    
    • 1
    1. 查看拉取的nginx镜像信息
    docker images nginx
    
    • 1
    1. 创建nginx的配置文件的挂载目录,通过docker启动的nginx容器,nginx的配置文件是存在容器中的/etc/nginx目录下,如果想要修改nginx的配置文件的话就需要先进入到容器内,再找到其目录下的配置文件进行修改。如果是修改比较频繁的话,每次都要进入容器内进行修改还是挺麻烦的,现在在容器启动前在主机上创建nginx配置文件挂载的目录,后面启动的时候直接将容器内的配置文件挂载到主机上,后续修改nginx的配置文件就直接在挂载到主机的目录下修改就好。
    # 创建挂载目录
    mkdir -p /usr/local/src/nginx/conf
    mkdir -p /usr/local/src/nginx/log
    mkdir -p /usr/local/src/nginx/html
    
    • 1
    • 2
    • 3
    • 4
    1. 创建并启动nginx容器,将容器中的相应文件copy到刚创建的挂载目录中,复制完成再停止并删除该容器
    // 启动容器
    docker run --name myNginx -d -p 80:80  nginx:latest
    
    # 将容器nginx.conf文件复制到宿主机
    docker cp 008aee5bc129:/etc/nginx/nginx.conf /usr/local/src/nginx/conf/nginx.conf
    # 将容器conf.d文件夹下内容复制到宿主机
    docker cp 008aee5bc129:/etc/nginx/conf.d /usr/local/src/nginx/conf/conf.d
    # 将容器中的html文件夹复制到宿主机
    docker cp 008aee5bc129:/usr/share/nginx/html /usr/local/src/nginx
    
    // 停止容器
    docker stop 008aee5bc129
    // 删除容器
    docker rm 008aee5bc129
    注:008aee5bc129为容器id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 重新启动容器并设置挂载目录
    docker run \
    -p 80:80 \
    --name myNginx \
    -v /usr/local/src/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /usr/local/src/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v /usr/local/src/nginx/log:/var/log/nginx \
    -v /usr/local/src/nginx/html:/usr/share/nginx/html \
    -d nginx:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    四、Nginx配置文件(nginx.conf)

    默认在Linux上安装的Nginx,配置文件在安装的nginx目录下的conf目录下,名字叫做nginx.conf。ginx.conf主要由三部分组成:全局块、events块、http块。

    ----------------------- 全局块 ------------------------------
    					  # 全局配置
    # user nobody nobody;
    worker_processes 2;
    # error_log logs/error.log
    # error_log logs/error.log notice
    # error_log logs/error.log info
    # pid logs/nginx.pid
    worker_rlimit_nofile 1024;
    -------------------------------------------------------------
    ************************events块*****************************
    				   # nginx工作模式配置
    events {                           
     	worker_connections 1024;
        multi_accept on;
        use epoll;
    }
    *************************************************************
    ==========================http块=============================
    						# http设置
    http {                                
        # http全局块
        ....
     
        # server块
        server {         
        	# server全局块               
            ....
            
            # location块
            location {                   
                ....
            }
     
    	    # location块
            location path {
                ....
            }
     
    	    # location块
            location otherpath {
                ....
            }
        }
        
        # server块
        server {
            ....
     
            location {
                ....
            }
        }
     
        # upstream块
        upstream name {                   
            ....
        }
    }
    ===============================================================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    1. 全局块:用于进行nginx全局信息的配置,常用配置项有如下:
      (1)user:用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行;
      (2)worker_processes:指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍;
      (3)error_log:定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】;
      (4)pid:用来指定进程id的存储文件的位置;
      (5)worker_rlimit_nofile:用于指定一个进程可以打开最多文件数量的描述;
    2. events块:用于nginx工作模式的配置,常用配置项有如下:
      (1)worker_connections:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的;
      (2)multi_accept:配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接;
      (3)use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue;‘’
    3. http块:包括http全局块,以及多个server块。作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可。
      3.1、http全局块:http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
      3.2、server块:用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
      3.2.1、全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
      3.2.2、location 块:一个 server 块可以配置多个 location 块,主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理。在路由访问信息配置中关联到反向代理、负载均衡等等各项功能。
      在这里插入图片描述
    # 优先级1,精确匹配,根路径
    location =/ {
        proxy_pass http://192.168.80.102:8080;
    }
     
    # 优先级2,以某个字符串开头,以test开头的,优先匹配这里,区分大小写
    # http://test.com/test/test1.html
    location ^~ /test{
       root /data/; # 匹配成功,实际访问路径为:/data/test/test1.html
       index index.php index.html;
    }
     
    # 优先级3,区分大小写的正则匹配,匹配/image*****路径
    # http://test.com/image/image1.html
    location ~ /image{
        alias /data/static/;  # 匹配成功,实际访问路径为:/data/static/image1.html
        index index.php index.html;
    }
     
    # 优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
    location ~* .*\.(jpg|gif|png|js|css)$ {
       root  /data/image/;
       index index.php index.html;
    }
     
    # 优先7,通用匹配
    location / {
        return 403;
    }
    
    location:后面跟的是请求地址路径匹配规则;
    proxy_pass:设置反向代理的路径,匹配成功后跳转到该指定的路径;
    root:用于指定访问虚拟主机的目录,实际访问文件路径会拼接URL中的路径;
    alias:用于指定访问虚拟主机的目录,实际访问文件路径不会拼接URL中的路径;
    index:在不指定访问具体资源时,默认展示的资源文件列表;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3.2.3、upstream块:主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。

    upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
    }
    ip_hash:指定的负载均衡调度算法是ip_hash;
    server host:port:分发服务器的列表配置;
    -- down:表示该主机暂停服务;
    -- max_fails:表示失败最大次数,超过失败最大次数暂停服务;
    -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    五、正向代理与反向代理
    1. 正向代理:代理的是客户端,需要在客户端配置代理服务器,再将要访问的真实的服务器地址交给代理服务器,由代理服务器去请求这个真实的服务器的地址,拿到对应的数据后再返回给客户端。
      在这里插入图片描述
    2. 反向代理:代理的是服务器端,客户端不需要任何配置,客户端只需要将请求发送给反向代理服务器即可,代理服务器将请求分发给真实的服务器,获取数据后将数据转发给客户端。隐藏了真实服务器,有点像网关。
      在这里插入图片描述
    六、负载均衡

    主要运用在分布式场景,客户端的所有请求都将会先到nginx上,再由nginx根据相应的规则,将这些请求按时间顺序逐一分配到不同的后端服务器上处理。nginx负载均衡的实现规则有以下5种:

    1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
    upstream myserver { 
     	server 192.168.1.11:8081; 
     	server 192.168.1.12:8082; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    1. weight权重:默认为 1,权重越高被分配的客户端越多。
    upstream myserver { 
     	server 192.168.1.11:8081 weight=2; 
     	server 192.168.1.12:8082 weight=8; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    1. ip_hash( IP绑定):每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
    upstream myserver { 
     	ip_hash; 
     	server 192.168.1.11:8081; 
     	server 192.168.1.12:8082; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. fair(第三方插件):必须安装upstream_fair模块,对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
    upstream myserver { 
    	server 192.168.80.102:8081;
    	server 192.168.80.102:8082;
        fair;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. url_hash(第三方插件):必须安装Nginx的hash软件包,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
    upstream myserver { 
    	server 192.168.80.102:8081;
    	server 192.168.80.102:8082;
        hash $request_uri; 
     	hash_method crc32; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    七、动静分离

    将静态资源 css、html、js等和动态资源(jsp servlet)进行分开部署,我们可以将静态资源直接部署在专门的服务器上,也可以直接放在反向代理服务器上(Nginx)所在在的服务器上,动态资源还是部署在真实的服务器上。然后请求来的时候,静态资源从专门的静态资源服务器获取,动态资源还是转发到后端服务器上。可以提高用户访问静态资源的响应速度,降低对后台服务的访问频率。
    在这里插入图片描述

  • 相关阅读:
    基于SpringBoot+Vue的校园招聘管理系统(Java毕业设计)
    Redis持久化:RDB与AOF深入解析
    Sip多按键对讲分机,洁净室专用对讲终端
    Apifox接口调试工具
    常用的JVM配置参数说明
    机器学习面试知识点总结
    Acwing 3534. 矩阵幂 && 3535. C翻转
    新型靶向RAS突变的共价抑制剂 | MedChemExpress
    深度学习实践3:多层感知机
    设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码
  • 原文地址:https://blog.csdn.net/qq_33807380/article/details/127905021