Nginx Beginners Guide

75 阅读6分钟

Starting, Stopping, and Reloading Configuration

执行可执行文件启动Nginx。Nginx启动后,用-s参数执行可执行文件,使用类似下面的命令:

nginx -s signal

signal可以是下面的其中之一:

  • stop — fast shutdown
  • quit — graceful shutdown
  • reload — reloading the configuration file
  • reopen — reopening the log files

例如:如果需要等待worker processes处理完请求再结束nginx进程,需要执行的命令将是:

nginx -s quit

执行这个命令的用户需要与启动nginx的是同一用户

配置文件的更改需要执行nginx命令重载配置或者重启nginx才能被应用

nginx -s reload

一旦nginx的master process收到了重载配置文件的信号,它会检查新的配置文件语法是否正确以及尝试应用配置文件中的配置。master进程成功应用配置后,会启动新的worker进程以及发送信息让旧的worker进程关闭。否则,master进程会回滚配置的变更并且继续使用旧配置工作。旧worker进程收到让它们关闭的命令后,会拒绝建立新的连接,在处理完当前所有的请求后进行关闭。

Unix工具,类似于kill之类的命令也可以发送信号给nginx进程。以kill命令为例,它给nginx进程直接发送带着prcess ID的信号(signal)给nginx进程。nginx的master进程ID默认保存在/usr/local/nginx/logs/var/run的nginx.pid中。 举个例子: 如果master进程ID为1628,那么需要让nginx以graceful的形式关闭时,需要执行:

kill -s QUIT 1628

如果要获取nginx的所有进程,可能需要用到ps命令:

ps -ax | grep nginx

For more information on sending signals to nginx, see Controlling nginx.

配置文件的结构

nginx由数个由在配置文件中指定的指令所控制的模块组成。指令分为简单的指令和块指令(block 指令),简单的指令包含由空格分割以及使用;结尾的name和parameters,块指令拥有和简单指令一样的结构,终止符号由{}代替。如果块指令有其他指令在它的括号内,就被称为上下文(context),例如:events,httpserver, and location

配置文件中不在context中的指令需要被放在main context中。events和http在main context中,server在http中,location在sever中。

#后的部份则为注释。

Serving Static Content

web服务器一个重要的任务就是提供文件,例如image、static、HTML pages。下面将实现一个示例,根据请求,从不同的本地目录中提供文件:/data/www(可能包含HTML文件)和/data/images(包含图像)。

这将需要编辑配置文件,设置在http block里面的server block,并且这个server block包含着两个location block。

首先,需要创建/data/www目录,并且在这个目录中放一个包含着任意内容的index.html,以及创建一个/data/image目录,并在里面放一些image文件

创建一个新的server block:

http { 
    server { 
    } 
}

通常,配置文件可能包含数个由监听端口和server name区分开的server block。 一旦nginx确定了处理请求的server,nginx会测试定义在请求头的URI和server block中的location指令中的parameters是否匹配。

添加以下的location block到server block中:

location / {
    root /data/www;
}

locationblock定义了一个"/"前缀来与请求中的URI做比较。对于匹配的请求,请求头中的URI会被添加到root指令中指定的路径中,即/data/www,组成本地文件系统中所请求文件的路径。如果有数个location block都匹配URI的话,选择匹配的最长前缀那个。以上的location block只提供了长度为1的前缀匹配,所以只有其他所有location block都匹配不上的时候,才会使用这个location block进行匹配

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

location /images/ {
    root /data;
}

它将会匹配URI由/images开头的请求(location / 也可以匹配,但是它的前缀比较短,优先级比较低)

最终的配置文件会如下所示:

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

这已经是一个可以监听标准80端口的服务使用的配置文件,并且在本地机器上可以通过http://localhost 访问到。对于URI为/images/开头的请求,服务器将使用/data/image文件夹下的文件进行响应。例如,http://localhost/images/example.png 请求,nginx将发送/data/images/examples.png 文件进行响应。如果这个文件不存在的话,nginx会返回一个声明404错误的响应。不由/images开头的请求,将会被影射到/data/www目录。例如,http://localhost/some/example.html 请求,nginx将会返回/data/www/some/example.html文件。

需要应用最新的配置文件的话,启动nginx后执行以下指令,发送reload信号给nginx master进程:

nginx -s reload

In case something does not work as expected, you may try to find out the reason in access.log anderror.log files in the directory /usr/local/nginx/logs or /var/log/nginx.

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

nginx最常的用法之一就是被用来设置为代理服务,被用作代理服务的时候,nginx接收请求并传递到被代理的服务器中,再从被代理服务器接收响应,传给客户端

我们会配置一个最基础的代理服务,用来处理对服务器本地图片的请求,并把其余请求转发到被代理的服务器上。在这个例子中,所有服务器都会被定义为一个nginx实例

首先,添加一个或多个server块以及下列内容到nginx的配置文件中,

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将会是个坚听8080端口的简单服务(在前面的例子中,没有指定listen指令,是因为使用了标准的80端口),匹配所有请求本地文件系统/data/up1目录的请求。创建这个目录,并且将indexl.html放到里面。记住root指令是放到server context中的。当没有root指令的location块被用来处理请求时,外部的root就会被用到

接下来,使用之前章节的server配置,并将其改为代理服务的server配置。首先,在第一个location块,放入带有被代理服务的协议、名字和端口的proxy_pass指令,被代理服务的协议、名字和端口被定义在参数中。在我们的例子中是:http://localhost:8080

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

我们将定义第二个location块,第二个location块将把带/images前缀的请求和/data/images 目录进行匹配,并且还会将这个请求与带有特定文件后缀的图片匹配。这个location块将会和如下一样:

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