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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值