不规范的 Nginx 开发

最近这一年多, 见识过很多基于 Nginx 开发的项目, 在这个过程中也遇到了几个很常见的不规范的做法。

离主分支过远

Nginx 是一个很有生命力的项目, 不断的在开发一些新的特性, 基于这种项目开发的项目,从一开始就要想到版本同步升级的问题。

Nginx 本身提供了强大的模块开发机制, 在做自己的业务开发时, 应该尽可能用模块去解决, 而不要乱动 Nginx 核心代码。其实, 如果不是业务场景特殊, 或者对性能有更苛刻的要求, 开发者都不应该去修改核心代码。 如果实在到了不动核心代码不行或者解决方案非常憋屈的时候, 也应该尽量先做好同步升级的方案, 比如经常不定期合入主干代码等。 连开发阵容强大的 Tengine, 都会跟进 Nginx 的更新, 你有什么理由不这样做呢。

跑步近况-准备广州马拉松

最近这几周,具体是九月的一整月和十月初,都没怎么跑步。客观原因主要有两个:

  • 我换工作了
  • 我结婚了

关于跑步的好消息也有一个,那就是报名十二月份的广州马拉松,中签了。广马麻烦的地方有两个:
1. 需要抽签
2. 报名有资格要求:必须有以往参加过马拉松比赛的经历

第一个条件很正常, 很多有名气的马拉松都是要抽签的,因为人满为患嘛。第二个条件却引起骂声一片,因为涉及到鸡生蛋还是蛋生鸡的问题,很多广州本地人,就想在自己的城市参加第一次马拉松,却没有资格。

我们来拍拍肩吧,《百元之恋》观后感

《百元之恋》讲述了迷茫、堕落的一子,在经历各种屈辱、挫折之后,选择学习拳击的故事。

豆瓣对该电影的类型归纳为“剧情、喜剧、运动”,说是剧情和运动片无可厚非,但喜剧二字却让人啼笑皆非。电影前大半段都是弥漫着压抑、颓废甚至绝望的气氛,最后小半段转向奋进、激昂。跟喜剧八竿子打不着。

女性、拳击、失败,这些关键词不由让人们想到伊斯特伍德的《百万美元宝贝》,珠玉在前,其实这部电影想拍的出彩,还是挺难的。但看完电影之后,不得不说,它做到了。

那么,它吸引人的地方在哪里呢?我认为主要在于两个字,真实。

因为真实,所以能让观众产生很强的共鸣。

当一子在半夜骑着辆在路边顺来的自行车去超市时,我想到了,曾经有段时间我在床上一躺躺一整天,晚上饿的要晕了,晃晃悠悠爬起来去学校超市买东西吃。在昏黄的路灯下,没有什么比行尸走肉这个词更贴切了。

nginx proxy_cache与etag配合的问题

首先谈谈遇到的问题:

一个Nginx架在一个后端服务的前面,Nginx proxy_pass到它并开启proxy_cache,假设这个后端服务总是会吐Etag响应头。 在应用中,我们发现当nginx 的proxy_cache成功将后端的页面cache住时,浏览器多次对该页面发起请求,会命中nginx的cache,但即使浏览器请求带了If-None-Match请求头,nginx却不会响应304,而是响应200.
这样带来的问题是,即使nginx的cache将请求阻挡在后端应用之外,但是:
(1)命中后每次响应200导致我们nginx所在的服务器和客户浏览器双方都有流量损耗
(2)更重要的是增长了我们的服务响应时间。因为,如果是304的话,nginx不需要向浏览器吐数据,只用告诉浏览器用本地的缓存就好了。

Nginx中的进程间通信

我们知道,Linux提供了多种进程间传递消息的方式,比如共享内存、套接字、管道、消息队列、信号等,每种方式都各有特点,各有优缺点。其中Nginx主要使用了其中的三种方式:

  • 套接字(匿名套接字对)
  • 共享内存
  • 信号

本文主要结合代码讲一下前两种方式,匿名套接字对和共享内存在Nginx中的使用。

1. Nginx中的channel通信机制

1.1概述

首先简单的说一下Nginx中channel通信的机制。

Nginx中的channel通信,本质上是多个进程之间,利用匿名套接字(socketpair)对来进行通信。

我们知道,socketpair可以创建出一对套接字,在这两个套接字的任何一个上面进行写操作,在另一个套接字上就可以相应的进行读操作,而且这个管道是全双工的。