IT技术博客大学习 共学习 共进步

Apache

共 110 篇文章

IT 2016-04-05 13:47:42 / 累计浏览 2,629

Nginx配置$request_uri与$uri变量的区别

这篇讲的是在Nginx配置中两个极易混淆的变量:$request_uri 与 $uri 的核心区别。文章从一个实际现象出发:浏览器请求同一个地址,这两个变量的值却可能不同。 关键差异在于它们代表的“时间点”。$request_uri 记录的是客户端发起请求时最原始的路径与查询字符串,比如 /my/act?a=1,是“未处理”的状态。而 $uri 则是Nginx处理请求后,最终定位到服务器上资源的路径,比如经过rewrite规则变成 /dir/file.php,它不包含查询参数。 文章特别指出,$request_uri 这个名字本身容易造成误解,因为按标准定义,URI并不包含查询字符串,但它却包含了。理解这个区别至关重要:当你需要记录或匹配客户端最初的原始请求时,应使用 $request_uri;而当你需要基于经过内部重写后的实际资源位置进行逻辑判断或记录日志时,则应使用 $uri。搞混两者可能导致rewrite规则失效或日志记录不准确。

IT 2016-03-23 17:51:36 / 累计浏览 2,011

从无法开启 OCSP Stapling 说起

这篇讲的是,作者从读者常问的“为什么在Nginx中配置了 ssl_stapling on 却没生效”这个问题出发,深入剖析了OCSP Stapling的原理与实操。文章先简要回顾了OCSP(在线证书状态协议)会拖慢TLS握手,而OCSP Stapling(让服务端主动提供状态)是优化这一过程的关键。 接着,作者没有停留在理论,而是手把手教读者一个轻量的排查方法:使用openssl命令行工具进行验证。通过一条具体命令和对输出结果的解读(比如看到“OCSP Response Status: successful”就说明已开启),读者可以快速自检,而无需等待SSL Labs的漫长检测。 文章进一步深入,展示了完整的OCSP Response内容,并解释了其由“验证数据”和“签名证书”两部分组成。最后,文章还指导读者如何在本地获取证书链并主动查询OCSP信息,从原理层面帮助开发者真正理解这一机制,而不仅仅是配置一行代码。

IT 2015-06-04 10:25:13 / 累计浏览 3,613

nginx 利用 rewrite 屏蔽IE浏览器

这篇讲的是前端开发中让人头疼的IE兼容性问题,作者从运维的角度切入,提供了一套通过Nginx rewrite规则直接屏蔽特定版本IE浏览器的配置方案。 具体来说,文章核心是利用Nginx的 `$http_user_agent` 变量,通过正则表达式匹配用户访问时携带的浏览器标识。例如,配置中示例的规则会拦截IE6到IE9版本的请求,并利用 `rewrite /ie.html break;` 指令,将这些请求重定向到一个静态的提示页面,从而避免前端因处理老版本IE而产生的额外工作。 文章不仅给出了可以直接使用的配置实例,还逐一解释了 `$http_user_agent`、`~*`、`MSIE` 以及 `break` 等关键参数的具体含义,让读者理解每一条配置背后的逻辑。为了方便验证效果,作者还推荐了IETester这款工具来模拟不同版本的IE环境。 此外,文章末尾整理了一份Nginx全局变量的速查列表,这不仅能帮助理解当前案例,也为读者在其他场景下灵活运用Nginx的重写模块提供了实用参考。整体来看,这是一个针对特定问题的轻量但有效的解决方案,兼顾了实操性与原理说明。

IT 2015-06-01 09:50:44 / 累计浏览 3,408

nginx访问控制Access Control的问题

这篇讲的是nginx中一个容易踩的坑:使用`allow`和`deny`配置IP访问控制时,规则可能出乎意料地“不生效”。 作者通过一个实际配置进行测试:在server块禁用了IP `211.81.175.6`,在`location /nginxacc`块禁用了IP `211.81.175.8`。预期结果是前者全站不可访问,后者仅目录受限。但实际测试发现,IP `211.81.175.6`竟然能访问`/nginxacc`,而IP `211.81.175.8`却可以访问根目录。 问题的根因在于nginx的访问控制规则继承机制。如果子级(如location块)定义了任何ACL规则,它就**不会**继承父级(如server块)的规则,而是完全使用自己定义的规则列表。这意味着,虽然IP `211.81.175.6`在server层被禁,但在`/nginxacc`这个location里没有重新声明禁止,因此该location的访问是被放行的。 文章引用了nginx源码作为依据。这个发现提醒我们,在设计多层级访问控制时,必须清楚理解规则的继承与覆盖逻辑,不能想当然地认为规则会自动累加。否则就可能出现安全策略漏洞,本该封锁的IP反而获得了访问权限。

IT 2015-04-08 13:51:01 / 累计浏览 2,185

nginx的SCRIPT_NAME, PATH_INFO多了index.php问题

这篇讲的是nginx配置中一个常见的坑:在设置反向代理后,PHP获取到的`SCRIPT_NAME`和`PATH_INFO`变量不正确,把整个URI路径都带上了。比如访问`/index.php/site/login`时,`SCRIPT_NAME`本应是`index.php`,却拿到了完整的路径字符串。 作者定位到问题出在正则表达式定义的`location`块配置不完整。核心解决思路是,需要将请求的URI明确拆解为“脚本文件名”和“附加路径信息”两部分。通过新增一个专门匹配`.php($|/)`的`location`块,并利用正则捕获组`"^(.+.php)(/.+)"`,就能精准地把`index.php`赋值给`$script`,把后面的`/site/login`赋值给`$path_info`。 最终,通过`fastcgi_param`指令将正确拆解后的值传递给PHP处理,使得`$_SERVER['SCRIPT_NAME']`和`$_SERVER['PATH_INFO']`能获得预期的值,保证了框架路由能正常工作。这个配置方法清晰地展示了如何在nginx层面解决路径解析歧义。

IT 2015-02-06 22:05:02 / 累计浏览 3,536

nginx location在配置中的优先级

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

IT 2013-09-15 22:29:26 / 累计浏览 4,129

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 2013-05-01 22:31:58 / 累计浏览 4,495

Nginx 响应 400 的处理

作者从实际生产环境出发,剖析了Nginx返回400 Bad Request的几种隐蔽原因。除了常见的请求头过大,端口探测工具或LVS等负载均衡设备的健康检查也会导致大量400错误,日志里全是空行非常干扰排查。 文章深入分析了这类日志的特征:请求里连HTTP方法(如GET)或协议版本(HTTP/1.1)都没有,导致它们根本匹配不到任何常规的location规则。作者尝试用`if`指令过滤协议版本,但发现这无法阻止日志产生。 最终,他给出了一个简洁有效的方案:通过配置一个监听默认端口、主机名为空的`server`块,并直接关闭其访问日志(`access_log off`),将这些“无效”请求全部吸收并静默处理。这个方法从源头上解决了日志污染问题,干净利落。

IT 2013-03-03 22:50:10 / 累计浏览 6,672

HTTP KeepAlive,开启还是关闭

这篇文章讨论了HTTP KeepAlive在现代网络环境下的实际价值。作者从传统的认知出发——即开启Keep-Alive可以通过复用TCP连接来减少开销,提升用户体验——但随即结合高带宽低延迟的现实条件和现代浏览器的并行加载策略,对这一观点提出了质疑。 文中通过展示一台Nginx服务器的Status数据,给出了一个非常具象的反例:该服务器开启KeepAlive后,平均每个连接只处理了约1.01个请求,几乎没有实现有效的连接复用。由此引出一个关键洞察:KeepAlive的益处并非普适。对于客户端偶尔访问一次的WebService类应用,维持长连接反而会浪费服务器资源,此时关闭它才是更优的选择。 作者最终引导读者跳出教条,结合自身服务的实际访问模式(如连接复用率、并发需求等)来重新评估这个配置项,而非盲目地沿用“最佳实践”。

IT 2012-10-22 21:59:32 / 累计浏览 6,269

mod_pagespeed:让你的网站跑到更快

这篇讲的是谷歌开源项目 mod_pagespeed 如何为 Apache 服务器网站“一键加速”。 文章核心介绍了这个模块的原理:它作为 Apache 的组件,能在服务器处理请求时即时执行超过15种优化,比如智能压缩资源、优化缓存策略,从而减少数据传输量和客户端等待。实验显示,它最高能将页面加载时间砍掉一半。 此外,文章还分享了它的实际应用情况。像主机巨头 Go Daddy 就将其部署在了超过850万客户主机上,内容分发网络服务商 Cotendo 也将其集成到了核心引擎中,用以提升 CDN 服务质量。 作为谷歌官方开源项目,mod_pagespeed 提供了多平台编译版本和活跃的社区支持。如果你运营基于 Apache 的网站并正为加载速度发愁,这或许是个值得尝试的“引擎内”优化方案。

IT 2012-10-14 22:06:44 / 累计浏览 6,735

近期Imgsrc一处内存泄露问题的查找和解决

这篇讲的是作者在维护 imgsrc 服务时,如何定位并解决一处顽固的内存泄露问题。 问题最初表现为服务的内存占用在持续缓慢增长,但业务逻辑本身似乎并无大碍。经过一番深入排查,作者将矛头指向了底层广泛使用的 ImageMagick 图像处理库,最终确认泄露根源正是该库自身的一个 bug。由于影响范围可能较广,作者认为有必要将这次“踩坑”经历记录下来。 文章详细叙述了从现象观察、怀疑对象筛选到最终锁定库级别 bug 的完整排查思路。对于同样需要处理大量图像、并可能依赖 ImageMagick 的技术团队而言,这篇分享提供了一个清晰的故障排查范例:当上层代码看似无误时,问题有时就藏在底层依赖之中。作者通过解决一个具体的技术痛点,为同行们排除了潜在的隐患。

IT 2012-07-30 23:51:30 / 累计浏览 16,499

解析nginx负载均衡

对于构建大型网站来说,负载均衡是一个无法绕开的核心话题。虽然F5 BIG-IP、Citrix NetScaler这类专用硬件设备性能强大,但其高昂的成本让许多团队望而却步,因此灵活高效的负载均衡软件成了更务实的选择。 这篇讲的是nginx如何在这个领域脱颖而出。作者从工业生产的实际背景出发,指出nginx作为后起之秀,凭借其出色的反向代理功能与多样化的负载均衡策略,受到了广泛关注。文章没有停留在功能罗列,而是深入到设计与应用两个层面:既解析了nginx实现负载均衡的核心思路,也结合具体场景,展示了不同策略(如轮询、加权、IP哈希等)在实际部署中的考量与效果。 对于正在选型或希望优化现有架构的技术人员来说,这篇内容提供了一个从原理到实践的完整视角,帮助理解如何用软件方案有效分担后端压力,提升系统整体的可靠性与可扩展性。

IT 2012-06-07 23:09:00 / 累计浏览 9,882

奇怪的 Nginx 的 upstream timed out 引起响应 502

这篇讲的是一个典型的线上环境 Nginx 502 错误排查案例。作者在运维 MogileFS 图片集群时,发现了大量 502 错误,Nginx 错误日志直指后端 upstream 连接超时。起初,排查方向聚焦在调整 Nginx 与后端服务的各种代理参数上,但问题依旧,一度让人无从下手。 转机出现在查看系统日志时,发现了大量“nf_conntrack: table full, dropping packet”的告警。这揭示了问题的根源并非应用层处理能力不足,而是 Linux 内核的网络连接跟踪表(conntrack)已满,导致新的网络连接无法建立,从而引发超时和 502。 最终,通过调整系统内核参数,包括提升 conntrack 表的最大条目数(nf_conntrack_max)和调整 TCP 连接超时时间(nf_conntrack_tcp_timeout_established),问题得以解决。这个案例提醒我们,在排查 Web 服务超时问题时,除了应用和中间件配置,也需要关注操作系统层面的资源限制。

IT 2012-05-28 12:28:29 / 累计浏览 7,535

使用.htaccess 开启gzip 缓存文件 网页 提高速度

这篇讲的是如何通过配置.htaccess文件,同时开启Gzip压缩和浏览器缓存,为网站进行基础的速度优化。作者从两个最有效且容易实施的手段入手:首先,启用Gzip压缩,通过在.htaccess中添加几行规则,就能让服务器在传输文本类文件(如HTML、CSS、JS)前进行实时压缩,显著减小传输体积,尤其对网络条件不佳的用户效果明显。 其次,文章说明了如何设置缓存策略,利用.htaccess的`Expires`和`Cache-Control`指令,为静态资源(如图片、脚本)设置合理的浏览器缓存时间,避免用户每次访问都重新下载相同文件,进一步减少请求次数和加载时间。 整个方案无需修改网站代码,完全在服务器配置层面完成,是提升中小网站加载速度的经典“第一课”。文章清晰展示了从问题到解决方案的完整路径,适合所有希望快速优化前端性能的开发者参考实践。

IT 2012-05-10 23:55:58 / 累计浏览 8,656

nginx自定义模块编写-实时统计模块

这篇讲的是作者在已有编写Nginx模块的经验基础上,挑战实现一个更贴近底层的“实时统计”过滤模块。他并非从零开始,而是先点明了自己之前处理过基于POST参数路由的“处理模块”,从而自然引出本次编写“过滤模块”的不同挑战与思考。 文章的核心在于具体实现。作者没有停留在概念上,而是直接切入过滤模块如何在Nginx请求处理流程中(在内容发送给客户端前)插入统计逻辑。他分享了如何从模块的注册、初始化,到编写核心的过滤函数来遍历并记录响应数据的关键步骤。这种“边做边讲”的方式,让读者能清晰看到从需求(实时统计)到代码落地的完整路径,其中对Nginx内部数据结构和回调机制的运用是文章的精华所在。 对于想深入理解Nginx扩展机制或需要进行流量分析、监控的开发者来说,这篇实践记录提供了清晰的思路和可复用的代码框架。它展示了如何将一个具体的业务需求,转化为一个高效的Nginx内置功能。

IT 2012-05-04 00:23:12 / 累计浏览 8,234

使用Apache 和Passenger来运行puppetmaster

这篇讲的是如何用Apache和Passenger来部署Puppet Master,以解决其默认运行方式存在的性能和管理问题。文章指出,Puppet Master默认使用WEBrick服务器运行,虽然能工作,但在实际生产环境中,面对大量节点并发请求时,性能和稳定性会成为瓶颈。 作者给出的方案是,将Puppet Master部署在Apache Web服务器下,并通过Phusion Passenger模块来管理应用进程。这种架构将Apache作为前端,负责处理连接、SSL终端和静态文件,而Passenger则负责高效地管理Puppet Master的Ruby应用进程,实现了进程的预加载、动态伸缩和崩溃自动重启。 文章详细说明了配置步骤和关键参数,比如Passenger的并发进程数设置、Apache的虚拟主机配置,以及如何处理Puppet证书相关的SSL配置。采用这种方案后,Puppet Master的并发处理能力得到显著提升,服务更加稳定,同时也让日志管理和运维监控变得更加便捷。这为需要大规模部署Puppet的团队提供了一套成熟可靠的生产级部署方案。

IT 2012-04-19 23:39:48 / 累计浏览 9,998

查看 Apache并发请求数及其TCP连接状态

这篇讲的是如何实时掌握Apache服务器的并发性能与网络状态。文章从实战出发,汇总了多个关键Linux命令来监控服务器。 你可以用`netstat`配合`grep`和`wc -l`快速统计80端口总连接数,或用`ps`命令查看当前的httpd进程数。特别实用的是那条`awk`脚本`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'`,它能一目了然地列出所有TCP连接状态的数量,比如ESTABLISHED(正常连接)、SYN_RECV(等待确认)和TIME_WAIT(等待关闭)。 文章没有止步于监控,还深入讲解了状态背后的含义。例如,它解释了TIME_WAIT状态是TCP协议为保证可靠关闭而设计的,通常无害,并提供了调整内核参数(如`tcp_tw_reuse`)来优化大量连接场景的方法。 最后,文章探讨了另一个核心问题:如何设置Apache的最大连接数。它以Prefork模式为例,通过计算服务器可用内存与单进程内存占用的关系,给出了具体的`MaxClients`配置建议和计算公式,强调调整需结合硬件资源与实际负载,而非盲目增大。

IT 2012-03-12 23:54:03 / 累计浏览 7,273

nginx自定义模块编写-根据post参数路由到不同服务器

当面对需要根据POST参数动态路由请求的场景时,Nginx的标准配置(如基于URI或GET参数)会显得力不从心。这篇文章正是从这个实际运维痛点出发,深入讲解如何编写一个Nginx自定义模块来突破这一限制。 作者详细拆解了整个实现过程:首先,分析了Nginx处理请求的基本流程和模块接口,明确了切入点;其次,核心思路在于编写一个自定义的handler,在请求体读取阶段介入,解析指定的POST参数值;最后,根据解析结果,将请求分发到预先定义好的不同上游服务器组。文章不仅给出了关键代码片段,还探讨了内存管理、性能考量等细节,比如如何避免影响Nginx整体的非阻塞模型。 这套方案为需要复杂路由策略的场景(如A/B测试、灰度发布)提供了一种灵活且高性能的解决思路,让运维人员能够超越默认配置,实现更精细化的流量控制。

IT 2012-03-11 22:08:54 / 累计浏览 7,250

说说lighttpd的fastcgi

这篇讲的是lighttpd这款Web服务器中FastCGI模块的独特实现与适用场景。 作者将lighttpd与Apache、Nginx等常见服务器并列,聚焦于它们在FastCGI进程管理上的不同哲学。核心对比点在于lighttpd采用了“单进程异步模型”来驱动FastCGI进程。具体来说,lighttpd本身并不像Nginx那样预先生成多个worker进程,而是通过其核心事件循环,用一个轻量级的管理进程去管理和通信多个独立的FastCGI后端进程。这种架构让lighttpd本身资源占用极低,但在处理高并发动态请求时,其异步特性可以带来显著的性能优势,尤其适合API网关或微服务前端这类场景。 不过,文章也坦诚地指出了另一面:这种设计意味着FastCGI进程的生命周期和健康检查需要更精细的手动配置与监控,配置和排错的门槛相对更高。相比之下,Nginx等服务器的进程池模型虽然在某些极端情况下可能消耗更多资源,但其“开箱即用”的稳定性和简便性对大多数常规Web应用更友好。因此,选择lighttpd的FastCGI,本质上是在用配置与运维的复杂性,去换取特定架构下的极致轻量与性能潜力。

IT 2012-02-07 23:20:25 / 累计浏览 6,750

流量低峰也烦人-lighttpd耗时长问题追查

这篇文章讲的是lighttpd在流量低峰期出现响应耗时异常长的排查过程。作者从线上监控发现CPU使用率飙升出发,通过top命令定位到lighttpd进程,再用strace深入追踪系统调用,发现大量时间消耗在内核模块操作上。进一步排查内核日志,找到了“task blocked for more than 120 seconds”的关键错误信息。 追查最终指向一个内核级的资源竞争问题,具体涉及进程调度与I/O处理的冲突。文章详细记录了从现象到根因的完整分析链条,包括如何利用常规Linux工具层层剥离问题,以及最终通过调整相关内核参数和lighttpd配置缓解了问题。整个过程体现了在看似“低负载”的表象下,系统瓶颈可能潜藏于意想不到的层面,对于处理类似隐蔽性能问题有直接的参考价值。