Nginx API 学习之一:初学者指南

初学者指南

[nginx documentation][http://nginx.org/en/docs/]

1. 启动、停止和重启配置

通过运行可执行文件启动 nginx,一旦 nginx 已经启动,可以通过调用可执行的带 -s 参数进行控制,使用下面语法:

nginx -s signal

signal 可以使以下中的一个:

  • stop:快速停止
  • quit:温和停止
  • reload:重载配置文件
  • reopen:重启日志文件

例如,若是等待工作进程完成当前请求的服务,再停止 nginx 进程,执行下面命令:

nginx -s quit

此命令执行前提是,同一个用户启动的 nginx 进程

修改配置文件,使其生效,需要发送重载配置信号到 nginx,或是重启 nginx 进程。重载配置文件,执行:

nginx -s reload

一旦主进程收到重载配置信号,会执行检查新配置文件语法的有效性,尝试运用新文件中的配置。如果成功,主进程启动新的工作进程,并发送关闭消息给旧的工作进程。否则,主进程回滚继续使用旧的配置工作。旧的工作进程,接收到关闭命令后,停止接受新连接,并继续服务当前请求直至服务完成,之后,旧的工作进程退出。

nginx 进程也会接收Unix工具发出的类似 kill 的信号。这种情况下,信号直接发送到指定进程ID的进程,nginx主进程的进程ID默认写入 /usr/local/nginx/logs 或者 /var/run 目录中的nginx.pid。例如。若主进程ID是1628,发送 QUIT 信号来执行温和停止,执行:

kill -s QUIT 1628

使用 ps 命令查看所有在运行 nginx 进程,例如下面方式:

ps -ax | grep nginx

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

2. 配置文件结构

nginx多个模块组成,这些模块由配置文件中的具体指令控制。指令分为简单指令和块指令。一个简单指令由名称和参数组成,以空格区分并以英文分号(;)结尾。块指令结构与简单指令相同,但是不以英文分号结尾,块指令由英文大括号包围({和})。块指令大括号内包含的其它指令,称为内容(例如events, http, server, 和 location

配置文件中的指令,无论哪个上下文外层都应该在对应的 main中,eventshttpmain 内,serverhttp 内,locationserver 内。

# 开始的内容表示该行为注释内容。

3. Serving静态内容

web服务器的一个重要任务是文件服务(例如文件或者静态 HTML 网页)。根据需求实现一个例子,文件来源于本地不同目录:/data/www(包含 HTML 文件),/data/images(包含图片文件)。这将需要编辑配置文件,在 http 块内增加一个 server 块,里面包含2个 location 块。

首先,创建目录 /data/www,添加 index.html 文件到该目录,文件中写入一些内容。创建目录 /data/images,存入一些图片文件。

其次,打开配置文件,配置文件 server 块中默认包含一些样例,大部分是注释掉的。现在注释掉所有例子,重新开始编写 server 块。

http {
    server {
    }
}

通常来说,配置文件中可能包括几个 server 块,通过监听端口号和服务名称来区分。一旦 Nginx 需要确定用哪一个 server 处理请求,通过匹配请求头部信息中 URI 数据与配置文件 server 块定义的 location 指令。

将下面的 location 块添加到 server 块:

location / {
    root /data/www;
}

上面 location 块指定 “/” 与请求中的 URI 进行比较。为了匹配请求数据,请求路径中需要加入 root 指令中定义的 URI 信息,即 /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://localhost/ 访问。对于以 /images/ 开头 URI 请求的响应,服务器将发送 /data/images 目录的文件。例如,对于 http://localhost/images/example.png 请求,Nginx会发送 /data/images/example.png 文件,如果文件不存在,Nginx发送响应指令为404的错误。对于非以 /images/ 开头的响应,Nginx 会匹配到 /data/www 目录,例如,对于 http://localhost/some/example.html 请求,将发送 /data/www/some/example.html 文件。

使修改配置文件生效,若是 Nginx 服务没有启动,则启动服务,否则发送 reload 信号到 nginx 主进程,通过执行以下命令:

nginx -s reload

如果有些内容未达到期望效果,可以试着从日志文件 access.log 或 error.log 中查找原因,文件在目录 /usr/local/nginx/logs 或 /var/log/nginx 中。

4. 建立一个简单代理服务

nginx长作为一个代理服务器使用,作为一个服务器接收请求、转至被代理的服务器、从被代理服务器返回响应并发送给客户端。

我们来配置一个基本的代理服务器,服务图片请求,文件来自本地目录,其它请求发送到一个代理服务器。在这个例子中,服务器和代理服务器定义在一个 nginx 实例上。

首先,定义代理服务器,通过在配置文件中增加一个 server 块,如下所示:

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

这是一个简单的服务器监听8080端口(之前,自80端口占用之后,listen 指令还未被指定),并把所有请求匹配到 本地文件系统的 /data/up1 目录。创建这个目录并放入 index.html 文件。注意,root 指令放在 server 内,这个 root 指令在 请求匹配的location 块中没有 root 时使用。

其次,使用前面部分 server 配置,把它调整为一个代理服务器。在一个 location 块,添加 proxy_pass 指令,参数部分指定被代理服务器的协议、名称和端口号(我们这里是 http://localhost:8080):

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

我们将修改第二个 location 块,当前匹配前缀为 /images 的请求到 /data/images 目录的文件。为了使它匹配典型的文件扩展请求,做如下调整:

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

参数是正则表达式来匹配所有以 .gif, .jpg 或 .png 结尾的URI,正则表达式以 ~ 开始。符合规则的请求将匹配到 /data/images 目录。

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,见上文。

配置代理服务器更多指令见more

5. 建立 FastCGI 代理

nginx可以用于把请求路径转至 FastCGI 服务器,提供不同框架的应用的运行和不同语言的编程(如 PHP)。

FastCGI 服务器最基本配置包括使用 fastcgi_pass 指令代替 proxy_passfastcgi_param 指令设置参数传输至

FastCGI 服务。假设可以通过 localhost:9000 访问 FastCGI 服务器。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;
   }
}

这将会创建一个服务器,通过 FastCGI 协议 localhost:9000 将除了静态图片之外的所有请求传输至代理服务器。

posted @ 2021-08-13 11:07  Sunflower```  阅读(594)  评论(0)    收藏  举报