首页
视频
壁纸
统计
更多
留言
关于
Search
1
Linux 基础命令之用户权限管理命令全解析
4 阅读
2
Linux 网络配置、DNS设置及密码重置完整教程
3 阅读
3
Linux 系统目录功能完整解析
3 阅读
4
Linux 基础命令之文件管理命令全解析
3 阅读
5
Linux 基础命令之系统开关机命令全解析
3 阅读
SRE云计算基础
LINUX基础
基础服务
AIOPS
数通网络
网络安全
弱电项目
登录
Search
蛋蛋
累计撰写
17
篇文章
累计收到
1
条评论
首页
栏目
SRE云计算基础
LINUX基础
基础服务
AIOPS
数通网络
网络安全
弱电项目
页面
视频
壁纸
统计
留言
关于
搜索到
4
篇与
的结果
2025-11-27
location块深度解剖
核心概念:location 块location 块是 Nginx 配置文件中 (nginx.conf 或其包含的文件,通常在 http, server 上下文中) 的核心指令之一。它用于根据请求的 URI(统一资源标识符,即域名或IP端口之后的部分)来定义如何处理请求(例如代理到后端应用服务器、返回静态文件、重定向等)。匹配模式与优先级(由高到低):Nginx 的 location 匹配遵循特定的优先级规则,理解这个顺序至关重要,否则可能导致配置不符合预期:location = /exact/path (精确匹配):描述: 使用 = 前缀表示精确匹配。只有当请求的 URI 完全等于 /exact/path 时,这个 location 块才会被选中。优先级: 最高。一旦匹配成功,将立即使用此配置,不再继续检查其他 location 块。用例: 处理特定、明确的端点,如登录页、健康检查端点 (/healthz)、特定的 API 入口点。location ^~ /prefix/ (前缀匹配 - 停止正则搜索):描述: 使用 ^~ 前缀表示常规字符串匹配(前缀匹配),并且如果匹配成功,Nginx 将停止继续搜索任何正则表达式匹配的 location 块。优先级: 次高。它比正则表达式匹配优先级高。用例: 处理特定目录下的所有请求(通常用于静态文件服务),且不希望后续的正则 location 干扰。例如 /static/ 目录下的所有文件。location ~ /pattern/ 和 location ~* /pattern/ (正则表达式匹配):描述:~ : 表示区分大小写的正则表达式匹配。~* : 表示不区分大小写的正则表达式匹配。正则表达式提供了最灵活的匹配方式。优先级: 第三高。在精确匹配和前缀匹配(带 ^~)之后被考虑。多个正则 location 块的优先级取决于它们在配置文件中的出现顺序。第一个匹配成功的正则 location 将被使用。用例: 处理复杂的路由规则,如基于文件扩展名、动态路径参数、特定模式的 URI 进行路由。例如匹配所有图片请求 (\.(jpg|png|gif)$),或将带特定参数的 URL 路由到不同后端。location /prefix/ (常规前缀匹配 - 继续正则搜索):描述: 不使用任何修饰符的常规字符串(前缀)匹配。它匹配所有以 /prefix/ 开头 的 URI。优先级: 最低。但是,如果它被选中(即没有更高优先级的匹配项),Nginx 仍会继续检查 所有正则表达式 location 块,并选择第一个匹配的正则 location。如果没有任何正则匹配,则最终使用这个常规前缀匹配的配置。用例: 作为默认路由或兜底配置,通常用于代理主应用(如 / 代理到后端 PHP/Python/Java 应用)。但要注意后续正则匹配可能覆盖它。location / (根匹配):描述: 匹配所有请求(因为任何 URI 都以 / 开头)。优先级: 最低级别的常规前缀匹配。它遵循常规前缀匹配的规则(会被更高优先级的匹配覆盖,且匹配后仍会搜索正则)。企业实战案例场景场景 1: 静态资源服务与动态应用分离需求: 一个 Web 应用,前端静态文件(HTML, CSS, JS, 图片)需要由 Nginx 高效直接返回,动态请求(如 API)需要代理到后端应用服务器(如 Tomcat, Django, Node.js)。配置示例:server { listen 80; server_name example.com; # 1. 精确匹配 - 健康检查 location = /healthz { access_log off; return 200 'OK'; } # 2. 前缀匹配 (带 ^~) - 静态文件服务 (图片、CSS、JS) location ^~ /static/ { root /path/to/webroot; # 文件实际存放路径 expires 30d; # 设置缓存过期时间 add_header Cache-Control "public"; # 添加缓存控制头 try_files $uri $uri/ =404; # 尝试找文件,找不到返回404 } # 3. 正则匹配 - 匹配图片文件 (不区分大小写) location ~* \.(jpg|jpeg|png|gif|ico)$ { root /path/to/images; # 图片专用目录 expires max; add_header Cache-Control "public, immutable"; } # 4. 常规前缀匹配 - 动态应用代理 (兜底路由) location / { proxy_pass http://backend_app_server; # 代理到后端 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }解析:请求 /healthz 精确匹配第一条,直接返回 OK。请求 /static/css/style.css 匹配第二条 (^~ /static/),Nginx 直接返回文件并设置缓存,不再检查后续正则。请求 /uploads/avatar.jpg 匹配第三条正则 (.jpg),由 Nginx 从 /path/to/images/uploads/avatar.jpg 返回图片并设置强缓存。请求 /api/user 或 /login 无法匹配前三条,最终落入第四条 (/),被代理到 backend_app_server。场景 2: 多版本 API 路由需求: 一个应用同时提供 v1 和 v2 版本的 API,需要根据 URL 前缀 /api/v1/ 和 /api/v2/ 将请求路由到不同的后端服务集群。配置示例:server { listen 80; server_name api.example.com; # 1. API v1 路由 (前缀匹配 - 带 ^~ 确保不干扰后续正则) location ^~ /api/v1/ { proxy_pass http://api_v1_backend; # v1 后端集群 # ... 其他代理头设置 } # 2. API v2 路由 (前缀匹配 - 带 ^~) location ^~ /api/v2/ { proxy_pass http://api_v2_backend; # v2 后端集群 # ... 其他代理头设置 } # 3. 兜底或旧版本兼容 (可选) location /api/ { # 可能重定向到默认版本或返回错误 return 404 'API version not specified or unsupported'; } }解析:请求 /api/v1/users 匹配第一条,代理到 api_v1_backend。请求 /api/v2/orders 匹配第二条,代理到 api_v2_backend。请求 /api/ 或 /api/v3/ 可能匹配第三条,返回错误提示。场景 3: 灰度发布 / A/B 测试路由需求: 基于用户 Cookie 或请求头中的特定标识(如 X-User-Group: beta),将一部分用户的请求路由到新版本服务 (backend_new),其他用户仍路由到稳定版本 (backend_stable)。配置示例:server { listen 80; server_name app.example.com; # 主配置 (稳定版) location / { # 默认路由到稳定版 set $backend "http://backend_stable"; # 检查灰度标识 (例如 Cookie) if ($http_cookie ~* "user_group=beta") { set $backend "http://backend_new"; } # 检查请求头 if ($http_x_user_group = "beta") { set $backend "http://backend_new"; } proxy_pass $backend; proxy_set_header Host $host; # ... 其他代理头设置 } }解析: 虽然主要逻辑在 if 语句中,但 location / 作为入口捕获所有请求。根据条件动态设置 proxy_pass 的目标。注意:if 在 location 中有其自身的上下文和限制,需谨慎使用。场景 4: 基础安全防护需求: 阻止直接访问敏感文件(如 .env, .git/config, *.bak)。配置示例:server { listen 80; server_name example.com; # 1. 阻止访问隐藏文件 (点号开头) location ~ /\.(?!well-known).* { # 排除 .well-known 目录 (用于 ACME) deny all; return 403; } # 2. 阻止访问特定敏感文件扩展名 location ~* \.(env|bak|conf|sql|key)$ { deny all; return 403; } # 3. 阻止访问常见版本控制目录 location ~ /\.(git|svn|hg) { deny all; return 403; } # ... 其他正常的 location 配置 }解析: 使用正则表达式匹配 (~ 或 ~*) 来识别具有特定模式(点号开头、特定扩展名、版本控制目录名)的 URI,并直接返回 403 Forbidden。关键注意事项与最佳实践优先级牢记于心: 始终牢记 = > ^~ > ~/~* (按顺序) > 无修饰符 /prefix > / 的优先级。错误的顺序会导致配置失效。正则表达式顺序: 多个正则 location 块时,顺序至关重要。Nginx 会按它们在配置文件中出现的顺序进行匹配,使用第一个匹配成功的块。将更具体的正则放在前面。^~ 的妙用: 当确定某个前缀下的所有请求都应该由这个 location 处理,且不希望后续的正则匹配干扰时,务必使用 ^~。这对于静态文件服务尤其重要,可以提升性能。谨慎使用 if: if 指令在 location 块中可用,但它在 Nginx 中是一个比较“重”的指令,使用不当会影响性能。尽量用 location 本身的匹配规则来实现路由。try_files 指令: 在静态文件服务的 location 块中,try_files 非常有用,它可以按顺序尝试多个文件或目录,最后兜底(如返回 404 或代理到后端)。测试与验证: 修改 Nginx 配置后,务必使用 nginx -t 测试配置语法。重载配置 (nginx -s reload) 后,使用各种 URL 进行充分测试,确保路由符合预期。可以使用 curl -v 或浏览器开发者工具观察请求和响应。文档化: 复杂的 location 配置应添加清晰的注释,说明其目的和匹配规则,便于后续维护。理解并熟练运用 Nginx 的 location 匹配机制是 DevOps 工程师构建高效、灵活、安全的 Web 服务架构的关键技能之一。希望这些讲解和案例能帮助你更好地应用它。
2025年11月27日
1 阅读
0 评论
0 点赞
2025-11-22
nginx配置详解
以下为 Nginx 配置文件详解(以标准 /etc/nginx/nginx.conf 为例):一、配置文件结构# 全局配置区 user nginx; # 运行用户 worker_processes auto; # 工作进程数(通常设为 CPU 核心数) error_log /var/log/nginx/error.log; # 错误日志路径 events { # 事件模型配置 worker_connections 1024; # 单个进程最大并发连接数 use epoll; # Linux 高性能网络模型(可选) } http { # HTTP 核心配置区 include /etc/nginx/mime.types; # MIME 类型映射文件 default_type application/octet-stream; # 默认响应类型 # 日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 访问日志 # 性能优化 sendfile on; # 零拷贝传输文件 tcp_nopush on; # 减少网络报文段数量 keepalive_timeout 65; # 长连接超时时间 # 虚拟主机配置容器 server { listen 80; # 监听端口 server_name example.com; # 域名 location / { # URL 路径匹配规则 root /var/www/html; # 站点根目录 index index.html; # 默认索引文件 } } # 可包含其他配置文件 include /etc/nginx/conf.d/*.conf; }二、核心模块详解1. events 块worker_connections:单个工作进程的最大并发连接数(总并发 = worker_processes × worker_connections)。use:指定事件模型,如 epoll(Linux 高效模型)、kqueue(BSD)。2. http 块日志配置:log_format custom '$request_time $upstream_response_time'; # 自定义日志格式 access_log logs/access.log custom; # 应用自定义格式性能参数:gzip on; # 开启 Gzip 压缩 gzip_types text/css application/json; # 指定压缩类型 client_max_body_size 100M; # 最大上传文件大小3. server 块(虚拟主机)基础配置:server { listen 443 ssl http2; # HTTPS + HTTP/2 server_name api.example.com; # 支持通配符 *.example.com ssl_certificate /etc/ssl/cert.pem; # SSL 证书 ssl_certificate_key /etc/ssl/key.pem; # 私钥 }4. location 块(路径匹配)匹配规则优先级:location = /path # 精确匹配(最高)location ^~ /path # 前缀匹配(不检查正则)location ~ \.php$ # 正则匹配(区分大小写)location / # 通用匹配(最低)常见场景:# 反向代理 location /api/ { proxy_pass http://backend_server; # 转发到后端 proxy_set_header Host $host; # 传递原始 Host } # 静态文件 location /static/ { alias /data/static/; # 目录映射(注意与 root 的区别) expires 30d; # 缓存过期时间 } # 动态请求 location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm.sock; # PHP-FPM include fastcgi_params; }三、高级配置示例负载均衡upstream backend { server 192.168.1.100 weight=3; # 权重 server 192.168.1.101; server 192.168.1.102 backup; # 备用节点 least_conn; # 最少连接算法 } server { location / { proxy_pass http://backend; } }安全防护# 禁止敏感文件访问 location ~* \.(sql|bak|conf)$ { deny all; } # 防爬虫 if ($http_user_agent ~* (bot|crawler)) { return 403; }HTTP 重定向到 HTTPSserver { listen 80; server_name example.com; return 301 https://$host$request_uri; # 301 永久重定向 }四、调试与验证检查配置语法:sudo nginx -t # 测试配置是否正确输出示例:nginx: configuration file /etc/nginx/nginx.conf test is successful重载配置:sudo nginx -s reload # 不重启服务加载新配置查看运行配置:nginx -T # 打印实际生效的配置(含 include 文件)五、配置文件路径主配置:/etc/nginx/nginx.conf模块化配置:conf.d/:自定义 server 配置sites-available/ & sites-enabled/(Debian 系):虚拟主机配置modules-enabled/:动态模块配置附:关键变量表变量说明$remote_addr客户端 IP 地址$request请求行(如 GET / HTTP/1.1)$statusHTTP 响应状态码$http_user_agent客户端浏览器标识$scheme协议(http / https)提示:使用 include 拆分配置,避免单个文件过大。修改配置后务必执行 nginx -t 验证语法。
2025年11月22日
2 阅读
0 评论
0 点赞
2025-11-22
Nginx从零开始安装
一、安装方式1. yum 安装(推荐新手)CentOS/RHEL 系统:# 安装 EPEL 源(CentOS 7) sudo yum install epel-release # 安装 Nginx sudo yum install nginx # 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginxUbuntu/Debian 系统:sudo apt update sudo apt install nginx sudo systemctl start nginx sudo systemctl enable nginx注意:yum 安装的版本可能较旧,配置文件默认在 /etc/nginx/。2. 编译安装(定制化需求)步骤:安装依赖:sudo yum install gcc pcre-devel zlib-devel openssl-devel -y # CentOS sudo apt install build-essential libpcre3-dev zlib1g-dev libssl-dev -y # Ubuntu下载源码:wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0配置编译选项:./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module常用模块:--with-http_v2_module(HTTP/2)、--with-stream(TCP/UDP代理)。编译并安装:make && sudo make install启动 Nginx:/usr/local/nginx/sbin/nginx二、常用命令服务管理# 启动 sudo systemctl start nginx # yum 安装 /usr/local/nginx/sbin/nginx # 编译安装 # 停止 sudo systemctl stop nginx /usr/local/nginx/sbin/nginx -s stop # 重启(加载新配置) sudo systemctl restart nginx /usr/local/nginx/sbin/nginx -s reload # 热重载(不中断服务) # 检查配置语法 sudo nginx -t查看状态sudo systemctl status nginx # 服务状态 ps aux | grep nginx # 进程检查 curl -I http://localhost # 测试响应头日志与调试# 访问日志 tail -f /var/log/nginx/access.log # yum 安装 tail -f /usr/local/nginx/logs/access.log # 编译安装 # 错误日志 tail -f /var/log/nginx/error.log三、配置文件路径yum 安装: /etc/nginx/nginx.conf(主配置) /etc/nginx/conf.d/(自定义配置目录)编译安装: /usr/local/nginx/conf/nginx.conf四、常见操作1. 添加虚拟主机# 在 /etc/nginx/conf.d/ 创建配置 sudo vi /etc/nginx/conf.d/mysite.conf # 示例配置: server { listen 80; server_name example.com; root /var/www/html; index index.html; }2. 开启 HTTPSserver { listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; ... }3. 防火墙放行端口sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reload五、卸载yum 安装:sudo systemctl stop nginx sudo yum remove nginx rm -rf /etc/nginx /var/log/nginx编译安装: 直接删除安装目录(如 /usr/local/nginx)并清理启动脚本。提示:生产环境建议使用 yum/apt 安装,便于版本管理和安全更新。编译安装适合需要定制模块或特定版本的情况。
2025年11月22日
2 阅读
0 评论
0 点赞
2025-11-15
Nginx简介
Nginx 是什么?Nginx (发音为 "engine X") 是一个高性能、开源的 Web 服务器、反向代理服务器、负载均衡器、HTTP 缓存器 和 邮件代理服务器。它最初由俄罗斯工程师 Igor Sysoev 开发,旨在解决著名的 C10K 问题(即如何在单台服务器上同时处理成千上万的并发连接)。由于其出色的性能、稳定性、丰富的功能集、简单的配置和低资源消耗,Nginx 迅速流行起来,成为全球最受欢迎的 Web 服务器之一。Nginx 的核心设计目标高性能: 核心目标,处理高并发连接时资源消耗低、响应速度快。高并发: 能够处理大量的并发连接(通常是 Apache 的几倍甚至几十倍)。低内存占用: 设计上避免不必要的内存分配和复制。高稳定性: 即使在高负载下也能稳定运行。模块化设计: 功能通过模块扩展,可以按需加载。热部署: 支持在不停止服务的情况下升级程序、更改配置、添加/移除模块。Nginx 的基本工作原理Nginx 之所以能达到高性能和高并发,主要得益于其独特的 事件驱动、异步非阻塞 的架构模型。这与传统的 Apache 等基于 进程/线程 的同步阻塞模型有很大区别。Master-Worker 多进程模型:Master Process (主进程): 这是 Nginx 启动时首先运行的进程。它不以 root 身份运行(除非需要监听 80 端口)。主要职责包括:读取、验证、应用配置文件。管理工作进程(Worker Processes)。平滑升级:启动新版本 Worker,逐步淘汰旧 Worker。日志管理(可选)。打开监听套接字(但通常不处理请求)。Worker Processes (工作进程): 由 Master 进程派生。通常以普通用户身份运行(安全考虑)。它们是实际处理客户端请求的进程。关键特点是:数量可配置(通常设置为 CPU 核心数或稍多),避免过多的上下文切换。每个 Worker 进程都是 独立 的,互不影响。一个 Worker 崩溃不会影响其他 Worker 或 Master。采用 事件驱动 和 异步非阻塞 I/O 模型处理请求。事件驱动与异步非阻塞 I/O:事件驱动: Worker 进程的核心是一个高效的 事件循环(基于 epoll (Linux)、kqueue (BSD) 等系统调用)。它持续监听各种事件源(如网络套接字上的读写事件、定时器事件、信号事件等)。异步非阻塞:非阻塞: 当 Worker 需要执行一个可能耗时的操作(比如从磁盘读取文件、向后端服务器发送请求并等待响应、访问数据库等)时,它不会傻等(阻塞)在那里。它会立即将这个操作交给操作系统或第三方库,并注册一个回调函数,然后继续处理事件循环中的其他事件。异步: 当那个耗时的操作在后台完成时,操作系统或库会生成一个完成事件(如数据准备好可读了)。Worker 的事件循环会捕获到这个事件,并调用之前注册的回调函数来处理结果(如将读取到的文件内容发送给客户端)。优势: 这种模型允许单个 Worker 进程在等待多个慢速 I/O 操作(磁盘、网络)完成的同时,高效地处理大量的其他请求或事件。它避免了为每个连接都创建一个新线程或进程的巨大开销(内存、CPU 上下文切换)。资源消耗(CPU、内存)主要与活动连接数相关,而不是总连接数。请求处理流程:客户端发起请求(如 HTTP 请求)。Master 进程打开监听端口(如 80, 443)。某个 Worker 进程通过事件循环监听到新的连接请求 (accept 事件)。Worker 接受连接。Worker 开始读取请求数据(非阻塞读)。如果数据没读完,注册读事件等待后续数据。请求解析:Worker 解析请求行、请求头等。请求匹配:根据配置文件 (nginx.conf) 中的 server 块、location 块等规则,确定如何处理该请求(是静态文件?需要代理到后端?需要重定向?)。处理请求:静态内容: Worker 读取文件(非阻塞 I/O)。文件读取完成后,事件循环触发回调,Worker 将文件内容写入响应(非阻塞写)。反向代理: Worker 向后端服务器(如 Tomcat, Node.js, 另一个 Nginx)发起连接(非阻塞连接),发送请求(非阻塞写),然后等待响应(注册读事件)。后端响应到达后,事件循环触发回调,Worker 将响应转发给客户端(非阻塞写)。FastCGI (PHP): 类似反向代理,但使用 FastCGI 协议与 PHP-FPM 等进程通信。发送响应:将处理结果(HTML, JSON, 错误页面等)发送给客户端(非阻塞写)。请求处理完成(可能保持连接 keep-alive 等待下一个请求,或关闭连接)。负载均衡: 当 Nginx 作为反向代理时,它可以将请求分发到多个后端服务器上,实现负载均衡。常见的算法有:轮询(Round Robin)加权轮询(Weighted Round Robin)最少连接(Least Connections)IP 哈希(IP Hash)基于响应时间(需要插件)模块化架构:Nginx 的核心功能相对精简。大部分功能(如 HTTP、SSL、Gzip、Rewrite、负载均衡、缓存、认证等)都以 模块 的形式实现。模块分为 核心模块 (编译时内置) 和 第三方模块 (可动态加载,需编译时指定)。这种设计使得 Nginx 非常灵活,可以根据需要定制功能,同时保持核心的高效性。Nginx 的主要应用场景静态内容服务: 提供 HTML、CSS、JavaScript、图片、视频等静态文件,性能极高。反向代理:隐藏后端应用服务器的真实 IP 和端口。负载均衡,提高应用的可扩展性和可用性。提供 SSL/TLS 终端卸载(HTTPS 解密在 Nginx 完成,减轻后端服务器负担)。API 网关: 路由 API 请求、认证、限流、日志等。HTTP 缓存: 缓存后端响应,减轻后端压力,加快客户端响应速度。Web 加速: 结合 Gzip 压缩、SSL 优化、连接复用等技术。邮件代理: 处理 IMAP、POP3、SMTP 协议。TCP/UDP 负载均衡: (Stream 模块) 代理非 HTTP 流量,如数据库、游戏服务器等。总结Nginx 的核心优势在于其 Master-Worker 多进程架构 和 事件驱动异步非阻塞 I/O 模型。这使得它能够以极低的资源消耗处理海量的并发连接,特别适合高并发、低延迟的场景。其模块化设计提供了极大的灵活性,使其应用范围远超单纯的 Web 服务器。作为运维工程师,理解这些原理对于配置优化、性能调优和故障排查至关重要。
2025年11月15日
1 阅读
0 评论
0 点赞