文章目录
1.第⼀部分:Nginx基础回顾
Nginx是什么?能做什么事情(应⽤在什么场合)?常⽤命令是什么?
Nginx 到底是什么? Nginx 是⼀个⾼性能的HTTP和反向代理web服务器,核⼼特点是占有内存少,并发能⼒强
Nginx ⼜能做什么事情(应⽤场景)
Http服务器(Web服务器)
性能⾮常⾼,⾮常注重效率,能够经受⾼负载的考验。 ⽀持50000个并发连接数,不仅如此,CPU和内存的占⽤也⾮常的低,10000个没有活动的连
接才占⽤2.5M的内存。
1.1 正向代理(Forward Proxy)
正向代理是客户端与互联网之间的中间服务器。客户端向代理服务器发送请求,代理服务器代替客户端向目标服务器发出请求,然后将目标服务器的响应返回给客户端。
- 匿名性:隐藏客户端的真实 IP 地址,提供一定程度的匿名性。目标服务器只看到代理服务器的 IP 地址,而不是客户端的 IP 地址。
- 访问控制:可以用于控制对特定网站或资源的访问,例如,通过设置黑名单或白名单来限制用户的访问权限。
- 缓存:代理服务器可以缓存常见的请求和响应,从而减少对目标服务器的请求次数,提高访问速度。
- 过滤:可以用于内容过滤,例如阻止访问不合适的网站或屏蔽广告。
总结: 正向代理都是代表客户端,隐藏了真是的客户端
1.2 反向代理(Reverse Proxy)
反向代理是目标服务器与互联网之间的中间服务器。客户端的请求首先到达反向代理,反向代理根据请求的内容决定将请求转发到哪个目标服务器,然后将目标服务器的响应返回给客户端。
- 负载均衡:通过将请求分配到不同的目标服务器上,反向代理可以实现负载均衡,提升系统的可扩展性和性能。
- 缓存:可以缓存来自目标服务器的响应,从而减少目标服务器的负载并加快响应速度。
- 安全性:保护内部服务器不直接暴露给外部网络,防止直接攻击,增强安全性。
- SSL/TLS 终端:可以处理客户端与代理之间的加密连接,并将请求以未加密的形式转发到后端服务器,从而简化后端服务器的加密处理。
- 内容压缩:可以对响应进行压缩,从而减少网络带宽消耗。
总结: 反向代理代理的对象是服务端,可以实现负载均衡
1.3 Nginx的特点
- 跨平台:Nginx可以在⼤多数类unix操作系统上编译运⾏,⽽且也有windows版本
- Nginx的上⼿⾮常容易,配置也⽐较简单 ⾼并发,性能好
- 稳定性也特别好,宕机概率很低
- 负载均衡服务器
- 动静分离,tomcat处理静态资源的能力不强
2. 第⼆部分:Nginx核⼼配置⽂件解读
Nginx的核⼼配置⽂件conf/nginx.conf包含三块内容:全局块、events块、http块
2.1 全局块
从配置⽂件开始到events块之间的内容,此处的配置影响nginx服务器整体的运⾏,⽐如worker进程的数量、错误⽇志的位置等
全局块通常包含以下几个主要配置块:
user: 指定 Nginx 进程运行的用户和用户组。默认情况下,Nginx 进程以 nobody 用户和 nogroup 用户组运行。
user www-data;
worker_processes: 设置 Nginx 启动的工作进程数量。通常设置为 CPU 核心数的数量,以充分利用多核处理器的性能。
worker_processes auto;
**worker_connections:**定义每个工作进程可以打开的最大连接数。这决定了每个进程能处理的最大并发连接数。
events {
worker_connections 1024;
}
pid:
指定保存 Nginx 主进程 ID 的文件路径。这个文件用于进程管理和监控。
pid /var/run/nginx.pid;
2.2 events块
events块主要影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个
workderprocess⽀持的最⼤连接数为1024
worker_connections: 指定每个工作进程可以同时打开的最大连接数。
作用:决定了 Nginx 工作进程的并发连接能力。增加此值可以提高处理高并发请求的能力,但也会增加系统资源的使用。
events {
worker_connections 1024;
}
use: 定义:指定 Nginx 使用的事件驱动模型。Nginx 支持多种事件驱动模型,如 epoll(在 Linux 上)、kqueue(在 BSD 上)、select、poll 等。
作用:选择适合操作系统的事件驱动机制,以提高性能和效率。
events {
use epoll;
worker_connections 1024;
}
epoll:Linux 系统上的高效事件处理模型。
kqueue:BSD 系统上的事件处理模型。
select:传统的事件处理模型,适用于旧版本的系统,但性能较差。
poll:类似于 select,但没有 select 的限制。
2.3 http块
http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等
http 块 是 Nginx 配置文件中用于设置 HTTP 相关参数的主要部分。
包含了日志配置、文件上传限制、性能优化 ,Gzip 压缩等多种配置。
配置的优化可以提高服务器的性能、可维护性和用户体验。
2.4 示例配置
全局块配置
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 定义日志格式
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;
# 配置错误日志
error_log /var/log/nginx/error.log warn;
# 包含其他配置文件
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/x.conf;
# 设置默认的 MIME 类型
default_type application/octet-stream;
# 设置文件上传大小限制
client_max_body_size 10M;
# HTTP server 配置块
server {
# 指定服务器监听的端口号。80 是 HTTP 的默认端口。所有到达这个端口的请求将由这个 server 块处理。
listen 80;
# 指定处理请求的服务器名称或域名。这里配置了 example.com,表示这个 server 块会处理到达 example.com 域名的请求。可以配置多个域名,或使用通配符
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
3. 第三部分:Nginx应⽤场景之反向代理
4. 第四部分:Nginx应⽤场景之负载均衡
定义 Upstream 组: upstream 块用于定义一组后端服务器。所有的负载均衡配置都在这个块中进行定义。
upstream xxx{
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
在这个示例中,backend 是一个上游服务器组的名字,包含了三个后端服务器。
使用 Upstream 组
在 server 块中,使用 proxy_pass 指令将请求转发到 upstream 组中定义的服务器。
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://xxx;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
在这个配置中,proxy_pass 指令将请求转发到 http://backend,即 upstream 块中定义的服务器组。
负载均衡策略
- 轮询(默认)
- 最少连接
- 加权轮询
- IP 哈希
- 随机
5. 第五部分:Nginx应⽤场景之动静分离
动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上,⽐较经典的组合就是
Nginx+Tomcat架构(Nginx处理静态资源请求,Tomcat处理动态资源请求),那么其实之前的讲解
中,Nginx反向代理⽬标服务器Tomcat,我们能看到⽬标服务器ROOT项⽬的index.jsp,这本身就是
Tomcat在处理动态资源请求了。 所以,我们只需要配置静态资源访问即可。
6. 第六部分:Nginx底层进程机制剖析
Nginx启动后,以daemon多进程⽅式在后台运⾏,包括⼀个Master进程和多个Worker进程,Master 进程是领导,是⽼⼤,Worker进程是⼲活的⼩弟。
6.1 master进程
主要是管理worker进程,⽐如:接收外界信号向各worker进程发送信号(./nginx -s reload) 监控worker进程的运⾏状态,当worker进程异常退出后Master进程会⾃动重新启动新的 worker进程等
- 启动时检查配置文件语法检查
- 尝试配置 ⽐如修改了监听端⼝,那就尝试分配新的监听端⼝ nginx -s reload
- 尝试成功则使⽤新的配置,新建worker进程
- 新建成功,给旧的worker进程发送关闭消息
- 旧的worker进程收到信号会继续服务,直到把当前进程接收到的请求处理完毕后关闭 所以reload之后worker进程pid是发⽣了变化的
6.2 worker进程
worker进程具体处理⽹络请求。多个worker进程之间是对等的,他们同等竞争来⾃客户端的请 求,各进程互相之间是独⽴的。⼀个请求,只可能在⼀个worker进程中处理,⼀个worker进程,
不可能处理其它进程的请求。worker进程的个数是可以设置的,⼀般设置与机器cpu核数一致
worker进程处理请求部分的说明 例如,我们监听9003端⼝,⼀个请求到来时,如果有多个worker进程,那么每个worker进程都有 可能处理这个链接。
master进程创建之后,会建⽴好需要监听的的socket,然后从master进程再fork出多个
worker进程。所以,所有worker进程的监听描述符listenfd在新连接到来时都变得可读。 nginx使⽤互斥锁来保证只有⼀个workder进程能够处理请求,拿到互斥锁的那个进程注册 listenfd读事件,在读事件⾥调⽤accept接受该连接,然后解析、处理、返回客户端
nginx多进程模型好处 每个worker进程都是独⽴的,不需要加锁,节省开销 每个worker进程都是独⽴的,互不影响,⼀个异常结束,其他的照样能提供服务
多进程模型为reload热部署机制提供了⽀撑