nginx 官网文档翻译--入门

阅读数:1543 发布时间:2016-07-09 18:45:42

作者:zzl005 标签: nginx 朱忠来005

nginx进程

nginx 有一个主进程和一些工作进程

这里说了下 nginx 中主进程的职责:主要是读取配置文件,维持好工作进程

那些实际的请求处理就交给工作进程

nginx 实现了 基于事件的模型和依赖于操作系统的机制来有效地在各个工作进程之间分发请求

工作进程的数量是在配置文件中定义的,并且有可能由配置文件安排或者由可用的 CPU 核心数来自动调整。具体可以看一看(worker_processes

配置文件决定了 nginx 及其模块的工作方式。默认情况下,配置文件名为 nginx.conf,并且放在下面几个目录中的其中一个:/usr/local/nginx/conf, /etc/nginx, /usr/local/etc/nginx

nginx 的启动,停止,重载

一开始启动 nginx ,需要运行可执行文件,一旦 nginx 启动之后,就可以使用 nginx -s 参数 来控制,具体的命令为:

nginx -s signal

其中 signal 可以是下面几个中的任意一个:

举例来说,如果需要等待工作进程完成当前请求的处理后才停止 nginx ,那么就用 quit,具体命令如下:

nginx -s quit
只能在启动 nginx 的用户下执行这个命令才有效

配置文件中的变化并不会立刻生效,除非两种情况:

  1. 向 nginx 发送了重载配置的指令
  2. nginx restart 了

重载配置文件的命令是:

nginx -s reload

一旦主进程接收到了重载配置的信号,那么主进程就会检查新配置文件的有效性,并且尝试应用这些配置。
如果以上两步都成功了,主进程就会开启一个新的工作进程,并且向旧的工作进程发送一个信号,要求他们停止。
如果上面两步没有成功,主进程就会回滚配置文件中的变化并且继续使用旧的配置文件。
旧的工作进程会收到进程停止指令,在进程停止之前不再接收新的连接而且会将当前所有请求处理完毕,这些完成之后,旧的工作进程退出。

也可以用 Unix 的工具(比如 kill )发送信号到 nginx 进程,在这个例子中,一个带有给定的进程ID 的信号会被直接发送给这个进程。
默认情况下,nginx 主进程的进程ID会被写入 /usr/local/nginx/logs或是/var/run目录下的 nginx.pid。举例来说,主进程的ID为1628,可以执行以下的退出信号来正常关闭 nginx:

kill -s QUIT 1628

可以使用 ps 命令获取正在运行的 nginx 的进程列表:

ps -ax | grep nginx

获取更多关于发送信号到 nginx 的信息,请查看Controlling nginx

配置文件结构

nginx 由配置文件中指定指令控制的模块组成。
指令分成简单指令和块指令。

配置文件中不属于任何 context 的指令属于 main context。events 和 http 指令属于 main context,server 属于 http,location 属于 server。

结构为:

main context  
    |————events  
http  
    |————server  
        |————location   

# 号开头的一行为注释

服务静态内容

web 服务器的一个重要任务是分发文件(例如图片或者是静态 HTML页面)。你将根据请求实现一个例子,文件可以从本地的各种目录请求到,例如:/data/www (可能包含 HTML 文件) 、/data/images (包含图片)。
这可能需要在配置文件的 http 块指令下配置一个包含两个 location 块指令的 server 块指令。

First, create the /data/www directory and put an index.html file with any text content into it and create the /data/images directory and place some images in it.

首先,建立一个 /data/www 目录,在其中放一个包含一些内容的 index.html 文件,再建一个 /data/images 目录,并且在其中放一些图片。

接下来,打开配置文件,默认的配置文件已经包含一些 server 块指令的例子,多数情况下是被注释的。现在,注释掉所有块指令,重写一个新的 server 块指令。

http {
    server {
    }
}

一般来说,配置文件已经包含一些通过监听的端口和服务器名来区分的 server 块。一旦 nginx 决定了哪个服务器处理一个请求,它将测试在请求头中(通过 server 块指令中定义的 location 指令的参数)所指定的 URI。

Add the following location block to the server block:

location / {
    root /data/www;
}

在 server 块指令中添加下面的 location 块指令

location / {
    root /data/www;
}

location 块指令指定了 / 前缀,来和请求中的 URI对比。URI 会被添加到 root 指令中指定的路径,来和请求匹配,也就是说,指向/data/www,构成指向请求文件(在本地文件系统中)的路径。如果同时有几个相匹配的 location 块指令,nginx 会选择前缀最长的那个。上面的那个 location 块指令只有一个长度的最短的前缀,只有在所有的 location 块指令都不能匹配时,上面这个 location 块指令才会起作用。(有点像 switch 中的 default )

再接下来,添加第二个 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 和 错误日志文件中寻找没有得到预期结果的原因。

配置简单的代理服务器

nginx 的最常用用法之一就是配置一个代理服务器。这意味着,一个服务器接收请求,向代理服务器传递请求,从代理服务器中接收响应,向客户端发送响应。

接下来,我们将配置一个最基本的代理服务器,这个代理服务器将只处理对本地文件系统中的图片请求,并将所有的其他请求发送到代理服务器。在这个例子里,两个服务器会被定义在同一个 nginx 例子中。

首先,通过向 nginx 配置文件中添加更多的 server 块指令来定义这个代理服务器。

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这是一个监听8080端口的服务器(在这之前,从标准的80端口被使用,监听指令还没有被特别指定过),并且把所有的请求映射到本地文件目录中的 /data/up1

建立这个目录,并将 index.html 文件放在这个目录下。
root 指令被放在 server context 中。
像这样的 root 指令会在(被选为处理一个请求)的location 块指令(而这个 location 块指令又没有自己的 root 指令)使用。

下面,使用先前章节中的服务器配置,并把它修改成一个代理服务器的配置。在第一个 location 块指令中,写入含有(协议、参数中指定了名称和端口的代理服务器:在这个例子中为:http://localhost:8080)的 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;
}

这个参数正则表达式用来匹配所有以 .git.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;
    }
}

服务器会过滤以.git.jpg,.png 结尾的请求,并且映射到 /data/images (通过将 URI 添加到 root 指令的参数中),同时会将所有其他请求传递到上面配置的代理服务器。

重载配置,使之生效。

有更多的指令可以进一步配置一个代理连接。

配置一个 FastCGI 代理

nginx 可以用来将请求路由到 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;
    }
}

相关文章推荐: