💥内容参考:【尚硅谷】2022 版 Nginx 教程(nginx 入门到亿级流量)

# 发行版本介绍

  • 🟢Nginx 开源版(反向代理、负载均衡,二次开发难度大)

    https://nginx.org/

  • 🔴Nginx Plus 商业版(附加了很多企业特性)(收费 )

    https://www.nginx-cn.net/products/nginx/

  • 🟢Openresty(有大量 lua 库)

    http://openresty.org/cn/

    Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

  • 🟢Tengine(C 语言形式模块化开发增强 Nginx 原始功能)

    http://tengine.taobao.org/

    Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。

以下内容基于 Nginx 开源版进行学习

# Nginx 安装(linux)

  1. 首先官网下载压缩包,解压命令😆

    1
    $tar -zxvf nginx-1.20.2.tar.gz

  2. 安装必要的环境

    1
    2
    3
    $yum install -y pcre pcre-devel
    $yum install -y zlib zlib-devel
    $./configure --prefix=/usr/local/nginx/

  3. 编译

    1
    2
    $make
    $make install

  4. 运行

    1
    2
    $cd /usr/local/nginx/sbin/
    $./nginx

  5. 访问:

    1
    $curl localhost:80

🤔80 端口是为 HTTP (HyperText Transport Protocol) 即 超文本传输协议开放的

# nginx 运行命令

1
2
3
4
./nignx				# 启动
./nginx -s stop # 快速停止
./nginx -s quit # 优雅停止(等待其任务跑完自动停止)
./nginx -s reload # 重新加载配置

⚠️注意:如果使用本地虚拟机跑 nginx,需要关闭防火墙(或者开放 80 端口)

1
2
3
4
5
6
#关闭防火墙
$systemctl stop firewalld.service
#禁止防火墙开机启动
$systemctl disable firewalld.service
#放行端口
$firewall-cmd --zone=public --add-port=80/tcp --permanent

# nginx 安装成系统服务

  1. 创建服务脚本

    1
    $vim /usr/lib/systemd/system/nginx.service

  2. 服务脚本内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [Unit]
    Description=nginx - web server
    After=network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    ExecQuit=/usr/local/nginx/sbin/nginx -s quit
    PrivateTmp=true

    [Install]
    wantedBy=multi-user.target

    😭一定要注意检查内容,不要错字漏字

  3. 重新加载系统服务: $systemctl daemon-reload

  4. 启动 nginx 服务: $systemctl start nginx.service

  5. (可选)设置开机自启动: $systemctl enable nginx.service

# 目录结构

使用 $tree 命令即可生成目录

没有就安装➡ $yum install tree -y

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── client_body_temp
├── conf # 核心配置文件夹(⚠配置文件较多,一部分没有显示)
│   └──nginx.conf # 主配置文件
├── fastcgi_temp
├── html # 静态资源文件夹(只能放一个站点)
│   ├── 50x.html # 错误页
│   └── index.html # 默认页
├── logs # 日志文件夹
│   ├── access.log # 每次访问记录其中(硬盘可能写满)
│   ├── error.log # 错误日志
│   └── nginx.pid # 记录主进程id号
├── proxy_temp
├── sbin
│   └── nginx # nginx主程序
├── scgi_temp
└── uwsgi_temp

# Nginx 多进程模型

image-20220403134217200

/sbin/nginx 跑起来之后会

  1. 开启 Master 主进程(收集、分发请求,监控 Worker 状态),读取配置文件并进行一次校验

  2. Master 开启子进程 Worker 等待请求并响应

  3. Worker 解析请求并读取响应目录(根据 conf/nginx.conf

为什么 Nginx 使用多进程而不是多线程?

答:

  1. Nginx 使用多进程不是多线程,Nginx 是异步,非阻塞的,使用了 epoll 和大量的底层代码优化。
  2. Nginx 采用一个 Master 进程和多个 Worker 进程的模式
  3. Worker 进程数一般与 cpu 核心数一致,Worker 的处理性能受内存影响

# Nginx 配置文件

# 最小配置文件

nginx/conf/nginx.conf 文件中所有注释删掉。剩下基本支撑 nginx 运行的配置:

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
# 开启1个Worker进程(内核数决定)
worker_processes 1;
# 事件驱动模块
events {
# 每个worker可以创建多少连接
worker_connections 1024;
}
# http模块
http {
# 引用配置文件
include mime.types;
# 默认的传输类型
default_type application/octet-stream;

# 使用 sendfile()方法,减少一次拷贝
sendfile on;
keepalive_timeout 65;

# http/server vhost 虚拟主机(可以有多个),一个server对应一个主机
server {
listen 80;
# 主机名(域名或主机名),可以空格隔开多个主机名
server_name localhost;
# uri
location / {
# 根目录
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

mine[1]

# 虚拟主机配置

# server 匹配规则

  • 完美匹配 servername 域名1 域名2 ...;
  • 通配符匹配 servername *.com;
  • 通配符结束匹配 server_name www.*;
  • 正则匹配 server_name ~^[0-9]+\.com$;

# 反向代理

🤔个人理解:

  • 正向代理:我(客户)上网需要找个代理服务器来帮我上网
  • 反向代理:我(企业)接受请求需要一个代理来帮我分发请求
  • 网关:访问网络的入口,所有请求都要经过路由器转发

Nginx 是隧道式代理服务器,请求和响应都需要经过 Nginx

DR 代理:请求经过代理,响应直接响应(跳过代理)->IVS 负载均衡器

传输数据过大(视频、压缩包之类的),nginx 会有一个瓶颈

# location/proxy_pass 值

作用:设置请求转发到哪去

⏸只进行简单了解,详细内容之后展开

  • 使用时会覆盖掉 rootindex

  • 值为 url(带协议的)例如 http://www.windlinxy.top

使用 https 协议会报错,未找到原因

# 负载均衡

负载均衡从字面意思很好理解,就是对于一个服务器集群,每个服务器负载很均衡🤣,意思是每个服务器均摊的请求数差不多,以防止某个服务器过载的现象。‘

常用算法:

  • 轮询(round-robin):

    按照时间顺序将请求分发到每个服务器,到最后每个服务器接受到的请求是大致相同的。

  • 加权轮询:

    轮询对于性能相近的服务器还好,如果有几个服务器性能比较高,可以使用加权轮询,设置每个服务器的权值,请求按权值的比例分配

    权重变量

    配置的权重,即在配置文件或初始化时约定好的每个节点的权重

    节点的当前权重,初始化是配置的权重,随后会一直变更

    有效权重,用于做降权 ,初始值为 weight,通讯过程中发现异常则 -1 ⚠️ ,之后再次选择本节点,调用成功则 +1⚠️,直到恢复到 weight

    加权轮询算法
    1. 轮询所有节点,计算当前状态下所有节点的 effectiveWeight 之和作为 totalWeight
    2. 更新每个节点的 currentWeight,currentWeight = currentWeight + effectiveWeight 选出所有节点 currentWeight 中最大的一个节点作为选中节点
    3. 选择中的节点再次更新 currentWeight,currentWeight = currentWeight - totalWeight
  • IP 哈希

    每个请求按访问 ip 的 hash 结果分配

  • 其他算法

# 基本配置

配置一组服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream wind{ # 配置别名
# weight可以配置权重 down停用服务器 backup非必要不用
server localhost:9000 (weight=?/down/backup 都不常用);
server localhost:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://wind; # 使用别名
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

# 动静分离

所谓动静分离,就是将静态资源从 tomcat 拆分 Nginx,使得访问静态资源不需要再经过 tomcat,相当于少了一步,直接从 nginx 返回静态资源,加快访问

# 配置

将静态资源放入到 nginx 的 html 目录下

./nginx/conf/nginx.conf 下:

1
2
3
4
5
# 拦截静态资源
location ~.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root static;
expires 30d;
}

# URLRewrite

rewrite 是实现 URL 重写的关键指令,根据 regex (正则表达式) 部分内容, 重定向到 replacement,结尾是 flag 标记。

1
2
3
4
5
rewrite		<regex>		<replacement>    	[flag];
关键字 正则 替代内容 flag标记



rewrite 参数的标签段位置: server / location / if

flag 标记说明:

  • last 本条规则匹配完成后,继续向下匹配新的 location URI 规则
  • break 本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect 返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
  • permanent 返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址

# 参考博客

  • Nginx 如何实现高并发的

  1. (Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 ↩︎

更新于 阅读次数 本文阅读量:

请我喝[茶]~( ̄▽ ̄)~*

Windlinxy 微信支付

微信支付

Windlinxy 支付宝

支付宝