Nginx 实用知识大全:从模块作用到高并发承载
在日常的技术交流中,很多人都会对 Nginx 的各类功能和操作产生疑问。本文将整合相关问题及解答,为大家详细介绍 Nginx 的模块作用、反向代理、动静分离、防盗链、压缩功能、高并发承载、rewrite 以及虚拟主机等实用知识。
Nginx 模块作用介绍
Nginx 的功能扩展主要通过模块实现,模块分为核心模块(必选,基础功能)、标准模块(可选,增强功能)和第三方模块(自定义扩展),常见模块作用如下:
核心模块
ngx_core_module:Nginx 的基础框架,处理进程管理、配置解析、信号处理等核心逻辑。
ngx_http_module:HTTP 服务的基础模块,处理 HTTP 请求解析、响应构建、连接管理等。
标准模块
ngx_http_proxy_module:实现反向代理功能,将请求转发到后端服务器(如 Tomcat、API 服务)。
ngx_http_upstream_module:管理后端服务器集群,支持负载均衡(轮询、权重、IP 哈希等)。
ngx_http_rewrite_module:URL 重写工具,可基于规则修改请求路径(如 301 跳转、伪静态)。
ngx_http_gzip_module:对响应数据进行 Gzip 压缩,减少传输带宽。
ngx_http_static_module:处理静态资源(HTML、CSS、图片等)的读取和返回。
ngx_http_access_module:基于 IP 地址控制访问权限(允许 / 禁止特定 IP)。
第三方模块
ngx_http_lua_module:嵌入 Lua 脚本,实现复杂业务逻辑(如动态路由、限流)。
ngx_pagespeed:自动优化静态资源(压缩、合并、缓存),提升页面加载速度。
Nginx 反向代理相关
反向代理的权重设置
反向代理的权重用于负载均衡,通过upstream模块定义后端服务器集群时,用weight参数指定权重(默认权重为 1,权重越高,分配的请求越多)。
配置示例:
定义后端服务器集群(名称为backend)
upstream backend {
server 192.168.1.101:8080 weight=3; # 权重3,接收3/(3+2)=60%的请求
server 192.168.1.102:8080 weight=2; # 权重2,接收40%的请求
}
反向代理配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 转发请求到backend集群
proxy_set_header Host $host; # 传递原始主机名到后端
proxy_set_header X-Real-IP KaTeX parse error: Expected 'EOF', got '#' at position 15: remote_addr; #̲ 传递客户端真实IP ...只匹配.php结尾,不匹配.PHP)。
*:不区分大小写的正则匹配(例如* .php$同时匹配.php和.PHP)。
^~:优先匹配普通字符串路径,不进行正则匹配(用于精确路径的优先级提升)。
常用正则符号含义
符号
含义
示例
^
匹配字符串开头
^/api 匹配以/api开头的路径
匹配字符串结尾h˙tml 匹配字符串结尾 \.html匹配字符串结尾h˙tml 匹配以.html结尾的路径
.
匹配任意单个字符(除换行符)
a.b 匹配aab、acb等
匹配前一个字符 0 次或多次
ab 匹配a、ab、abb等
+
匹配前一个字符 1 次或多次
ab+ 匹配ab、abb等(不匹配a)
?
匹配前一个字符 0 次或 1 次
ab? 匹配a、ab
()
分组捕获(可通过$1、KaTeX parse error: Undefined control sequence: \d at position 15: 2引用) ^/user/(\̲d̲+) 捕获/user/123中的123
|
逻辑 "或"
jpg|png 匹配jpg或png
\] 匹配括号内的任意一个字符 \[0-9\] 匹配任意数字 动静分离的工作原理 动静分离是将动态请求(如 PHP、Java 接口)和静态资源(如 HTML、CSS、图片、JS)分开处理,以提高效率。 工作原理 静态资源:由 Nginx 直接处理(Nginx 处理静态资源的效率远高于应用服务器)。通过location指令匹配静态资源后缀(如.html、.css、.jpg),直接从本地文件系统读取并返回。 动态请求:由 Nginx 转发到后端应用服务器(如 Tomcat、PHP-FPM)处理。通过location匹配动态路径(如/api、.php),使用proxy_pass转发到后端服务器,再将结果返回给客户端。 配置示例 server { listen 80; server_name example.com; root /var/www; # 静态资源根目录 # 处理静态资源(直接返回) location \~\* .(html\|css\|js\|jpg\|png\|gif)$ { expires 1d; # 设置缓存时间,减少重复请求 } # 处理动态请求(转发到后端PHP-FPM) location \~ .php$ { proxy_pass http://127.0.0.1:9000; # 转发到PHP-FPM proxy_set_header Host KaTeX parse error: Expected 'EOF', got '}' at position 12: host; }̲ # 处理API... { # 保护的资源类型(正则匹配后缀) # 1. 允许的合法来源 valid_referers none blocked 你的域名.com \*.你的域名.com; # 解释: # - none:允许没有 Referer 的请求(比如用户直接在地址栏输入图片URL访问) # - blocked:允许 Referer 被浏览器或代理隐藏的请求(比如部分隐私模式) # - 你的域名.com:允许从你的主域名发起的请求 # - \*.你的域名.com:允许从你的子域名发起的请求(比如 blog.你的域名.com) # 2. 如果来源不合法(不在 valid_referers 列表中) if ($invalid_referer) { 配置后生效步骤 保存配置文件。 检查配置是否有误:nginx -t(如果显示success说明没问题)。 重启 Nginx 生效:systemctl restart nginx(或nginx -s reload平滑重启)。 Nginx 压缩 压缩的含义 Nginx 的 "压缩" 指的是对服务器返回给客户端的内容(如网页、CSS、JS、图片等)进行压缩处理,再传输到客户端,从而减少网络传输的数据量。把内容 "变小" 再发送,节省流量、加快加载速度。 开不开压缩的区别 场景 不开压缩(默认) 开压缩(配置后) 传输数据量 原始大小(如 100KB) 压缩后大小(如 30KB,取决于压缩率) 加载速度 慢(传输量大) 快(传输量小) 服务器消耗 无额外 CPU 消耗 少量 CPU 用于压缩(可忽略) 适用资源 已压缩的资源(如 PNG/JPG 图片、视频) 文本类资源(HTML、CSS、JS、JSON 等) 开启压缩的配置 Nginx 通过gzip模块(默认内置)实现压缩,在配置文件中开启并设置规则即可。 ## 开启 gzip 压缩(放在 http 或 server 块内) gzip on; # 开启压缩(off 为关闭) ## 压缩的详细规则(按需调整) gzip_min_length 1k; # 文件大于1KB才压缩(太小的文件压缩意义不大) gzip_buffers 4 16k; # 压缩缓冲区大小(4个16KB的缓冲区) gzip_comp_level 5; # 压缩等级(1-9,等级越高压缩率越高,CPU消耗越大,5是平衡值) gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 需要压缩的文件类型(重点!只压缩文本类) gzip_vary on; # 告诉客户端"此内容已压缩",避免客户端解压错误 Nginx 承载高并发的方法 Nginx 能承载高并发,核心在于其异步非阻塞的事件驱动模型,配合合理的配置优化,可以轻松应对高并发连接。具体优化方向如下: 基础配置优化(核心参数) 在nginx.conf的events和http块中调整参数: events { worker_connections 10240; # 每个 worker 进程能处理的最大连接数(默认1024,调大到1万+) use epoll; # 启用高效的 epoll 事件模型(Linux 系统推荐,处理高并发性能更好) multi_accept on; # 允许一个 worker 同时接收多个新连接 } http { # 连接超时设置(减少无效连接占用资源) keepalive_timeout 60; # 长连接超时时间(客户端和服务器保持连接的时间) tcp_nodelay on; # 禁用 Nagle 算法,小数据传输更及时 sendfile on; # 启用零拷贝技术(减少内核态和用户态数据拷贝,提升文件传输效率) tcp_nopush on; # 配合 sendfile 使用,批量发送数据,减少网络包数量 } 进程数优化 Nginx 的worker_processes应设置为服务器 CPU 核心数(充分利用多核性能): worker_processes auto; # 自动匹配 CPU 核心数(推荐) ## 或手动指定(如4核CPU设为4) ## worker_processes 4; 负载均衡与集群 单台 Nginx 性能有限,通过反向代理 + 后端服务器集群分担压力: ## 定义后端服务器集群(多台服务器分担请求) upstream backend { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; } server { listen 80; location / { proxy_pass http://backend; # 请求转发到集群 } } rewrite rewrite是 Nginx 的 URL 重写模块(ngx_http_rewrite_module)提供的指令,用于根据规则修改请求的 URL 路径,实现跳转、伪静态、隐藏真实路径等功能。 核心作用 URL 跳转:比如将http强制跳转至https,或旧域名跳转至新域名。 伪静态:将动态 URL(如index.php?id=1)伪装成静态路径(如article/1.html),利于 SEO。 路径重写:隐藏后端真实路径,比如将/api/v1/user重写为/user。 常用示例 server { # 1. http 强制跳转至 https listen 80; server_name example.com; rewrite \^(.*)$ https://$hostKaTeX parse error: Expected 'EOF', got '#' at position 15: 1 permanent; #̲ permanent 表示 3... /article.php?id=KaTeX parse error: Expected 'EOF', got '#' at position 10: 1 last; #̲ last 表示完成重写后不再... { rewrite \^(.* )$ /forbidden.html break; # break 表示重写后直接返回,不继续处理 } } 虚拟主机 虚拟主机(Virtual Host)是 Nginx 中在单台服务器上托管多个网站的技术(共享服务器资源,通过域名或端口区分不同网站)。主要有 3 种类型: 基于域名的虚拟主机(最常用) 通过不同的server_name(域名)区分网站,共用一个端口(通常是 80/443)。 ## 网站1:example.com server { listen 80; server_name example.com www.example.com; # 绑定域名 root /var/www/example; # 网站根目录 } ## 网站2:test.com server { listen 80; server_name test.com; # 绑定另一个域名 root /var/www/test; } 原理:客户端访问时,Nginx 根据请求头中的Host字段(域名)匹配对应的server块。 基于端口的虚拟主机 通过不同的端口区分网站,共用一个 IP 或域名。 ## 端口 8080 的网站 server { listen 8080; # 端口1 server_name example.com; root /var/www/site1; } ## 端口 8081 的网站 server { listen 8081; # 端口2 server_name example.com; root /var/www/site2; } 访问方式:http://example.com:8080访问第一个网站,http://example.com:8081访问第二个。 基于 IP 的虚拟主机 通过服务器的不同 IP 地址区分网站(需服务器绑定多个 IP)。 ## 绑定 192.168.1.100 的网站 server { listen 192.168.1.100:80; # 特定IP+端口 root /var/www/site1; } ## 绑定 192.168.1.101 的网站 server { listen 192.168.1.101:80; # 另一个IP+端口 root /var/www/site2; } 适用场景:需要通过 IP 直接访问不同网站(较少用,不如域名直观)。 以上就是关于 Nginx 的一系列实用知识,希望能帮助大家更好地理解和使用 Nginx。