Nginx 实用知识大全:从模块作用到高并发承载

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。

相关推荐
ping某17 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes