IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Nginx

共 126 篇相关文章

IT 累计浏览 3,540

nginx location在配置中的优先级

这篇讲的是Nginx中`location`指令的优先级规则,一个看似简单实则容易踩坑的配置细节。作者从常见的配置困惑出发,系统对比了四种`location`表达式类型:精确匹配(`=`)、前缀停止匹配(`^~`)、正则匹配(`~`和`~*`)以及普通前缀匹配,并清晰地给出了它们的优先级排序。 文章的核心价值在于明确了“配置顺序影响不大,表达式类型才是关键”这一原则,并用具体的请求路径示例,比如请求`/images/1.gif`为什么命中`^~`而非正则,来直观展示匹配逻辑。理解这套优先级体系,能帮你精准控制请求路由,避免因配置不当导致的意外行为或安全漏洞。 对于需要精细管理反向代理、静态资源或错误页面的Nginx用户来说,搞清楚这套规则能避免很多排查时的“想当然”。

IT 累计浏览 3,260

解决nginx session共享的问题

这篇讲的是在Nginx集群环境下如何解决Session共享这个经典难题。作者从几个不同的维度给出了应对思路。 最直接的办法是“不用”,也就是把状态信息从Session迁移到Cookie,从而绕开分布式带来的挑战,适用于系统改动成本较低的情况。如果必须用Session,应用层面可以借助数据库或Memcached来实现高可用的Session存储,不过这对性能有一定损耗。 文章的重点落在了Nginx自身的两种策略上。一是利用内置的`ip_hash`模块,通过客户端IP将请求始终定向到同一台后端服务器,实现起来简单,但要求Nginx必须处于最前端,且后端不能有其他负载均衡,否则哈希依据会失准。 为了弥补`ip_hash`的不足,作者介绍了更灵活的`upstream_hash`第三方模块。它可以通过自定义的因子(如`X-Forwarded-For`头,甚至Cookie值`jsessionid`)来做哈希,适应了复杂网络拓扑下对会话保持的精细控制需求。 整篇文章梳理了从应用层到网关层的几种主流方案,清晰对比了它们的实现原理、优缺点和适用场景,为在不同约束条件下选择最合适的Session共享策略提供了实用参考。

IT 累计浏览 3,602

给Nginx配置一个自签名的SSL证书

这篇讲的是如何为Nginx配置一个自签名SSL证书,来快速启用HTTPS安全连接。 在Web开发中,HTTPS几乎是保障浏览器与服务器通信安全的必选方案,但向证书颁发机构申请正式证书往往需要每年几十到几百美元的费用。如果只是为了内部管理或测试目的,自签名证书就能提供一个零成本的解决思路。 文章从SSL证书验证的两种模式切入,解释了为什么普通网站通常只验证服务器证书,并点明自签名证书的适用场景。核心方案部分,作者详细演示了利用openssl创建证书的四步流程:生成密钥、创建签名请求、移除口令并最终签名。为了简化操作,文章还提供了一个shell脚本,以域名www.test.com为例,展示了从运行脚本到输入口令的完整交互过程,以及生成的四个关键文件。 配置环节,文章明确指出Nginx需要加载证书和密钥文件的具体路径,并附上了示例配置。最后还提到一个实用技巧:让Nginx统一处理HTTPS,后端应用服务器只用HTTP连接,这样既发挥了Nginx在处理SSL方面的优势,也避免了其他服务器配置证书的复杂性。整个过程下来,即使是自签名证书,也能让管理员通过浏览器安全地连接到服务器进行维护。

IT 累计浏览 3,341

nginx中location的匹配和rewrite

这篇文章来自一位工程师的实战经历,他在调整线上 Nginx 规则时,遇到了一个关于 `location` 匹配的“诡异”问题:明明配置了精确的路径规则,流量却匹配不上。 问题的根因在于 Nginx 对待 URL 的两个阶段存在处理差异。用户直接请求的 URL 会先进行“归一化”处理(例如合并多余的斜杠),但在配置文件中使用 `rewrite` 指令跳转后生成的新 URL,却不会再经历这一过程。这种不一致,极易导致配置失误。 文章用一个具体例子清晰演示了这一点:当 `rewrite` 规则不小心多写了一个斜杠,形如 `/newapi//api`,直接访问 `/api`(归一化后)就无法命中 `/newapi/api` 这个 `location`;而直接请求未归一化的 `/newapi//api` 反而可以匹配上。 作者通过这个踩坑经历,揭示了 Nginx 转发机制中一个容易被忽略的细节。对于需要编写复杂规则的运维和后端同学来说,理解这个机制差异,能帮助避免一些难以排查的线上配置故障。

IT 累计浏览 1,160

nginx反向代理做克隆采集小偷垃圾站,还能翻墙

这篇讲的是如何利用Nginx反向代理快速搭建一个网站内容镜像或代理站。作者从一个具体的配置文件入手,展示了核心步骤:通过`proxy_pass`将本地域名请求指向目标站点IP,并配合`proxy_set_header`伪装访问头,使对方服务器记录的是代理IP。文章特别强调了两个实用技巧:一是通过`subs_filter`规则(需安装第三方`nginx_substitutions_filter`模块)在返回页面前动态替换文本内容,可用于清理广告或修改版权信息;二是通过设置`Accept-Encoding`为空来禁用压缩,确保替换模块能正常工作。 作者还手把手演示了如何在已有NginX基础上,通过重新编译添加该模块的完整流程,从下载源码、查看原编译参数、执行`make`到平滑替换二进制文件,步骤清晰。整个方案相当于用NginX作为“中间人”,低成本实现了内容抓取、过滤与转发,对于需要快速搭建本地化内容镜像或进行页面预处理的开发者来说,是一套直接可用的技术脚本。

IT 累计浏览 11,181

server日志的路径分析

这篇讲的是如何通过分析Web服务器日志中的路径信息,理解用户访问行为。作者从日常遇到的疑问出发——有人误以为服务器日志来自数据库,借此清晰界定了服务器日志的本质:它是客户端与服务器间所有通信(包括IP、时间、访问路径、状态等)的忠实记录。 文章以Nginx日志为例,逐条拆解了其看似杂乱的格式,对应到日志字段如请求URL、状态码等。核心在于,作者分享了利用Shell命令(awk和sed)从海量日志中提取、清洗并统计访问路径的实战过程。具体来说,通过awk按分隔符切割出URL字段,再结合sort和uniq进行排序计数,最终形成每个路径的访问次数统计。整个分析链条从原始日志文件到生成结构化的路径统计表,步骤清晰。 为了让结果更直观,作者还将统计输出为表格和图表形式,并强调了数据可视化在提升分析体验和洞察效果上的关键作用。整个分享聚焦于“如何做”,是一次从原始数据到可视化结论的完整实践演示。

IT 累计浏览 3,380

Nginx缓存解决方案:SRCache

作者在优化PHP程序时,首先启用了Nginx内置的FastCGI Cache,但发现它不支持分布式缓存,在多服务器场景下存在资源浪费和数据一致性难题。这让他开始寻找更精细的解决方案。 这篇文章的核心就是介绍SRCache这个模块。它作为FastCGI Cache的补充,能实现更细粒度的缓存控制。作者展示了SRCache如何与Memc模块配合处理简单场景,而在需要动态计算缓存键等复杂需求时,则通过Lua脚本进行灵活扩展。 文章详细解读了这套方案的配置实践。通过自定义的Lua脚本,作者实现了对请求的智能判断:只有匹配特定规则的请求才会开启缓存,缓存键由请求方法、主机名和URI等信息动态生成。这种设计既避免了缓存的无效占用,也保证了缓存的精准命中。 整体来看,SRCache提供了一套从粗放式到精细化缓存管理的平滑升级路径。它通过开放的Lua集成,将缓存决策权交给了开发者,能有效应对复杂多变的生产环境需求。

IT 累计浏览 3,400

Linux 安装 Nginx PHP fpm

这篇教程针对初学者在Linux下搭建Nginx+PHP环境时常遇到的依赖复杂、步骤陈旧的困扰,提供了一条从零开始、清晰简洁的实操路径。作者从建议使用Ubuntu Server系统出发,完整演示了从源码编译安装Nginx和PHP的全过程,核心步骤都配有明确的命令行代码。 文章不仅讲解了如何让Nginx和PHP-CGI协同工作的基础配置,更关键的是,它指出了临时运行与生产环境的区别,并详细说明了如何通过PHP-FPM配置守护进程,实现更稳定可靠的部署。此外,教程还涉及了单独编译安装PHP扩展模块(如sockets)这一实用技巧,使读者无需重新编译整个PHP即可按需添加功能。 整体而言,这是一篇注重实战、步骤连贯的现代指南。它强调方法的简洁性与可用性,并承诺会保持内容更新,对于希望快速搭建起标准Web开发环境的新手来说,提供了扎实且可跟随的步骤。

IT 累计浏览 4,440

使用nginx限制蜘蛛的频繁抓取

这篇讲的是作者如何应对百度蜘蛛异常抓取的问题。上周,百度蜘蛛对“玩客”网站的抓取频率突然飙升至原来的5倍,导致服务器负载急剧升高,影响了正常服务。问题的根源在于单一爬虫的请求量超出了服务器的承载能力。 为了解决这个问题,作者利用了nginx内置的ngx_http_limit_req_module模块,对百度蜘蛛的抓取频率实施了精准限制。核心配置是将百度蜘蛛的请求速率限制在每分钟200次,并设置了最大并发为5的队列缓冲。当短时间内请求量超过此限制时,系统会直接返回503状态码,快速拒绝多余的请求,从而有效保护了后端服务。 文章不仅给出了即用的配置代码,还解释了每个参数的作用,例如burst和nodelay参数如何协同工作。同时,作者点出了该模块背后的“漏桶算法”原理,并提供了源码阅读指引。对于遇到类似爬虫管理问题的运维或开发人员来说,这是一个非常实用且有细节参考的解决方案。

IT 累计浏览 2,501

用 LEK 组合处理 Nginx 访问日志

这篇讲的是作者在使用 Logstash 处理 Tengine/Nginx 通过 syslog 发送的访问日志时,遇到的几个实际性能瓶颈及优化方案。文章首先指出,在高压力下 Logstash 的 Grok 插件容易成为瓶颈,因此作者建议在日志格式可控时,优先考虑用分隔符格式配合 Ruby 脚本或自定义 LogFormat 来替代 Grok 解析。 然而真正的坑在后面:运行后发现日志接收带宽异常低,排查发现是 Logstash 的 syslog input 插件采用了单线程 UDP 监听,导致接收队列(Recv-Q)持续堆积。作者对比了 Fluentd 的异步实现,并考虑到 Logstash 基于 JRuby 的扩展复杂性,最终选择了一个更直接的方案:用 Perl 的高性能 AnyEvent 库重写了一个专门的异步日志收集脚本。这个脚本同样将日志输出为 Elasticsearch 兼容格式,使得原有的 Kibana 仪表盘无需任何改动。最终效果立竿见影,日志接收带宽从瓶颈时的 60 MBps 恢复到了正常的 300 MBps。

IT 累计浏览 2,260

记我配置Nginx代理的遭遇

这篇讲的是作者自认熟悉Nginx,却在配置一个简单的代理转发时连踩五个大坑的曲折经历。 核心任务是将形如 `/search/lamp` 的请求,代理到新服务并转换为 `/search?q=lamp` 的参数格式。作者从最直接的正则捕获与变量拼接方案开始尝试,但首次运行就遇到了“未定义resolver”的经典报错。根因在于代理地址中使用了变量时,必须显式配置DNS解析器。 作者不喜欢硬编码resolver,于是尝试移除变量,却立即触发第二个限制:在正则表达式定义的location块内,`proxy_pass` 指令不允许包含URI。被迫改用 `rewrite` 重写请求URI后,又遭遇变量作用域问题,正则捕获的变量无法直接在 `rewrite` 中使用。 借助社区提醒,通过 `set` 指令中转变量解决了传递问题,但这并非终点——新的问题是正则匹配会自动解码URL,导致传参错误。最终,作者通过使用 `$request_uri` 变量获取原始未解码的URI,并配合 `if` 指令进行条件判断,才在第五次尝试中成功搞定。这篇文章生动演示了Nginx配置中变量、位置块与指令之间复杂的相互作用,对避开这些“老坑”有直接的参考价值。

IT 累计浏览 1,660

配置 Nginx 子域名的泛解析

这篇文章讲的是如何配置 Nginx 实现子域名的泛解析,让所有形如 `sub.domain.com` 的子域名请求都能被正确处理。作者从实际需求出发:希望在不破坏主域名(`domain.com` 和 `www.domain.com`)访问的前提下,让不同的子域名自动映射到服务器上对应的目录(例如 `sub` 映射到 `www-sub` 目录)。 核心方案十分巧妙:在 Nginx 配置的 `server_name` 指令中直接使用通配符 `*.domain.com` 来承接所有子域名请求。然后,通过一个正则表达式动态提取主机名中的子域名部分,并将其存入变量 `$subdomain`。最终,在 `root` 路径的定义中拼接这个变量,例如 `root /home/user/www$subdomain/;`。这样一来,访问 `blog.domain.com` 时,网站根目录就会自动指向 `/home/user/www-blog/`。 这个方案的亮点在于“动态路径映射”,避免了为每一个子域名单独编写 `server` 块的繁琐配置。作者也特意说明了正则中排除 `www` 的逻辑,确保主域名配置不受干扰。整体思路简洁高效,对于需要管理大量子域名的开发者来说,是一个非常实用的配置模板。

IT 累计浏览 2,981

在tomcat应用中获得原始IP

这篇讲的是如何在使用 Apache/Nginx 作为反向代理的 Tomcat 应用中,重新获取被代理层“吃掉”的客户端原始信息。作者从实际场景出发,指出 Apache 代理后,Tomcat 得不到客户端的真实 IP、主机名和是 HTTP 还是 HTTPS 协议,这会给生成绝对重定向 URL 和页面资源链接带来麻烦。 文章的核心方案分两步:先在 Apache 端配置,通过 `ProxyPreserveHost` 转发原始 Host 头,并添加 `X-Forwarded-Proto` 等自定义头部来传递协议等信息。然后,在 Tomcat 端配置 `RemoteIpValve`,让它能智能地“读懂”并应用这些从代理转发过来的头部,从而在 `HttpServletRequest` 中还原出真实的客户端信息。 文章还贴心地附上了测试用的 Servlet 代码和对比结果。测试表明,配置完成后,无论前端是 HTTP 还是 HTTPS 访问,Tomcat 都能正确获取到原始 IP 和协议类型。这套组合配置为解决代理环境下的应用逻辑判断提供了清晰有效的路径。

IT 累计浏览 16,885

记录一个软中断问题

这篇讲的是如何定位并解决Linux系统软中断负载不均的“坑”。作者从一台XEN虚拟机的Nginx服务器入手,通过top命令观察到软中断(si)数值异常,且几乎全部集中在CPU1上,导致该CPU成为性能瓶颈。 进一步用`/proc/softirqs`确认,网络收包中断(NET_RX)是主要来源。排查发现,问题根源在于宿主机的网卡运行在单队列模式,且中断被绑定到了特定CPU上。虽然尝试修改中断亲缘性(`smp_affinity`),但对单队列网卡无效。 最终,作者启用了Linux内核的RPS(Receive Packet Steering)功能,通过软件层面将网络包处理负载分摊到多个CPU核心。配置后,软中断成功从单一CPU分散到了两个CPU上,显著改善了负载不均的问题。 文章还附带介绍了`itop`这个中断监控小工具,并提及了Nginx的`worker_cpu_affinity`配置、NUMA架构调优等后续优化思路,为遇到类似网络中断瓶颈的开发者提供了一套完整的排查与优化路径。

IT 累计浏览 2,481

CentOS 上的 LNMP 一键安装工具 Centmin Mod

这篇讲的是在CentOS系统上部署LNMP(Nginx, MySQL/MariaDB, PHP)环境时,可以使用的一键安装工具Centmin Mod。作者从观察到许多新手用户四处“求教程”出发,指出LNMP安装本身并不复杂,手动配置过程反而更有学习价值。但对已经熟悉Linux的用户而言,一个集成化的工具确实能提供很大便利。 文章详细介绍了Centmin Mod这款工具。它由早期的Centmin脚本改良而来,一个显著特点是使用了MariaDB来替代传统的MySQL。文中也提到,这与Google、Red Hat等巨头的技术迁移方向是一致的。通过下载、解压并运行一个简单的Shell脚本,用户就能进入一个清晰的交互式菜单。 这个菜单不仅提供了核心的“一键安装”选项(过程大约10-30分钟),还集成了大量运维管理功能,比如为新域名添加Nginx虚拟主机配置、安装或升级PHP加速器(如XCache、APC)、调整SSH端口、关闭SELinux,甚至安装FFMPEG。这使得它不仅仅是一个安装器,更像一个针对CentOS优化的LNMP环境管理套件。对于希望快速搭建环境并拥有后期维护便利性的CentOS用户,它提供了一个省时省力的选择。

IT 累计浏览 2,882

Nginx与Gzip请求

这篇讲的是Nginx如何处理客户端发来的Gzip压缩请求。作者从移动端同事的需求出发——为了节省流量和提升传输速度,需要让服务端解压缩客户端发送的Gzip数据。但Nginx自带的Gzip模块都是处理响应(Response)的,对于请求(Request)的解压缩并无直接支持。 文章详细探索了两种可行的技术方案:一是使用lua-zlib库直接解压;二是通过LuaJIT的FFI接口封装系统的zlib库来实现。作者不仅给出了具体的代码示例,还贴心地解决了在Linux环境下可能遇到的动态库加载路径不匹配的问题。最后,文章在PHP后端架构下进行了测试,对比了两种方案的性能,发现lua-zlib的效率反而略高于理论上更优的FFI方案。 核心结论是,借助OpenResty和Lua的强大扩展能力,可以在Nginx的access阶段灵活处理特殊的压缩请求,为异构系统(如PHP后端)解压数据,是一个高效且实用的解决方案。

IT 累计浏览 4,120

Nginx HttpMemcModule和直接访问memcached效率对比测试

这篇实测对比了两种访问memcached的方式:通过Nginx的HttpMemcModule模块代理,以及由PHP直接连接。作者搭建了具体的测试环境,使用不同配置的服务器,从64到2048的并发线程发起压力测试。 测试揭示了几个关键差异。首先,在效率上,即使经过优化,通过Nginx HttpMemc代理的平均效率大约只有直接访问的72.6%左右,存在一定的性能损失。但更重要的是稳定性:直接连接memcached时,失败的请求数会显著增加,而借助HttpMemc模块(并配置了keepalive),连接失败的情况得到明显改善。 文章还补充了调整TCP内核参数(如开启tcp_tw_recycle和tcp_tw_reuse)后的测试结果。调整后,不仅失败请求完全归零,整体TCP效率也得到提升。最终结论是,尽管HttpMemc模块会带来一些性能损耗,但其在连接复用和对上层应用透明方面的优势,使得这个损耗在可接受范围内,尤其是在需要高连接稳定性的场景下,它依然是一个值得考虑的方案。

IT 累计浏览 2,140

闲扯Nginx的accept_mutex配置

这篇闲扯文章深入探讨了Nginx中一个常被忽略却影响吞吐量的配置——accept_mutex。文章从它的基本作用说起:启用时,新连接到达只会唤醒一个worker来处理,从而避免“惊群问题”;禁用时则所有worker都会被唤醒,虽可能导致性能损耗,但Nginx作者Igor Sysoev指出,由于Nginx的worker进程通常较少(几十个),惊群影响其实有限。 文中对比了启用与禁用accept_mutex的场景:启用更像“主动喂小鸡”,在资源稀缺时(如连接数少)高效且稳定;禁用则像“撒粮让鸡抢”,当访问量大时能提升整体吞吐量,尽管可能增加上下文切换(可通过sar -w观察)。作者引用Igor Sysoev的解释,强调这与Apache(动辄上百进程)不同,Nginx因进程少而更灵活。 基于这些分析,文章最终建议:对于高流量网站,关闭accept_mutex是值得考虑的优化选择,以平衡惊群风险与系统性能。整体从具体配置出发,用生动比喻和权威引用,提供了清晰的实践指导。

IT 累计浏览 7,580

Yupoo(又拍网)的系统架构

这篇讲的是国内最大图片服务商Yupoo又拍网的系统架构。文章没有空谈理论,而是直接列出其生产环境中使用到的具体技术栈,为读者提供了一个真实、可参考的大型互联网服务构建蓝图。 核心方案体现在对开源软件的组合运用上。操作系统层采用CentOS、Ubuntu等,服务器由Nginx、Apache、Squid共同处理请求;数据存储与缓存依赖MySQL、Memcached、Redis乃至Riak等多种方案;业务逻辑则由PHP、Python、Erlang等多语言实现。值得注意的是,其架构中还包含了Hadoop、Mogilefs用于分布式存储与计算,RabbitMQ处理消息队列,以及完善的监控(Nagios、Cacti)和任务管理(Redmine)体系。 这种“搭积木”式的架构,其效果在于通过成熟开源组件的高效组合,支撑起海量图片的上传、处理、存储与分发需求。对于技术团队而言,这份清单的价值在于它展示了一个经过实践验证的技术选型思路,而非单一工具的介绍。