目录
一、Nginx简介
Nginx 作为一款高性能的 Web 服务器和反向代理服务器,广泛应用于现代互联网,特别是对于实现微服务架构下的负载均衡和 API 网关功能至关重要。在互联网基础设施中扮演着重要角色,特别在高并发、高性能的网站和应用程序部署中。
Nginx 具有如下特点:
- 高性能:占用内存少,处理能力强,能够支持高并发连接。
- 稳定性:长期运行稳定性高。
- 低资源消耗:相比其他服务器软件,Nginx 对系统资源的使用非常高效。
- 跨平台:可在多种操作系统上运行
- 易于部署和维护:安装简单,配置文件结构清晰,文档丰富,社区活跃,持续更新和维护。
二、代理
所谓的代理就是一个代表,此时涉及两个角色,一个是被代理的角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务过程称为代理过程。
2.1 正向代理
正向代理就是经常接触的代理模式,正向代理位于客户端与目标服务器之间,代表客户端向目标服务器发起请求。客户端首先将请求发送到正向代理服务器,代理服务器再将请求转发给目标服务器,并将收到的结果返回给客户端。在这个过程中,目标服务器看到的是代理服务器的 IP地址,而不是客户端的真实 IP,从而达到隐藏客户端身份的目的。
正向代理需要在客户端进行配置,明确代理服务器地址,可以为客户提供一定程度上的匿名性和安全性。
比如,在企业内部网络中,正向代理可以作为访问外网资源的唯一出口,通过代理服务器可以实施严格的访问策略。
2.2 反向代理
反向代理位于目标服务器之前,代表服务器接收客户端的请求。客户端实际上并不直接与目标服务器通信,而是将请求发送给反向代理服务器,由反向代理服务器将请求转发给内部网路中的一个或多个目标服务器,并将从这些服务器接收到的响应返回给客户端。这样客户端感知不到实际处理请求的服务器。
反向代理的特点是对用户透明,提供了一层额外的防护。
三、代理配置
Nginx 的主配置文件未 nginx.conf,它决定了 Nginx 的运行方式、监听端口、处理请求方式、以及如何与后端服务器进行交互等关键配置。配置文件示例如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream firstdemo {
server 127.0.0.1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8889; # 后端服务器地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# HTTPS server
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
include servers/*;
}
配置文件组成:
- 全局配置:配置影响 Nginx 全局运行的指令,如 work_processes(工作进程数量)、error_log (错误日志位置及级别)、pid (pid 文件路径)等
- events 快:涉及 Nginx 处理连接的方式:
worker_connections
指令:每个 worker 进程能够同时处理的最大连接数。use
指令:选择事件处理模型,如epoll(Linux)、kqueue(FreeBSD和macOS)等,以优化性能。
- http块:这时配置文件中最重要的部分,包含所有与HTTP服务相关的配置。
include
指令:引入其他配置文件,便于管理和组织配置。server
块:定义一个虚拟主机,可以有多个,每个server块可以配置不同的域名、端口、以及相关的处理规则。listen
指令:指定该server监听的端口或地址。server_name
指令:定义该虚拟主机服务的域名或IP地址。root
或alias
指令:指定静态文件的根目录。location
块:根据URL路径来定义不同的处理规则,比如代理转发、静态文件服务、重定向等。proxy_pass
指令:在反向代理配置中,指定后端服务器的地址。rewrite
指令:用于URL重写或重定向。
upstream
块:定义一组后端服务器,用于负载均衡配置。
- SSL/TLS配置:在HTTP模块内部,还可以配置SSL/TLS支持,以启用HTTPS服务,涉及指令如
ssl_certificate
和ssl_certificate_key
用于指定证书和私钥文件。 - 日志格式与日志访问:通过
log_format
定义日志格式,以及在server块中使用access_log
指令指定访问日志的存放路径。 - 其他配置:在配置文件中还可以添加缓存设置、限流、压缩、安全头设置、自定义错误页面的等。
3.1 负载均衡
在nginx中配置负载均衡,需要在http块或server块中定义一个或多个upstream块来指定后端服务器列表,然后在location块中引用这个upstream,配置如下:
http {
upstream backend_servers {
server backend1.example.com; # 第一台后端服务器
server backend2.example.com; # 第二台后端服务器
# 可以继续添加更多服务器
# server ...;
# 可选:负载均衡策略,默认是轮询,还可以配置为weight、ip_hash等
least_conn; # 例如,使用最少连接数策略
}
server {
listen 80;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
这段配置定义了一个名为 backend
的上游服务器组,包含两个后端服务器。然后,在 server
块中,通过 location
指令将所有请求转发到这个上游服务器组。proxy_pass
指定了代理的目标地址,proxy_set_header
用于设置传递给后端服务器的 HTTP 头信息,比如客户端的主机名和真实IP地址。
四、架构及原理
Nginx 分为主进程和工作进程,Nginx 启动时首先会创建一个主进程,该进程负责读取和验证配置文件、管理 work 进程,执行信号以及周期性的做日志回滚、配置重新加载等工作。
主进程根据配置文件中的指令 fork 出指定数量的工作进程来处理实际网络请求。工作进程是轻量级的,每个进程都能独立处理连接、请求和响应,这得益于 Nginx 的事件驱动模型。
用户发送请求后,Master 接受到请求,然后通知 worker 工作进程,worker 对 client 的请求进行争抢,获取到用户请求的那个 worker 根据负载均衡请求后续的服务。
工作原理如下:
- 事件驱动与异步非阻塞:Nginx 使用了高效的事件驱动模型,结合异步非阻塞 IO。这意味着一个工作进程可以同时处理成千上万个连接,而无需为每个连接分配独立的线程,大大提高了资源利用率和并发处理能力。
- 多路复用:通过多路复用技术,Nginx 可以监视大量连接就绪的状态,一旦有连接准备好读写操作,立即进行处理,避免了不必要的等待时间。
- 模块化设计:Nginx 采用高度模块化的架构,核心功能围绕 HTTP、邮件服务等基本模块展开,同时支持各种可选的HTTP模块(如 Rewrite、SSL、Gzip)、第三方模块等。这种设计使得 Nginx 非常灵活,可以根据需要加载不同的功能模块,且易于扩展和定制。
- 配置与加载:Nginx 的配置文件(默认为nginx.conf)定义了服务器块、监听端口、代理设置、日志记录等信息。配置更改后,主进程可以通过信号机制优雅地重新加载配置,无需中断服务。
- 负载均衡:Nginx 作为反向代理时,可以配置为负载均衡器,根据不同的策略(如轮询、最少连接、哈希等)将请求分发到后端服务器集群,提高服务的可用性和响应速度。
综上所述,Nginx通过其强大的反向代理和负载均衡能力,不仅提升了系统的整体性能和可靠性,也为复杂的微服务架构提供了灵活高效的解决方案。正确配置和优化这些功能,是构建稳定、高性能Web服务的关键。
往期经典推荐:
Kafka VS RabbitMQ,架构师教你如何选择_rabbitmq和kafka选型-CSDN博客