nginx 基础核心 一、Nginx 基础介绍1. 核心四大功能静态 Web 服务: 直接处理并响应 HTML、CSS、JavaScript、图片等静态文件请求。反向代理: 接收客户端请求然后转发给后端的应用服务器如 Tomcat, PHP-FPM并将结果返回给客户端。负载均衡: 基于反向代理将客户端请求分发到多个后端服务器实现流量分摊和高可用。负载均衡功能是反向代理的延伸和应用。前端缓存: 将后端返回的动态内容或静态资源缓存到 Nginx 本地缩短响应时间减轻后端服务器压力。2. 技术特性开发语言: 纯 C 语言编写性能优异资源消耗低。IO 模型: 采用epoll事件驱动模型Linux支持高并发连接异步非阻塞处理方式。架构: 高度模块化设计核心功能与扩展模块分离配置语法简洁管理方便。3. 三种虚拟主机配置方式用于在一台 Nginx 服务器上部署多个不同的网站。表格匹配类型配置指令作用描述实操案例基于域名server_name同一 IP 和端口通过不同域名区分不同网站。server_name www.yun333.com;基于端口listen同一 IP通过监听不同的端口来区分不同网站。listen 81;基于 IPlisten服务器绑定多个 IP 地址通过不同的 IP 来区分不同网站。listen 192.168.1.100:80;二、Nginx 核心功能详解1. 地址重写 (Rewrite)用于改变用户请求的 URI实现 URL 跳转、规范化等功能。语法:nginxrewrite 匹配规则(正则表达式) 目标地址 [标记];四种常用标记 (flag):表格标记含义与作用场景last停止当前location的rewrite规则然后根据重写后的 URL重新发起一次内部请求从头开始匹配server和location。用于将请求重写到其他location块进行处理。break停止当前location的rewrite规则不再继续处理直接使用当前重写后的 URI 在当前location中处理请求。用于在当前location内完成重写。redirect返回302 临时重定向。浏览器地址栏会显示新的 URL。主要用于临时的页面跳转。临时维护、页面临时移动。permanent返回301 永久重定向。搜索引擎会更新索引浏览器会缓存该重定向规则。域名更换、页面永久迁移。案例将不带www的域名永久重定向到带www的域名nginxserver { listen 80; server_name yun333.com; # ^/(.*)$ 匹配所有路径$1 代表匹配到的路径部分 rewrite ^/(.*)$ http://www.yun333.com/$1 permanent; }2. 反向代理 (Proxy_pass)概念: Nginx 作为客户端和后端服务器之间的代理隐藏后端服务器的真实 IP 和端口统一对外提供服务。核心指令:proxy_pass http://后端服务器地址;案例代理后端的 Java Web 应用nginxserver { listen 80; server_name app.yun333.com; location / { # 将请求转发到后端运行在 8080 端口的 Tomcat 服务器 proxy_pass http://192.168.91.165:8080; # 重要将客户端的真实 IP 传递给后端服务器 proxy_set_header X-Real-IP $remote_addr; # 重要将客户端请求的 Host 头传递给后端后端可能需要此信息 proxy_set_header Host $host; # 重要传递客户端的原始协议和端口特别是在 HTTPS 环境下 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }3. 负载均衡 (Load Balancing)3.1 四层负载与七层负载四层负载均衡 (传输层): 工作在 OSI 模型的第四层TCP/UDP。基于IP 地址和端口号进行流量分发。它不关心应用层的内容如 HTTP 请求。代表软件LVS。七层负载均衡 (应用层): 工作在 OSI 模型的第七层HTTP/HTTPS。可以识别 HTTP 协议的完整内容如域名 (Host)、URL (URI)、请求头、Cookie等进行更精细的流量调度。代表软件Nginx, HAProxy。3.2 主流负载均衡方案开源软件:Nginx: 主流的七层负载均衡器性能高配置灵活。从 1.9.0 版本开始通过stream模块支持四层TCP 负载均衡。LVS (Linux Virtual Server): 强大的四层负载均衡器性能极高工作在内核态。HAProxy: 同时支持四层和七层功能强大常用于数据库等多种服务的负载均衡。商业硬件:F5 BIG-IP, A10, Radware, Citrix Netscaler 等。性能强大功能丰富但价格昂贵。3.3 Nginx 负载均衡实现Nginx 实现负载均衡依赖两个核心部分upstream块: 定义一个后端服务器地址池。proxy_pass指令: 将请求转发到upstream定义的地址池。upstream块关键字段:server: 定义后端服务器格式为IP:端口。weightnumber: 设置权重。数字越大被分配到的请求越多。down: 标记该服务器为永久不可用。backup: 标记该服务器为备用服务器。只有当所有非备用服务器都不可用时才会将请求转发给它。调度算法:rr(Round Robin, 轮询): 默认算法。请求按顺序逐一分配到不同的后端服务器。wrr(Weighted Round Robin, 权重轮询): 根据权重分配请求。权重越高的服务器处理的请求越多。ip_hash: 根据客户端的 IP 地址进行哈希计算来自同一个 IP 的请求将始终被定向到同一台后端服务器。可用于解决会话保持问题。fair: 根据后端服务器的响应时间来分配请求响应时间短的优先分配。需要第三方模块支持least_conn: 将请求分配给当前活动连接数最少的后端服务器。适用于请求处理时间长短不一的场景。健康检查: Nginx 默认会对后端节点进行简单的健康检查。如果某个节点连续失败Nginx 会在一段时间内停止将请求转发给它。但它不会主动发送告警需要结合监控系统来实现。完整负载均衡案例:nginxhttp { # 1. 定义一个名为 backend_pool 的后端服务器地址池 upstream backend_pool { # 调度算法这里使用 ip_hash 实现会话保持 ip_hash; # 后端服务器1权重为 2 server 192.168.91.165:8080 weight2; # 后端服务器2权重为 1 server 192.168.91.166:8080 weight1; # 后端服务器3标记为备用服务器 server 192.168.91.167:8080 backup; } server { listen 80; server_name www.yun333.com; location / { # 2. 将所有请求转发到名为 backend_pool 的地址池 proxy_pass http://backend_pool; # 传递必要的请求头信息 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. 标准化管理将不同网站的配置文件分离存放在conf.d目录下通过include conf.d/*.conf;在主配置文件中引入。使用注释清晰地标明每个配置块的用途。统一日志格式和存放路径。2. 基础优化建议worker_processes: 通常设置为 CPU 核心数或核心数的 2 倍。auto会自动检测。worker_connections: 每个 worker 进程的最大连接数。sendfile on;: 启用高效文件传输模式。keepalive_timeout: 长连接超时时间。3. 完整带注释的 Nginx 配置示例nginx# 工作进程数建议设置为CPU核心数 worker_processes auto; events { # 每个工作进程的最大连接数 worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # 开启高效文件传输 sendfile on; # 开启TCP_NOPUSH在sendfile开启时有效 tcp_nopush on; # 长连接超时时间 keepalive_timeout 65; # 定义后端服务器地址池 upstream my_backend_servers { # 使用权重轮询算法 # wrr; # 使用IP哈希算法保证会话粘性 ip_hash; # 后端节点1权重为3 server 192.168.91.165:80 weight3; # 后端节点2权重为1 server 192.168.91.166:80 weight1; # 后端节点3作为备份 server 192.168.91.167:80 backup; } server { listen 80; server_name localhost; location / { # 将请求反向代理到地址池 proxy_pass http://my_backend_servers; # 将客户端请求的 Host 头传递给后端服务器 proxy_set_header Host $host; # 将客户端的真实IP地址传递给后端服务器 proxy_set_header X-Real-IP $remote_addr; # 在已有X-Forwarded-For头信息后追加客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 引入其他网站的配置文件 # include conf.d/*.conf; }