Nginx文档-初学者指南
原文档: http://nginx.org/en/docs/beginners_guide.html
译者:Oopsguy
本指南旨在介绍nginx基本内容和一些在Nginx上可以完成的简单任务。这里假设您已经安装了nginx,否则请参阅安装nginx页面。本指南介绍如何启动、停止nginx和重新加载配置,解释配置文件的结构,并介绍如何设置nginx以提供静态内容服务,如何配置nginx作为代理服务器,以及如何将其连接到一个FastCGI应用程序。
nginx有一个主进程(Master)和几个工作进程(Worker)。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程对请求进行处理。nginx采用了基于事件模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。工作进程的数量可在配置文件中定义,并且可以针对给定的配置进行修改,或者自动调整到可用CPU内核的数量(请参阅worker_processes)。
配置文件决定了nginx及其模块的工作方式。默认情况下,配置文件名为nginx.conf,并放在目录/usr/local/nginx/conf,/etc/nginx或/usr/local/etc/nginx中。
启动、停止和重新加载配置
要启动nginx,需要运行可执行文件。nginx启动之后,可以通过调用可执行文件附带-s参数来控制它。 使用以下语法:
nginx -s 信号
信号可能是以下之一:
- stop - 立即关闭
- quit - 正常关闭
- reload - 重新加载配置文件
- reopen - 重新打开日志文件
例如,要等待工作进程处理完当前的请求才停止nginx进程,可以执行以下命令:
nginx -s quit
这个命令的执行用户应该是与启动nginx用户是一致的
在将重新加载配置的命令发送到nginx或重新启动之前,配置文件所做的内容更改将不会生效。要重新加载配置,请执行:
nginx -s reload
一旦主进程(Master)收到要重新加载配置(reload)的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程(Worker),并向旧工作进程发送消息,请求它们关闭。否则,主进程回滚更改,并继续使用旧配置。旧工作进程接收到关闭命令后,停止接受新的请求连接,并继续维护当前请求,直到这些请求都被处理完成之后,旧工作进程将退出。
可以借助Unix工具(如kill工具)将信号发送到nginx进程,信号直接发送到指定进程ID的进程。默认情况下,nginx主进程的进程ID是写入在/usr/local/nginx/ logs或/var/run中的nginx.pid文件中。例如,如果主进程ID为1628,则发送QUIT信号让nginx正常平滑关闭,可执行:
kill -s QUIT 1628
获取所有正在运行的nginx进程列表,可以使用ps命令,如下:
ps -ax | grep nginx
有关向nginx发送信号的更多信息,请参阅控制nginx。
配置文件结构
nginx是由配置文件中指定的指令控制模块组成。指令可分为简单指令和块指令。一个简单的指令是由空格分隔的名称和参数组成,并以分号(;)结尾。块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结尾。如果块指令的大括号内部可以有其它指令,则称这个块指令为上下文(例如:events,http,server和location)。
配置文件中被放置在任何上下文之外的指令都被认为是主上下文。events和http指令在主上下文中,http在server中,location又在server中。
#号之后的行的内容被视为注释。
提供静态内容服务
Web服务器的一个重要任务是提供文件(比如图片或者静态HTML页面)服务。您将实现一个示例,根据请求,将提供来自不同的本地目录的文件:/data/www(可能包含HTML文件)和/data/images(包含图片)。这需要编辑配置文件,在http中配置一个包含两个location块的server块指令。
http {
server {
}
}
通常,配置文件可以包含几个由监听端口和服务器域名区分的server块指令。一旦nginx决定由哪个server来处理请求,它会根据server块中定义的location指令的参数来检验请求头中指定的URI。
添加如下location块指令到server块指令中:
location / {
root /data/www;
}
该location块指令指定“/”前缀与请求中的URI相比较。对于匹配的请求,URI将被添加到根指令中指定的路径,即/data/ www,以形成本地文件系统上所请求文件的路径。如果有几个匹配上的location块指令,nginx将选择具有最长前缀的location块。上面的位置块提供最短的前缀,长度为1,因此只有当所有其它location块不能匹配时,才会使用该块。
接下来,添加第二个location指令快:
location /images/ {
root /data;
}
以/images/为开头的请求将会被匹配上(虽然location /也能匹配上此请求,但是它的前缀更短)
最后,server块指令应如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个监听标准80端口并且可以在本地机器上通过http://localhost/地址来访问的有效配置。响应以/images/开头的URI请求,服务器将从/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的主进程:
nginx -s reload
如果运行的效果没有在预期之中,您可以尝试从
/usr/local/nginx/logs或/var/log/ nginx中的access.log和error.log日志文件中查找原因。
设置一个简单的代理服务器
nginx的一个常见用途是作为一个代理服务器,作用是接收请求并转发给被代理的服务器,从中取得响应,并将其发送回客户端。
我们将配置一个基本的代理服务器,它为图片请求提供的文件来自本地目录,并将所有其它请求发送给代理的服务器。在此示例中,两个服务器在单个nginx实例上定义。
首先,通过向nginx的配置文件添加一个server块来定义代理服务器,其中包含以下内容:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个监听8080端口的简单服务器(以前,由于使用了标准80端口,所以没有指定listen指令),并将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。请注意,root指令位于server上下文中。当选择用于处理请求的location块不包含root指令时,将使用此root指令。
接下来,在上一节中的服务器配置基础上进行修改,使其成为代理服务器配置。在第一个location块中,使用参数指定的代理服务器的协议,域名和端口(在本例中为http://localhost:8080)放置在proxy_pass指令处:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改使用了/images/前缀将请求映射到/data/images目录下的文件的第二个location块,使其与附带常见的图片文件扩展名的请求相匹配。修改后的location块如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该参数是一个正则表达式,匹配所有以.gif,.jpg或.png结尾的URI。正则表达式之前应该是〜。相应的请求将映射到/data/images目录。
当nginx选择一个location块来提供请求时,它首先检查指定前缀的location指令,记住具有最长前缀的location,然后检查正则表达式。如果与正则表达式匹配,nginx会选择此location,否则选择更早之前记住的那一个。
代理服务器的最终配置如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此server将过滤以.gif,.jpg或.png结尾的请求,并将它们映射到/data/images目录(通过向root指令的参数添加URI),并将所有其它请求传递到上面配置的代理服务器。
要使新配置立即生效,请将重新加载配置文件信号(reload)发送到nginx,如前几节所述。
还有更多的指令可用于进一步配置代理连接。
设置FastCGI代理
nginx可被用于将请求路由到运行了使用各种框架和PHP等编程语言构建的应用程序的FastCGI服务器。
与FastCGI服务器协同工作的最基本的nginx配置是使用fastcgi_pass指令而不是proxy_pass指令,以及fastcgi_param指令来设置传递给FastCGI服务器的参数。假设FastCGI服务器可以在localhost:9000上访问。以上一节的代理配置为基础,用fastcgi_pass指令替换proxy_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;
}
}
这里设置一个server,将除了静态图片请求之外的所有请求路由到通过FastCGI协议在localhost:9000上运行的代理服务器。
Nginx文档-初学者指南的更多相关文章
- 转:苹果Xcode帮助文档阅读指南
一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出 ...
- 苹果Xcode帮助文档阅读指南
文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...
- 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在学习5G规范过程中,有些内容把握不定的时候,有时 ...
- swagger在线api文档搭建指南,用于线上合适么?
在上一篇文章中,我们讲解了什么是 api,什么是 sdk: https://www.cnblogs.com/tanshaoshenghao/p/16217608.html 今天将来到我们万丈高楼平地起 ...
- nginx 文档链接
https://www.cnblogs.com/wcwnina/p/8728391.html NGINX简介 http://www.nginx.cn/doc/ ...
- Android文档-开发者指南-第一部分:入门-中英文对照版
发布的博客,排版太不行了,整理下发在百度盘上了: 第一部分:Introduction(入门) 0.Introduction to Android(引进到Android) 1.Application F ...
- 1.SQLAlchemy文档-简介(中文版)
Python的SQL工具包和对象关系映射器 SQLAlchemy的是Python的SQL工具包和对象关系映射器,让应用程序开发人员可以使用上SQL的强大功能和灵活性. 它提供了一套完整 ...
- PEAR:使用PHPDoc轻松建立你的PEAR文档
对于一个开发人员,文档总是最感到头疼的事情之一.而且,很可能你对待文档会采取截然不同的2种态度: 当你使用别人的代码库的时候,最希望得到的是它的技术文档,尤其是当时间很紧,而你又不得不硬着头皮去读那些 ...
- Jeecg社区wiki在开放,最终能够在线看文档啦!!!
Jeecg社区wiki在开放,最终能够在线看文档啦! .! 2014-12-18 scott JEECG jeecg开源社区wiki正式启动了.方便大家看文档 訪问地址是: http://osbaba ...
随机推荐
- 《物联网框架ServerSuperIO教程》-21.终端控制传感器或设备,形成回路控制。附:demo源代码
21.1 概述 ServerSuperIO以前所做的工作逐步为形成回路控制或级联控制打下基础,例如:服务连接器和设备驱动连接器的开发与应用.总之,是通过多种形式下发命令控制设备(驱动)或传感器 ...
- php面向对象1
类和对象的关系 首先看一段代码 var_dump()后的结果 注意 一个对象系统自动分配一个对象标识符!
- 编写原生JS的insertAfter函数
DOM里有insertBefore函数,但没有insertAfter函数,所以自己编写一个该函数: function insertAfter(newElement, targetElement){ v ...
- 从《海贼王》的视角走进BAT的世界(百度/阿里/腾讯)
在伟大航路后半段--新世界,有三位君临天下的海上枭雄,就犹如海上皇帝一般,被人们称为"三皇",他们是--洛宾·里(Robin·Li),杰克·马(Jack·Ma)和波尼(pony)! ...
- ex2:逻辑回归及正则条件下的练习
EX2 逻辑回归练习 假设你是一个大学某系的管理员,你想根据两项考试结果来确定每个申请人的录取机会.你有以前申请人的历史资料以作为逻辑回归的训练集.对于每一个训练集,你拥有每个申请人的两项考试的分 ...
- Docker Hub工作流程-Docker for Web Developers(6)
在Github上创建项目仓库 和创建其他Github项目一样,在Github创建一个仓库,然后在仓库里面增加一个dockerfile,然后提交并推送到Github上. 我已经创建的仓库地址:https ...
- 移动webAPP前端开发技巧汇总2
一.关于单位的使用 可能在传统的PC端来说,1px=1px的比例.而在移动端却不是这样,1px = ?. 因为出现了一个像素密度这样个东西,就不能在移动端使用“PX”这个单位.可能在你的大屏手机是1p ...
- 搭建开源java博客并通过域名访问
这个博客系统是王爵在GitHub上开源的,通过简单几步就可以部署成功. 前面几步可以参照如下几个链接: 1.https://www.qcloud.com/community/article/29008 ...
- php使用openssl进行数字签名验证
<?php /** * Created by PhpStorm. * User: hanks * Date: 6/2/2017 * Time: 6:03 PM */ /* [数字签名] 使用完全 ...
- c#中的委托和c++中的bind/function对比
在c++中,如果要实现这样一个功能,比如定时器,在指定的时间执行指定的函数,接口可以采用如下的设计 uint64_t addtimer(uint64_t t, std::function<voi ...