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。

相关推荐
苹果醋31 小时前
iview中实现点击表格单元格完成编辑和查看(span和input切换)
运维·vue.js·spring boot·nginx·课程设计
hweiyu003 小时前
开发运维DevOps(附电子书资料)
运维·devops
feifeigo1233 小时前
自动化运维:从脚本到DevOps的演进
运维·自动化·devops
不念霉运3 小时前
国产DevOps平台Gitee:如何重塑中国企业研发效能新格局
运维·gitee·devops
飛_3 小时前
【Word Press基础】创建一个动态的自定义区块
运维·nginx·html·word press
程序员黄老师3 小时前
在 Windows 使用 Nginx/HAProxy 实现负载均衡
windows·nginx·负载均衡
程序员黄老师3 小时前
四层负载均衡与七层负载均衡详解
运维·负载均衡
晴天彩虹雨3 小时前
统一调度与编排:构建自动化数据驱动平台
大数据·运维·数据仓库·自动化·big data·etl
贺贺丿4 小时前
Docker4-容器化企业级应用
linux·nginx·docker·云原生·eureka·tomcat·ssh
SH11HF4 小时前
ZABBIX配置自动发现与自动注册,网易邮箱告警和钉钉告警
运维·服务器·zabbix