【nginx】新手手册(翻译)


注:本文为nginx官网 Beginner's Guide 的译文。翻译不易,转载请注明。


本手册介绍了有关nginx的基础知识,并描述了nginx可以完成的几项简单任务。读者在阅读本手册前请确保自己的机器上已经安装好nginx。未安装好的读者可参考如何安装nginx。本手册将介绍以下内容:

  • 如何启动、停止nginx
  • 如何重新载入其配置文件
  • nginx配置文件的结构
  • 如何配置将nginx设置为静态资源服务器
  • 如何将nginx设置为代理服务器
  • 如何使nginx关联FastCGI应用

nginx拥有一个主进程和数个工作进程。主进程的主要任务是读取配置文件、评估配置文件的合理性和维护工作进程。工作进程的任务是处理具体的请求。nginx采用事件驱动模型和OS强相关机制确保能够高效地将请求分配给各个工作进程。工作进程的数量可在配置文件中设置,可以将数量定为某个数值,也可以使nginx按照CPU核心数自动调整。(见工作进程

nginx和其各个模块的工作方式由配置文件决定。默认情况下,配置文件的名称为nginx.conf,位于 /usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx文件夹中。

启动nginx、停止nginx、重新载入配置文件

运行nginx可执行文件即可启动nginx。nginx启动后,可通过在nginx可执行文件后增加-s参数来控制nginx服务器。语法如下:

nginx -s signal

signal为下列任一值:

  • stop — 快速地关闭
  • quit — 优雅地关闭
  • reload — 重新载入配置文件
  • reopen — 重新打开日志文件

例如,若要停止nginx各个进程,但停止之前须等待工作进程处理完当前的请求,则可运行以下命令:

nginx -s quit

执行该命令的用户应与启动nginx的用户一致

命令nginx重新载入配置文件或重启nginx之后,配置文件中做出的改变才会生效。运行以下命令即可命令nginx重新载入配置文件:

nginx -s reload

主进程收到重新载入配置文件的信号后,该进程会先检查新配置文件的语法,然后尝试应用其中提供的配置。若成功,主进程会启动新的工作进程,并向旧工作进程发送信息,要求其停止工作。若不成功,主进程回滚其做出的改变,继续使用旧配置。主进程收到停止命令后将不再接受新的连接,同时继续处理当前请求直至完成。之后,旧工作进程退出。

可以通过kill命令之类的Unix工具向nginx进程发送信号。在这种情况下,信号会直接送至指定进程ID下的进程。nginx主进程的进程ID默认被写入/usr/local/nginx/logs/var/run文件夹内的nginx.pid文件。例如,假设主进程的ID是1628,若需要向nginx发送QUIT信号使其优雅关闭,则可执行以下命令:

kill -s QUIT 1628

若需要列出所有运行中的nginx进程,可与下面的方式使用ps命令:

ps -ax | grep nginx

获取与向nginx发送信号相关的更多信息,访问控制nginx

配置文件的结构

nginx由各个模块组成,这些模块由配置文件中的控制指令控制。指令分为简单指令和块指令。简单指令由名称、被空格隔开的参数、结尾的分号(;)组成。块指令与简单指令的结构相同,但结尾不是分号,而是被花括号({})括住的一组额外的指令。若块指令内可嵌套被花括号括住的其他指令,则可将该块指令称为一个上下文(eventshttpserverlocation链接的网页给出了示例)。

在配置文件之内、各上下文之外定义的指令处于main上下文中。eventshttp 指令处于main上下文中,server 指令处于http上下文中,而 location指令则处于 server上下文中。

#开头的行为注释行。

动静分离

web服务器的一大重要功能就是解析文件(比如图片或静态HTML页面)。在这里,你将实现一个示例配置,使服务器能够根据请求从不同的本地文件目录(例如:/data/www(可能包含HTML文件)和/data/images(包含图片))解析文件。为达到这个目的,你需要编辑配置文件,在包含两个location块的http块内配置一个server块。

首先,创建/data/www文件目录,将包含文字内容的index.html放置到该目录内。接着创建/data/images目录,将几个图片文件放置到里面。

然后,打开配置文件。文件中的默认配置已经包含了几个示例server块,不过大多数被注释掉了。目前先将所有这样的块指令注释掉,然后定义一个新的server块:

http {
     server {
     }
}

一般来说,配置文件可包含数个server块,各个块的端口服务器名称 不同。一旦nginx确定了当前请求应该由那个server处理,它会根据server块中location指令的参数比对请求头中的URI。

将下面的location块写入server块中:

location / {
    root /data/www;
}

location 块规定应以/前缀比对请求中的URI。若请求吻合,其中的URI将被拼接到root指令给出的路径后,即拼接到 /data/www后,以生成被请求的文件在本地文件系统中的路径。如果匹配的 location 块有多个,nginx会优先选择前缀最长的那个。 上面给出的location 块定义的前缀长度为1,最短,因此只有在其他所有location块都不匹配的情况下,nginx才会选择该location块。

接着将第二个location块写入server块中:

location /images/ {
     root /data;
}

location块将匹配以/images/ 开头的请求(location /也匹配这样的请求,但是其定义的前缀更短)。

此时,配置后的server块是这样的:

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

这样就已经配置了一个可用的nginx服务器了,该服务器监听80端口,在本机可通过http://localhost/访问。当请求中的URI以/images开头时,服务器将从/data/images目录解析文件。例如,对 http://localhost/images/example.png 请求进行回应时,nginx将返回/data/images/example.png 文件。如果该文件不存在,nginx将返回404错误。不以/images/开头的URI将被映射到 /data/www目录。例如,对http://localhost/some/example.html 请求,nginx将返回/data/www/some/example.html 文件。

启动nginx(若还未启动)或通过以下命令向nginx主进程发送reload信号可使配置文件中所做修改生效:

nginx -s reload

若执行命令时出现错误,你可在 /usr/local/nginx/logs/var/log/nginx的目录下的access.logerror.log文件中找到出错的原因。

搭建一个简单的代理服务器

nginx最广泛的应用场景就是代理服务器。代理服务器的工作流程通常是:接收请求、将请求转发给被代理的服务器、从被代理的服务器接收回应、将回应发送给客户端。

我们接下来将配置一个基础的代理服务器。若是图片请求,则该服务器会从本地目录解析文件,否则将会将请求发送给一个被代理的服务器。本示例中的两个服务器将在单个nginx实例中定义。

首先,在nginx的配置文件中增添一个server块来充当被代理的服务器,server块中的内容如下:

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

这样就配置好一台监听8080端口的服务器(之前因为使用了标准的80端口,所以不需要使用listen指令),并将所有请求映射到本地文件系统的/data/up1目录。创建该目录,然后将index.html放到该目录中。注意,root指令位于server上下文中。若选中的location块没有包含自己的root指令,系统就会自动使用在server上下文中定义的root指令。

接下来,将上一节中用到的服务器配置修改为代理服务器的配置。在第一个location块中加入proxy_pass指令,指令的参数中应声明代理服务器的协议、名称和端口。

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

第二个 location 块指令目前将以/images/开头的请求映射到/data/images目录下的文件。我们将修改该指令,使其参数可以匹配带有典型图片文件扩展名的图片请求。修改后的 location 快是这样的:

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

location指令的参数是正则表达式,可匹配所有以 .gif.jpg.png结尾的URI。使用正则表达式作为参数时应先在前输入~。相应的请求将被映射到 /data/images 目录。

当nginx根据请求选择location块时,它首先检查参数为前缀的location指令,记住前缀最长的location块,然后再检查正则表达式。如果某个正则表达式匹配成功,nginx会选择这个location块,否则使用先前记住的location块。

代理服务器最终的配置文件如下:

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

该服务器会过滤以.gif.jpg.png结尾的请求,并将它们映射到/data/images目录(通过将URI拼接到root指令的参数后), 然后所有其他请求传递给之前配置的被代理服务器。

为使新的配置文件生效,按照之前介绍的方式将reload信号发送给nginx。

除上面用到的指令外,可以使用很多其他的指令对代理服务器进行深度配置。

配置 FastCGI 代理

可以使用nginx将请求路由到FastCGI服务器,在这种服务器上运行的程序通常由多种框架和编程语言(例如PHP)写成。

最基础的FastCGI服务器配置中会用到fastcgi_pass指令(而非proxy_pass 指令)以及fastcgi_param 指令(用于声明需传递给FastCGI服务器的参数)。假设可通过localhost:9000访问FastCGI。以之前的代理服务器配置为模板,用fastcgi_pass指令替代proxy_pass指令,然后将fastcgi_pass的参数指定为 localhost:9000。在PHP中,SCRIPT_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;
     }
 }

这样就配置了一个可将所有请求(静态图片请求除外)路由到 localhost:9000处使用 FastCGI协议的被代理服务器。


欢迎到 作者github主页交流

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

推荐阅读更多精彩内容