Nginx 是什么?
- Nginx是一款轻量级 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。
- 换句话说 Nginx 是一款轻量级的 Web 服务器,并且占内存少并发能力强
有 Node.js 为啥还要学 Nginx
- 众所周知,Node 本身是可以做 HTTP 服务器的,Node 流行后端框架中(Express,Koa,Nest)也都具备 HTTP 服务器能力,既然如此,我们为什么要学习 Nginx?
- Node 做服务端,本身就是为了业务层服务的,很难充分利用服务器硬件资源处理 HTTP 本身的逻辑,大量负载的情况下,容易造成网络阻塞甚至崩溃。
安装方式
- Windows
- http://nginx.org/
- 下载安装包并解压
- 打开解压目录内
nginx.exe 所在目录,双击nginx.exe - 复制
nginx.exe 路径到 cmd 中并进入 - 输入
./nginx -v 显示版本号即安装成功 - 浏览器输入
localhost:80 即可访问 nginx 的首页 - Linux
- 通过 yum 安装 nginx
sudo yum install -y nginx - 启动 nginx
sudo systemctl start nginx.service - 设置开机自启
sudo systemctl enable nginx.service - 浏览器中输入
localhost:80 即可访问 nginx 的首页 - 注意
- nginx 默认监听 80 端口,但是电脑中可能会有其他程序占用 80 端口所以可能访问 80 时无法访问,可以通过修改配置更改监听端口
修改配置
Nginx 架构常用命令操作
nginx -t 测试配置是否正确,配置文件修改后先操作验证,在进行后续操作。nginx -s reload 加载最新配置,等待全部子进程结束,然后开辟新的子进程使用新的配置。nginx -s reopen 重新打开日志,重命名 access.log 日志文件,并重新创建新 access.log 文件,再次访问查看变化。nginx -s quit ? 优雅停止,等待全部子进程处理完毕,不再开启新的子进程。nginx -s stop ?立即停止,不等待子进程处理,立即停止所有子进程及主进程。- 其他操作命令可以通过帮助命令
nginx -h 进行查看 - windows 在修改命令为
./nginx -XXXX
配置项与含义
- 想要真正用好 nginx 我们需要对其运行逻辑和配置项有充分的了解
全局配置区域
Main #全局配置区,Nginx 核心功能配置
events{ # events 事件区,子进程核心配置
}
http { # http 服务器配置区
server { # 不同服务配置区
location { # location 不同请求路径配置区
}
}
}
mail{ # 邮件代理配置区
server{ # 邮件服务配置区
}
}
默认配置解析
配置项中出现的 include /xx/xx 是引入外部配置项;# 则是注释内容;
Windows 与 Linux 中默认配置不同,但配置项含义都是一样的
user www-data; #使用那个用户角色运行 Nginx
worker_processes auto; #允许开启的 worker 数量,通常设置成和cpu的数量相等
pid /run/nginx.pid; # pid 路径
include /etc/nginx/modules-enabled/*.conf; #引入其他配置项
events { # 事件区
# 每个 work 进程支持的最大链接数,理论值 65535 每个进程的最大句柄数
worker_connections 1024;
# 2字节==16位,
}
http { # http 区
#sendfile 指定 nginx 调用 sendfile 函数(zero copy 方式)来输出文件,
#配合 tcp_nopush 与 tcp_nodelay 完成数据的快速响应
sendfile on;
tcp_nopush on; # 数据包会累积后一起传输,可以提高传输效率。
tcp_nodelay on; #小的数据包不等待直接传输
# tcp_nopush 与 tcp_nodelay 互斥,Nginx 会借助sendfile 进行平衡处理
# 持久链接打开的超时时长
keepalive_timeout 65;
# 散列表的冲突率,越大,消耗内存越多,冲突率越低,检索速度就更快
types_hash_max_size 2048;
# mime 类型列表
include /etc/nginx/mime.types;
# 默认 mime 类型 流
default_type application/octet-stream;
# 协商ssl加密算法时,优先使用服务端的加密套件
ssl_prefer_server_ciphers on;
# [错误]日志存储路径
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 开启 gzip 协议压缩,减少数据传输量
gzip on;
# 引入其他配置文件
include /etc/nginx/conf.d/*.conf;
server { #server区
# 设置系统监听端口
listen 80 default_server;
listen [::]:80 default_server;
# 定义服务器访问默认根路径
root /var/www/html;
# 定义首页索引文件的名称
index index.html index.htm index.nginx-debian.html;
# 定义访问域名
server_name _;
# location 区域,相当于路由判断
location / {
try_files $uri $uri/ =404;
}
}
}
反向代理与正向代理
- 反向代理就是外部客户端通过网关访问内网服务器上的内容,网关起到了反向代理的功能,内网服务器不对外提供服务,一般由防火墙设立拦截,之对外暴露网关端口
- 简单来说
- 反向代理,代理的是服务器,帮助服务器处理请求响应给客户端,隐藏真实服务器响应。
- 正向代理,代理的是客户端,帮助客户端获取目标服务器的数据,隐藏真实客户端请求。
- 举个例子
- 反向代理
- 我们去饭店吃饭,这家饭店有豫菜,鲁菜,川菜,也分别有三个菜系对应的厨师,但是我们去饭店吃饭,并不需要管事那个厨师炒的菜,只需要点菜下单即可,有服务员将菜分配给不同的厨师去具体处理,那么这个服务员就充当了反向代理服务器
- 正向代理
- 我们通常无法直接访问外网,这时候可以通过一个代理服务器帮助我们来访问外网,比如说我无法访问 服务器A,但是可以访问 服务器B,那么我可以去访问 服务器B,然后由 服务器B 去帮我把请求转发给 服务器A,这种就叫正向代理,比如说 VPN 就是这样的流程
负载均衡
内网服务器因为要处理大量的业务逻辑,因此,内网单台服务器的响应能力非常有限,为了提供更加快速的响应,一般会在内网架设多台业务逻辑处理器,当某一台正在工作时,可以由其他正在闲置的服务器来处理请求响应;
后端多台相同的业务逻辑服务器,被称为服务器集群;而当请求到来时,到底由那台服务器进行处理,取决于代理转向那台服务器,这项能力,就叫负载均衡
|