Contents

中间件-Nginx

本文为作者跟着nginx官网学习时做的笔记,可能并不详尽,要了解完整内容请上官网查看

初学者指南

本指南对 nginx 进行了基本介绍,并描述了一些可以用它完成的简单任务。本指南介绍如何启动和停止 nginx,以及重新加载其配置,解释配置文件的结构,并描述如何设置 nginx 以提供静态内容,如何将 nginx 配置为代理服务器,以及如何将其连接到FastCGI 应用程序。

nginx 有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程对请求进行实际处理。nginx 采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。工作进程的数量在配置文件中定义,并且可以针对给定的配置进行固定或自动调整为可用 CPU 内核的数量(请参阅 worker_processes)。

nginx 及其模块的工作方式在配置文件中确定。默认情况下,配置文件被命名nginx.conf 并放置在目录 /usr/local/nginx/conf、 /etc/nginx或 /usr/local/etc/nginx.

启动、停止和重新加载配置

要启动 nginx,请运行可执行文件。nginx一旦启动,就可以通过-s参数调用可执行文件来控制它。使用以下语法:

1
nginx -s signal

其中signal可能是以下之一:

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

例如,要停止 nginx 进程并等待工作进程完成当前请求,可以执行以下命令:

1
nginx -s 退出

此命令应在启动 nginx 的同一用户下执行。

在将重新加载配置的命令发送到 nginx 或重新启动之前,不会应用在配置文件中所做的更改。要重新加载配置,请执行:

1
nginx -s reload

一旦主进程接收到重新加载配置的信号,它就会检查新配置文件的语法有效性并尝试应用其中提供的配置。如果这是成功的,主进程启动新的工作进程并向旧的工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程收到关闭命令,停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到服务。之后,旧的工作进程退出。

也可以借助 Unix 工具(例如kill实用程序)向 nginx 进程发送信号。在这种情况下,信号被直接发送到具有给定进程 ID 的进程。nginx主进程的进程ID默认写入 nginx.pid目录 /usr/local/nginx/logs或 /var/run. 例如,如果主进程 ID 是 1628,要发送导致 nginx 正常关闭的 QUIT 信号,请执行:

1
kill -s QUIT 1628

要获取所有正在运行的 nginx 进程的列表,ps 可以使用该实用程序,例如,以下列方式:

1
ps -ax | grep nginx

配置文件的结构

nginx 由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,由空格分隔并以分号 ( ;) 结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组由大括号 ({和}) 包围的附加指令。如果块指令可以在大括号内包含其他指令,则称为上下文(例如: events、 http、 server和 location)。

放在配置文件以外的任何指令被认为是在main上下文。event和http指令放在main上下文中,server在http中,location在server中。

符号#后一行的其余部分被视为注释。

提供静态内容

一个重要的 Web 服务器任务是提供文件(例如图像或静态 HTML 页面)。您将实现一个示例,根据请求,文件将从不同的本地目录提供服务:(/data/www 可能包含 HTML 文件)和/data/images (包含图像)。 这将需要编辑配置文件并在带有两个location块的http块 内设置 server 块。

首先,创建/data/www目录并将 包含任何文本内容的index.html文件放入其中,然后创建/data/images目录并在其中放置一些图像。

接下来,打开配置文件。默认配置文件已经包含了该server块的几个示例,大部分都被注释掉了。现在注释掉所有这些块并开始一个新 server块:

1
2
3
4
http {
    server {
    }
}

通常情况下配置文件包括几个server块,他们通过监听的端口号和server 名称区分,一旦nginx决定哪一个server块处理一个请求,他会将 请求头中特定的URI 和 server块中定义的location指令的参数进行测试。

将以下location块添加到 server块中:

1
2
3
location / {
    root /data/www;
}

location块指定将 “/” 前缀与请求的URI进行对比。如果匹配,这个URI将会被添加root指令指定的路径,即data/www,从而组成请求文件在本地文件系统的路径。如果这里有多个匹配的location块,nginx选择具有最长匹配前缀的那个块。当所有其他的location块都不匹配的时候上面的"/" location块将被使用。

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

location /images/ { root /data; }

它将匹配以/images/ (location /也匹配此类请求,但前缀较短) 开头的请求。

生成的server块配置应如下所示:

1
2
3
4
5
6
7
8
9
server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

这已经是一个服务器工作的配置,其监听80端口,并在本地机器的http://localhost/是可访问的,服务器将从/data/images目录发送文件。例如,为了响应 http://localhost/images/example.png请求,nginx 会发送/data/images/example.png文件。如果这样的文件不存在,nginx 将发送一个响应,指示 404 错误。不以 URI 开头的请求/images/将被映射到/data/www目录。例如,为了响应 http://localhost/some/example.html请求,nginx 会发送/data/www/some/example.html文件。

要应用新配置,请启动 nginx(如果尚未启动)或将reload信号发送到 nginx 的主进程,方法是执行:

1
nginx -s reload

如果某些东西没有按预期工作,您可以 尝试在/usr/local/nginx/logs/var/log/nginx目录下的 access.log或error.log寻找原因

设置一个简单的代理服务器

nginx 的常见用途之一是将其设置为代理服务器,这意味着服务器接收请求,将它们传递给被代理的服务器,从它们获取响应,并将响应发送给客户端。

我们将配置一个基本的代理服务器,它为来自本地目录的文件的图像请求提供服务,并将所有其他请求发送到代理服务器。在此示例中,两个服务器都将在单个 nginx 实例上定义。

首先,通过在 nginx 的配置文件中 添加一个server块来定义代理服务器,其内容如下:

1
2
3
4
5
6
7
server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将是一个简单的服务器,它在端口 8080 上进行侦听(listen由于使用了标准端口 80,因此没有指定该指令)并将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。请注意,该root指令放置在 server上下文中。这样的root指令被用于当被选择处理请求的location块没有定义他自己的root指令时生效。接下来,使用上一节中的服务器配置并对其进行修改以使其成为代理服务器配置。在第一个location块中,将 proxy_pass 指令与参数中指定的代理服务器的协议、名称和端口一起放入(在我们的例子中,它是http://localhost:8080):

1
2
3
4
5
6
7
8
9
server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

我们将修改第二个location 块,该块当前将带有/images/前缀的请求映射 到/data/images目录下的文件,以使其匹配具有典型文件扩展名的图像的请求。修改后的location块如下所示:

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

该参数是一个正则表达式,匹配所有以.gif、.jpg或.png 结尾的 URI 。正则表达式应该以~开始. 相应的请求将映射到/data/images 目录。

当 nginx 选择一个location块来服务请求时,它首先检查指定前缀的location 指令,记住location 最长的前缀,然后检查正则表达式。如果与正则表达式匹配,则 Nginx 会选择这个 location,否则,它会选择之前记住的那个。

代理服务器的最终配置将如下所示:

1
2
3
4
5
6
7
8
9
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 服务器的最基本的 nginx 配置包括使用 fastcgi_pass 指令而不是proxy_pass指令,以及使用fastcgi_param 指令来设置传递给 FastCGI 服务器的参数。假设 FastCGI 服务在localhost:9000.以上一节中的代理配置为基础,将proxy_pass指令 替换为指令,fastcgi_pass并将参数更改为 localhost:9000. 在PHP中,SCRIPT_FILENAME参数用于确定脚本名称,QUERY_STRING 参数用于传递请求参数。生成的配置将是:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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 协议运行的代理服务器。

 |