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。