技术分享
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)

鑫生活

总有人要赢,为什么不能是我
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)
  • Git的使用
  • SEO搜索引擎优化
  • 常用cmd和linux命令
  • Serverless
  • CentOS7安装Nginx
  • GitHub Actions 自动化部署
  • Nginx的使用
    • 配置文件
      • 全局块
      • events 块
      • http 块
    • 反向代理
    • 负载均衡
    • 动静分离
    • nginx 配置高可用的集群
    • 原理解析
      • master-workers 的机制的好处
      • 需要设置多个worker
  • 正则表达式
  • 其它
coderly
2020-11-25

Nginx的使用

# Nginx 的使用

# 配置文件

# 全局块

  • 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令
  • 比如:worker_processes 1; worker_processes 值越大,可以支持的并发处理量也越多

# events 块

  • events 块涉及的指令主要影响 nginx 服务器与用户的网络连接
  • 比如 worker_connections 1024; 支持的最大连接数

# http 块

  • nginx 服务器配置中最频繁的部分
  • http 块也可以包含 http全局块、server 块

# http全局块

  • http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等

# server 块

  • 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
  • 每个 http 块可以包含多个 server 块,而每个 server 块就相当于一个虚拟主机。
  • 而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块
# 全局server块
  • 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
# location 块
  • 一个 server 块可以配置多个 location 块
  • 这块的主要作用是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如:前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

# 反向代理

  • =:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就 停止继续向下搜索并立即处理该请求。
  • ~:用于表示 uri 包含正则表达式,并且区分大小写
  • ~*:用于表示 uri 包含正则表达式,并且不区分大小写
  • ^~:用于不含正则表达式的 uri 前,要求 nginx 服务器找到表示 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配

【注意】:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 表示

# 负载均衡

  • 增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
  • 在 http 块中,添加下面的代码
http {
    upstream upstream_name {
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }
    server {
        listen 8080;
        server_name localhost;
        location / {
            proxy_pass http:// upstream_name;
            root html
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# nginx 分配服务器策略
  1. 轮询(默认)
    • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除
  2. weight
    • weight 代表权重,默认为1,权重越高被分配的客户端越多

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况



 
 














http {
    upstream upstream_name {
        server 192.168.0.28:8001 weight=10; // 添加权重
        server 192.168.0.28:8002 weight=100;
    }
    server {
        listen 8080;
        server_name localhost;
        location / {
            proxy_pass http:// upstream_name;
            root html
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  1. ip_hash
    • 每个请求按范文 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

 




    upstream server_pool {
        ip_hash; // 直接添加ip_hash
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }
1
2
3
4
5
  1. fair(第三方)
    • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。



 


    upstream server_pool {
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
        fair;  // 直接添加ip_hash
    }
1
2
3
4
5

# 动静分离

  • nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是把动态页面和静态页面物理分离。
  • 严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。
  • 动静分离从目前实现角度来讲大致分为两种
  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
  • 另一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开
  • 通过 location 指定不同的后缀名实现不同的请求转发
  • 通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量
  • 具体 expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确定是否过期即可,所以不会产生额外的流量。
  • 此种方法非常适合不经常变动的资源(如果经常更新的文件,不建议使用 expires 来缓存)
  • 我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,对比服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
http {
    server {
        listen 8080;
        server_name localhost;
        location /js/ { // 假设js存放在static文件夹中的 js 文件夹里
            root /static/;
            index index.html index.htm;
        }
         location /images/ { // 假设图片存放在static文件夹中的 images文件夹里
            root /static/;
            autoindex on; // 列出当前文件夹中的内容
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# nginx 配置高可用的集群

  • 需要两台 nginx 服务器
  • 需要 keepalived (需要安装 keepalived)
    • cd /usr
    • yum install keepalived -y
  • 需要虚拟 ip

# 原理解析

图片 图片

# master-workers 的机制的好处

  • 首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销
  • 同时在编程以及问题查找时,也会方便很多。
  • 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进行则很快启动新的 worker 进程
  • 当然,worker 进程的异常退出,肯定时程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险
  • 可以使用 nginx -s reload 热部署,利于nginx热部署操作

# 需要设置多个worker

  • nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下
  • 每个 worker 的进程可以把 cpu 的性能发挥到极致
  • 所以 worker 数和服务器的 cpu 数相等是最为适宜的
  • 设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的消耗

# 设置 worker 数量

worker_processes 4;
# work 绑定 cpu(4 work 绑定 4cpu)
worker_cpu_affinity 0001 0010 0100 1000;
1
2
3

# 连接数 worker_connection

  • 这个值表示每个 worker 进程所能建立连接的最大值
  • 所以,一个nginx能建立的最大连接数,应该是 worker_connection * worker_processes
  • 当然,这里说的是最大连接数,对于http请求本地资源来说,能够支持的最大并发数量是 worker_connection * worker_processes
  • 如果是支持1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是:worker_connection * worker_processes / 2
  • 而如果是http作为反向代理来说,最大并发数量应该是worker_connection * worker_processes / 4
  • 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
#Nginx
上次更新: 2021/09/13, 15:11:59
GitHub Actions 自动化部署
正则表达式

← GitHub Actions 自动化部署 正则表达式→

最近更新
01
css
09-13
02
html
09-13
03
README
09-13
更多文章>
Theme by Vdoing | Copyright © 2021-2021 coderly | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式