翻译自nginx.org
本文主要讲述了如何启动,关闭nginx,以及如何重新加载nginx的配置文件,解释配置文件的结构以及如何搭建nginx来为静态内容提供服务,以及如何将nginx配置为一个代理服务器,以及如何和一个FastCGI应用进行连接。
nginx有一个主线程和多个的工作进程,主进程作用是读取配置信息,nginx采用基于时间的模型以及基于操作系统的机制来高效的将用户请求分发给各个工作进程。工作进程的数量由配置文件进行定义,并且可能会被一个给定的配置文件修正或者自动调整为可用的中央处理器内核的数量。详见work processes。
nginx以及其中各个模块的工作方式都是在配置文件中进行定义的。默认情况下,配置文件名称为:nginx.conf
,其目录为/usr/local/nginx/conf
,/etc/nginx
,或者/usr/local/etc/nginx
。
通过调用nginx -s signal
来启动nginx,注意-s
参数。其中signal
可以是:
* stop —— 快速关闭
* quit —— 正常关机
* reload —— 重新载入配置文件
* reopen —— 重新打开日志文件
例如,为了终止nginx等待完成当前请求的工作进程,可以执行:
nginx -s quit
这个命令应该和开启命令由同一个用户执行
对配置文件的变更只有在下次重新载入配置文件或者重启nginx后才会生效,执行下面的命令可以重新载入配置文件:
nginx -s reload
一旦主线程接收到重载信令,它就会去检查新配置文件的语法并且尝试使用新提供的配置。成功之后,主进程就会开启新的工作进程并且发送请求关闭旧的工作进程。如果失败的话,主进程就会撤销所有的更改,继续使用旧的配置文件。当接收到关闭的命令后,旧的工作进程会拒绝创建新的连接,继续接收当前的请求,直到已经完成所有的请求,之后,旧的工作进程就会自动退出。
通过Unix工具例如kill
工具的帮助,信令也可以直接发送给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
关于信令的更多内容,见 Controlling nginx
nginx中包含的模块由配置文件中指定的指令进行控制。指令被分为简单的指令和块级指令。简单的指令由指令名,参数和分号(;)构成。块级指令和简单指令的结构相同,但是并不是以分号(;)结尾,而是以用花括号({})包围的一系列额外指令结尾的。如果一个块级指令的花括号中包含了其他的块级指令,那么这个块级指令就称为上下文(例如:events, http, server, 以及 location).
配置文件中在所有上下文之外的命令可以认为在main上下文中。main
上下文 中的 events
和http
,http
上下文中的server
,以及server
上下文中的location
。
每行中#
后面的内容是注释。
web服务器的一个重要任务就是提供文件(例如图片或者静态的HTML页面)。你可以在这里实现一个demo,在这个的demo中根据请求,文件将由不同的本地目录进行提供:/data/www
(其中可能包含HTML文件)以及/data/images
(包含图片)。这会需要对配置文件进行编辑,并且在http模块下内嵌了server和两个location。
首先,创建/data/www
目录,并在其中添加index.html
文件,其中可以写任何内容,同时创建/data/images
目录并在其中放置一些图片。
其次,打开配置文件。默认的配置文件中已经包含了几个server
块级的例子,多数都有注释。现在我们要将所有内容都注释掉并且开始写一个新的server
块:
http {
server {
}
}
通常,配置文件中包含的几个server
块级命令可以通过它们监听listen的端口号及提供的服务名称server names进行区分。一旦nginx判断出来是那个服务进程发出来请求,它就会测试请求的头部指定的URI以及server
块命令中指定的location
命令的参数。将下面的location
命令加入到server
块命令中去::
location / {
root /data/www;
}
这个location
命令指定/
前缀以及请求中的URI。为了匹配请求,URI将会被加入到root指定的目录中,换句话说,也就是加入到/data/www
目录下,从而形成本地文件系统中被请求文件的路径。如果有多个匹配location
命令的请求,nginx会选择路径最长那一个。上面的location
块命令提供的是长度最短的路径,因此只有当其他的location
命令没有成功匹配的时候,这个命令块才会被使用。
接下来,添加第二个location
块:
location /images/ {
root /data;
}
这将会匹配以images
开始的请求(location /
同样会匹配这样的请求,但是路径会更短)。
server
块命令的结果配置文件如下:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个在80端口监听的服务器的工作配置文件里,并且可以通过http://loalhost/
在本地进行访问。为了解决以/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的主进程发送reload
命令,通过执行:
nginx -s reload
如果发生了意外,你或许可以在/usr/local/nginx/logs
或者/var/log/nginx
的access.log
和error.log
中找到原因。
nginx的一个最常用的用法是用来搭建一个代理服务器,这个代理服务器可以用来接收请求,将它们传送到所代理的服务器,并从中获得响应,并将这些响应发送给客户端。
这里将会配置一个简单的代理服务器,这个代理服务器为来自本地目录的文件中的图片请求服务,并且将其他的所有请求发送给一个代理服务器。在这个例子中,两个服务器会在单个的nginx实例中进行定义。
首先,在nginx的配置文件中再加入一个server
块从而定义代理服务器:
server {
listen 8080;
root /data/upl;
location / {
}
}
这是一个监听在8080端口的简单的服务器,(之前并没有通过listen来指定端口号是由于使用的是标准的80端口),并且将所有的请求都映射到了本地文件系统的/data/upl目录。创建这个目录并将index.html放入其中。注意root指令的上下文是server。当为一个请求选择的location块中不包括root指令时就会使用这里的root。
接下来,可以使用之前的服务器配置文件,并将之修改为一个代理服务器的配置文件。在第一个location块中,加入[proxy_pass](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass)块,在参数中指定代理服务器的协议,域名和端口号,(本例中,为`http://localhost:8080`):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
接下来要修改第二个`location`块,这个块目前会将`/images`前缀映射到`/data/images`目录下的文件,从而匹配特定文件扩展名的图片。修改后的`location`块如下:
location ~ .(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个匹配所有以`.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`目录(通过在`root`指令下添加URI),并将所有的其他请求传递到上面的代理服务器。
加载`reload`以应用这些新配置。
进一步配置代理服务器还有[许多指令](http://nginx.org/en/docs/http/ngx_http_proxy_module.html)可以使用
###搭建一个FastCGI代理
nginx可以用来将所有请求路由到运行着由多种框架和编程语言例如PHP等构建的应用的FastCGI服务器。
和FastCGI服务器协同工作的最基本的nginx配置文件包括使用[fastcgi_pass](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass)命令而不是`proxy_pass`命令,[fastcgi_param](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#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 documentroot fastcgi_script_name;
fastcgi_param QUERY_STRING query_string;
}
location ~ .(gif|jpg|png) {
root /data/images;
}
}
这会建立一个将除了静态图片请求以外的所有请求通过FastCGI协议路由到代理服务器的localhost:9000。
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
- **Markdown和扩展Markdown简洁的语法**
- **代码块高亮**
- **图片链接和图片上传**
- ***LaTex*数学公式**
- **UML序列图和流程图**
- **离线写博客**
- **导入导出Markdown文件**
- **丰富的快捷键**
-------------------
## 快捷键
- 加粗 `Ctrl + B`
- 斜体 `Ctrl + I`
- 引用 `Ctrl + Q`
- 插入链接 `Ctrl + L`
- 插入代码 `Ctrl + K`
- 插入图片 `Ctrl + G`
- 提升标题 `Ctrl + H`
- 有序列表 `Ctrl + O`
- 无序列表 `Ctrl + U`
- 横线 `Ctrl + R`
- 撤销 `Ctrl + Z`
- 重做 `Ctrl + Y`
## Markdown及扩展
> Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]
使用简单的符号标识不同的标题,将某些文字标记为**粗体**或者*斜体*,创建一个[链接](http://www.csdn.net)等,详细语法参考帮助?。
本编辑器支持 **Markdown Extra** , 扩展了很多好用的功能。具体请参考[Github][2].
### 表格
**Markdown Extra** 表格语法:
项目 | 价格
-------- | ---
Computer | $1600
Phone | $12
Pipe | $1
可以使用冒号来定义对齐方式:
| 项目 | 价格 | 数量 |
| :-------- | --------:| :--: |
| Computer | 1600 元 | 5 |
| Phone | 12 元 | 12 |
| Pipe | 1 元 | 234 |
###定义列表
**Markdown Extra** 定义列表语法:
项目1
项目2
: 定义 A
: 定义 B
项目3
: 定义 C
: 定义 D
> 定义D内容
### 代码块
代码块语法遵循标准markdown代码,例如:
``` python
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
<div class="se-preview-section-delimiter">div>
生成一个脚注1.
用 [TOC]
来生成目录:
使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.
更多LaTex语法请参考 这儿.
可以渲染序列图:
张三->李四: 嘿,小四儿, 写博客了没?
Note right of 李四: 李四愣了一下,说:
李四-->张三: 忙得吐血,哪有时间写。
<div class="se-preview-section-delimiter">div>
或者流程图:
即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。
用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。
博客发表后,本地缓存将被删除。
用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。
注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。