agentzh 的 Nginx 教程(版本 2012.03.27)目录
缘起
Nginx 教程的连载计划
Nginx 变量漫谈(一)
Nginx 变量漫谈(二)
Nginx 变量漫谈(三)
Nginx 变量漫谈(四)
Nginx 变量漫谈(五)
Nginx 变量漫谈(六)
Nginx 变量漫谈(七)
Nginx 变量漫谈(八)
Nginx 配置指令的执行顺序(一)
Nginx 配置指令的执行顺序(二)
Nginx 配置指令的执行顺序(三)
Nginx 配置指令的执行顺序(四)
Nginx 配置指令的执行顺序(五)
Nginx 配置指令的执行顺序(六)
Nginx 配置指令的执行顺序(七)
Nginx 配置指令的执行顺序(八)
Nginx 配置指令的执行顺序(九)
Nginx 配置指令的执行顺序(十)
Nginx 配置指令的执行顺序(十一)
缘起
其实这两年为 Nginx 世界做了这么多的事情,一直想通过一系列教程性的文章把我的那些工作成果和所学所知都介绍给更多的朋友。现在终于下决心在新浪博客blog.sina/openresty 上面用中文写点东西,每一篇东西都会有一个小主题,但次序和组织上就不那么讲究了,毕竟并不是一本完整的图书,或许未来我会将之整理出书也不一定。
nginx和网关怎么配合使用我现在编写的教程是按所谓的“系列”来划分的,比如首先连载
的“Nginx 变量漫谈”系列。每一个系列基本上都可以粗略对应到未来出的 Nginx 书中的一“章”(当然内部还会重新组织内容并划分出“节”来)。我面向的读者是各个水平层次的 Nginx 用户,同时也包括未使用过 Nginx 的 Apache、Lighttpd 等服务器的老用户。
我只保证这些教程中的例子至少兼容到 Nginx 0.8.54,别用更老的版本来我的错处,我一概不管,毕竟眼下最新的稳定版已经是1.0.10了。
凡在教程里面提到的模块,都是经过生产环境检验过的。即便是标准模块,如果没有达到生产标准,或者有重要的 bug,我也不会提及。
我在教程中会大量使用非标准的第三方模块,如果你怕麻烦,不愿自己一个一个从网上下载和安装那
些个模块,我推荐你下载和安装我维护的ngx_openresty这个软件包:
/
教程里提及的模块,包括足够新的 Nginx 稳定版核心,都包含在了这个软件包中。
我在这些教程中遵循的一个原则是,尽量通过短小精悍的实例来佐证我陈述的原理和观点。我希望帮助读者养成不随便听信别人现成的观点和陈述,而通过自己运行实例来验证的好习惯。这种风格或许也和我在 QA 方面的背景有关。事实上我在写作过程中也经常按我设计的小例子的实际运行结果,不断地对我的理解以及教程的内容进行修正。
对于有问题的代码示例,我们会有意在排版上让它们和其他合法示例所有区别,即在问题示例的每一行代码前添加问号字符,即(?),一个例子是:
? server {
?    listen 8080;
?
?    location /bad {
?        echo $foo;
?    }
? }
未经我的同意,请不要随便转载或者以其他方式使用这些教程。因为其中的每一句话,除了特别引用的“名句”,都是我自己的,我保留所有的权利。我不希望读者转载的另一大原因在于:转载后的拷贝版本是死的,我就不能再同步更新了。而我经常会按照读者的反馈,对已发表的老文章进行了大面积的修订。
我欢迎读者多提宝贵意见,特别是建设性的批评意见。类似“太烂了!”这样无聊中伤的意见我看还是算了。
所有这些文章的源都已经放在 GitHub 网站上进行版本控制了:github/agentzh/nginx-tutorials/
源文件都在此项目的zh-cn/目录下。我使用了一种自己设计的Wiki和POD标记语言的混合物来撰写这些文章,就是那些.tut文
件。欢迎建立分支和提供补丁。
本教程适用于普通手机、Kindle、iPad/iPhone、Sony 等电子阅读器的.html、.mobi、.epub以及.pdf等格式的电子书文件可以从下面这个位置下载:
/#eBooks
章亦春 (agentzh) 于福州家中
2011 年 11 月 30 日
Nginx 教程的连载计划
下面以教程系列为单位,列举出了已经发表和计划发表的连载教
程:
Nginx 新手起步
Nginx 是如何匹配 URI 的
Nginx 变量漫谈
Nginx 配置指令的执行顺序
Nginx 的 if 是邪恶的
Nginx 子请求
Nginx 静态文件服务
Nginx 的日志服务
基于 Nginx 的应用网关
基于 Nginx 的反向代理
Nginx 与 Memcached
Nginx 与 Redis
Nginx 与 MySQL
Nginx 与 PostgreSQL
基于 Nginx 的应用缓存
Nginx 中的安全与访问控制
基于 Nginx 的 Web Service
Nginx 驱动的 Web 2.0 应用
测试 Nginx 及其应用的性能
借助 Nginx 社区的力量
这些系列的名字和最终我的 Nginx 书中的“章”名可以粗略地对应上,但不会等同。同时未发表的系列的名字也可能发生变化,同时实际发表的顺序也会和这里列出的顺序不太一样。
上面的列表会随时更新,以保证总是反映了最新的计划和发表情况。
Nginx 变量漫谈(一)
Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序。当然,是不
是“图灵完全的”暂且不论,至少据我观察,它在设计上受 Perl 和Bourne Shell 这两种语言的影响很大。
在这一点上,相比 Apache 和 Lighttpd 等其他 Web 服务器的配置记法,不能不说算是 Nginx 的一大特了。既然是编程语言,一般也就少不了“变量”这种东西(当然,Haskell 这样奇怪的函数式语言除外了)。
熟悉 Perl、Bourne Shell、C/C++ 等命令式编程语言的朋友肯定知道,变量说白了就是存放“值”的容器。而所谓“值”,在许多编程语言里,既可以是3.14这样的数值,也可以是hello world这样的字符串,甚至可以是像数组、哈希表这样的复杂数据结构。然而,在 Nginx 配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串。
比如我们的f文件中有下面这一行配置:
set $a "hello world";
我们使用了标准ngx_rewrite模块的set配置指令对变量$a进行了赋值操作。特别地,我们把字符串hello world赋给了它。
我们看到,Nginx 变量名前面有一个$符号,这是记法上的要求。所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上$前缀。这种表示方法和 Perl、PHP 这些语言是相似的。
虽然$这样的变量前缀修饰会让正统的Java和C#程序员不舒服,但这种表示方法的好处也是显而易见
的,那就是可以直接把变量嵌入到字符串常量中以构造出新的字符串:
set $a hello;
set $b "$a, $a";
这里我们通过已有的 Nginx 变量$a的值,来构造变量$b的值,于是这两条指令顺序执行完之后,$a的值是hello,而$b的值则是hello, hello. 这种技术在 Perl 世界里被称为“变量插
值”(variable interpolation),它让专门的字符串拼接运算符变得不再那么必要。我们在这里也不妨采用此术语。
我们来看一个比较完整的配置示例:
server {
listen 8080;
location /test {
set $foo hello;
echo "foo: $foo";
}
}
这个例子省略了f配置文件中最外围的http配置块以及events配置块。使用curl这个 HTTP 客户端在命令行上请求这个/test接口,我们可以得到
$ curl 'localhost:8080/test'
foo: hello
这里我们使用第三方ngx_echo模块的echo配置指令将$foo变量的值作为当前请求的响应体输出。
我们看到,echo配置指令的参数也支持“变量插值”。不过,需要说明的是,并非所有的配置指令都支持“变量插值”。事实上,指令参数是否允许“变量插值”,取决于该指令的实现模块。
如果我们想通过echo指令直接输出含有“美元符”($)的字符串,那么有没有办法把特殊的$字符给转义掉呢?答案是否定的(至少到目前最新的 Nginx 稳定版1.0.10)。不过幸运的是,我们可以绕过这
个限制,比如通过不支持“变量插值”的模块配置指令专门构造出取值为$的 Nginx 变量,然后再在echo中使用这个变量。看下面这个例子:
geo $dollar {
default "$";
}
server {
listen 8080;
location /test {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。