Nginx Beginner`s Guide

原文地址:Beginner`s Guide
参考文档:Nginx原理
本文翻译自上述地址(Nginx官网新手指引),我自己感觉到不能表达正确的地方使用了原文,可能还存在其他我没有意识到的转述错误,文章仅供参考。

入门手册

这份手册将给出关于 nginx 的一个基本指引,和一些基于这些指引可以完成的简单应用。这份手册将假设阅读者现在已经安装了 nginx。如果没有,出门左转。这份手册将会描述 nginx 的启动、停止、配置重载,解释配置文件,同时怎么应用 nginx 作文件服务,怎么将nginx 配置成一个代理服务器,怎么通过 FastCGI Application 连接 nginx。

nginx 有一个主进程(master process)和若干个子进程(worker process)。主进程的作用是为了方便对配置文件进行管理,同时可以管理子进程。是子进程在真正的处理请求(nginx employs event-based model and os-dependent mechanisms to efficiently distribute requests among worker process,漏了翻译这句),子进程的数量是在配置文件中定义的。

配置文件描述了 nginx 及其模块的运行。一般情况下,配置文件叫做 nginx.conf,被放置在目录 /usr/local/nginx/conf,/etc/nginx,或者 /usr/local/etc/nginx 下面。

执行、停止和重载配置

运行可执行的文件,就能开启 nginx(to start nginx, run the executeable file)。一旦 nginx 被开启,就可以通过调用 -s 参数来控制 nginx,像下面这个样子

nginx -s signal

signal 可以为:

  • stop —— 快速关闭
  • quit —— 安全关闭
  • reload —— 重载配置
  • reopen —— 重载日志

比如,当一个子进程正在处理请求,而你想停止它,可以使用

nginx -s quit

该命令应该由开启 nginx 的用户下达。

只有当 nginx 收到重载的指令后(或者 nginx 被重启),之前配置文件中的修改才会生效。重载配置,使用

nginx -s reload

一旦当主进程收到重载配置的指令,新配置文件中的语法合法性将会被检查,新的配置也将被尝试使用。如果成功,主进程将开启新的子进程,并且给旧的子进程发送指令,关闭旧的子进程。如果新的配置失败,主进程将会回滚,并且继续使用旧的配置。旧的子进程会接收到指令,停止接收新的请求,在处理完当前请求后关闭。

在一些 unix 工具的帮助下,一些像 kill 这样的指令也会被发送到 nginx。在这种情况下,指令通过进程 id 直接作用于 nginx 进程。默认情况下,nginx 的主进程 id 会被写在 /usr/local/nginx/logs 或者 /var/run 目录下的 nginx.pid 文件中。例如,假设主进程的 id 是 1628,使用 QUIT 命令可以进行安全的关闭

kill -s QUIT 1628

可以通过使用 ps 命令来查看正在运行的 nginx 进程,比如

ps -ax | grep nginx

获取更多关于发送指令给 nginx 的信息,请查看 Controlling Nginx

配置文件结构

nginx 由模块组成,这些模块通过配置文件中一些特定准则来进行控制。这些准则被划分为单准则和准则块。单准则由名字和参数组成,名字和参数之间通过空格进行区分,单准则以分号(;)结尾。准则块和单准则具有相同的结构,但不同于分号,准则块使用一堆花括号结尾({ })。如果一个准则块内部包含了其他准则,这些准则被称为 context(比:eventshttpserverlocation)。

Directives placed in the configuration file outside of any contexts are considered to be in the main context...

以井号(#)开始的行是注释。

文件服务(serving static content)

WEB服务器很重要的一个功能就是提供文件服务(图片,静态HTML页面)。下面将提供一个实例,这个实例将会根据请求,从服务器的不同目录提供文件。(/data/www,HTML目录,/data/images,图片目录)。为了完成这个实例,将需要修改配置文件,并将一个包含两个 location块 的 server块 放置到 http块 中。

首先,创建 /data/www 目录,将 index.html(随便写点东西) 放到里面,然后再创建 /data/images 目录,并往目录里面塞一些图片。

接下来,打开配置文件。默认的配置文件已经包含了一些 server块 的示例,大部分以注释的形式呈现。现在去掉 server块 的注释,并添加如下一个 server块:

http {
server {
​ }
}

总的来说,配置文件中可以包含很多 server块,这些 server块 通过监听端口和服务名(server name)进行区分。一旦 nginx 决定了使用哪个 server 处理请求,nginx 将会拿到请求头中的 URI 与server块 中的 location准则块 进行参数比较。

在上面的 server块 中添加下列 location块。

location / {
​ root /data/www;
}

这个 location块 指定了当请求中的 URI 以 “/” 为前缀的时候的 nginx 处理规则。如果请求匹配了规则,URI 将会添加到 root规则 中声明的路径,也就是说会从/data/www路径获取请求文件。如果 location块 中有多个地方可以匹配请求的 URI,nginx 将选择最长的那个。上面的 location块 提供了最短的前缀,如果其他的 location块 对URI的匹配都失败了,这个最短的将会被使用。

接下来,添加第二个 location块:

location /images/ {
​ root /data/images;
}

这个规则将匹配以 /images/ 开始的请求(“/” 规则也可以匹配同样请求,但 nginx 将选取最长的)。

最终的 server块 将是下面这个样子:

server {
​ lcation / {
​ root /data/www;
​ }
​ location /images/ {
​ root /data/images;
​ }
}

这就是一个在地址 http://localhost 监听标准端口 80,可以生效的一个 server 配置。作为对以 /images/ 开头请求 URI 的回应,服务器将会发送 /data/images 目录的文件。比如,作为对 http://localhost/images/example.png 的回应,nginx 将会发送 /data/images/example.png 文件,如果不存在上述文件,nginx 将会发送一个 404。不以 /images/ 开头的请求将会去匹配 /data/www 目录。比如,作为对 http://localhost/some/exmaple.html 的回应,nginx 将发送 /data/www/some/example.html 文件。

想要让新的配置生效,如果没有开启 nginx,那就开启 nginx,或者再开启了 nginx 的情况下使用 nginx -s reload

当结果并没有像期待的那样时,你可以去 /usr/local/nginx/logs 或者 /var/log/nginx 目录中的 access.log 和 error.log 文件寻找原因。

简单代理服务(setting up a simple proxy server)

ngixn 的一个广泛用途是作为一个代理服务器,这意味着 nginx 作为一个获取请求,转发给被代理的服务器,从被代理的服务器获取内容,然后转发给客户端的代理服务器。

接下来将配置一个基本的代理服务器,这个代理服务器将会从本地目录获取请求中的图片,并将其他请求转发给被代理的服务器。在这个例子中,两个服务器都将是 nginx 服务器(both servers will be defined on a single nginx instance)。

首先,在被代理的服务器的配置中添加一个 server块,内容如下:

server {
​ listen 8080;
​ root /data/up1;
​ location / {
​ }
}

这是一个监听了 8080 端口的简单服务器(如果标准 80 端口没有被使用的话,这里是不用进行特别指定的),这个服务器将会去本地文件系统中的 /data/up1 目录处理所有请求。创建 /data/up1 目录,并放置 index.html。请注意 root 规则被放置到了 server 中。这种 root 规则将会在下面情况被使用,如果被匹配的 location块 没有自己的 root 规则。

接下来,使用之前的配置,并稍作修改就能使之成为一个代理服务器配置。在第一个 location块 中,将被代理服务器的协议、名称和端口号作为参数写到 proxy_pass规则(这个例子中被代理的服务器时 http://localhost:8080):

server {
​ location / {
​ proxy_pass http://localhost:8080;
​ }
​ location /images/ {
​ root /data/images;
​ }
}

我们将修改当前从 /data/images/ 目录匹配 /images/ 前缀第二个 location块,使之可以匹配常见图片后缀,像下面这样:

location ~ \.(gif|jpg|png)$ {
​ root /data/images;
}

这是一个用来匹配以 .gif,.jpg,.png 结尾的 URI 的常用表达。一个常用的表达应该使用 ~ 开头。被匹配的请求将会到 /data/images 目录。

当 nginx 选择一个 location块 来处理请求时,首先会检查可以匹配请求 URI 的 location规则,记住最长的那个 location,然后才去匹配正则表达式的。如果有一个正则表达式匹配成功,nginx 将会选取这个 location,或者选取之前记住的那个。

最终的代理配置将会像下面这个样子:

server{
​ location / {
​ proxy_pass http://localhost:8080/;
​ }
​ location ~ \.(gif|jpg|png)$ {
​ root /data/images;
​ }
}

这个服务器将匹配以 .gif,.jpg,.png 结尾的请求,并将其 map 到 /data/images 目录(通过在 root规则 中添加参数),同时将其他所有请求转发到上面配置中被代理的服务器。

关于代理服务器配置,有以下更多规则可供参考。

FastCGI 代理配置

ngixn 可以用来为很多建立在不同框架和语言(比如PHP)的 FastCGI 应用提供 route requests。(nginx can be used to route requests to FastCGI servers which run applications built with various frameworks and programming laguages such as PHP)。

nginx 作为一个 FastCGI 服务器时最基本的配置包括 fastcgi_pass规则。fastcgi_param规则 可以为 FastCGI 服务器配置参数。假设可以通过 localhost:900 访问 FastCGI 服务。使用之前的段落作为一个基本的代理配置,使用 fastcgi_pass 规则替代 proxy_pass规则,并且将参数更改为 localhost:9000。在PHP中,参数 SCRITP_FILENAME 用来决定脚本名称,QUERY_STRING 参数用来通过请求参数。最后的配置如下:

server {
​ location / {
​ fastcgi_pass localhost:9000;
​ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
​ fastcgi_param QUERY_STRING $query_string
​ }
​ ​ location ~ \.(gif|jpg|png)$ {
​ root /data/images;
​ }
}

This will set up a server that will route all requests except for requests for static images to the proxied server operating on localhost:9000 througn the FastCGI protocol.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,988评论 0 9
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,860评论 0 3
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,636评论 24 1,002
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,190评论 5 124
  • 1.ngnix介绍 ngnix www服务软件 俄罗斯人开发 开源 性能很高 本身是一款静态WWW软件 静态小文件...
    逗比punk阅读 2,079评论 1 6