nginx Beginner’s Guide

这个引导给nginx做了一个基本的介绍,并描述了nginx可以做的一些基本事情。 假设nginx已经安装在了读者的电脑上,如果没有请查看官网安装页。 这个引导描述了怎么去开始和结束nginx,从新加载他的配置文件,解释配置文件的结构,描述了怎么启动nginx作为静态内容服务器,怎么配置nginx作为代理服务器。以及FastCGI程序怎样连接nginx等等。

nginx具有一个主进程,几个子进程。主进程的主要目的是读取以及评估配置文件,维护子进程。子进程才负责真正的请求处理。nginx采用基于事件的模型以及操作系统依赖性机制,在子进程之间能够有效的分配请求。子进程的数量被定义在配置文件里,可以通过修改配置文件来修改他,或者是自动依赖机器可用的CPU个数。具体请看worker_processes.

nginx以及他使用的模块的工作方式定义在配置文件里。默认配置文件被命名为nginx.conf,被放置在目录/usr/local/nginx/conf/etc/nginx, 或/usr/local/etc/nginx下。

Starting, Stopping, and Reloading Configuration

通过运行可执行文件来启动nginx。一旦nginx被启动。可以通过调用可执行参数-s来控制。使用下面的语法:

nginx -s signal

常用的signal有如下几种:

  • stop -- 快速停止
  • quit -- 优雅的停止
  • reload -- 重新加载配置文件
  • reopen -- 重新打开log文件

例如,等到子进程中当前请求结束后在停止子进程,可以执行下面的命令:

nginx -s quit

这个命令应该运行在和启动nginx命令同一个用户下。

对配置文件的改变直到重新加载配置文件命令,或者是重启命令才回生效。重新加载配置文件命令:

nginx -s reload

一旦主进程收到重新加载配置文件的命令,首先检查新配置文件的正确性,然后试着执行配置文件里面提供的内容。一旦配置文件成功,主进程启动新的工作进程(子进程),并发送消息给老的工作进程,让他们停止运行。否则主进程回滚配置文件的变化,继续和老的工作进程一起工作。老的工作进程,获取命令停止,结束接收新的连接并继续完成当前请求直到所有的请求被处理了,然后,工作进程退出。

一个命令(新号)也可以通过Unix工具的帮助来发送给nginx进程,例如kill命令工具。这个例子下一个进程通过进程id直接发送给的进程。nginx主进程的进程id默认情况下被写入到nginx.pid中。在目录: /usr/local/nginx/logs或者是 /var/run下。例如,如果主进程的id是1628,发送QUIT命令可以是nginx优雅退出:

kill -s QUIT 1628

可以通过ps命令来获取所有运行的nginx进程,例如:

ps -ax | grep nginx

更多的消息以及发送给nginx的命令如下:Controlling nginx

Configuration File’s Structure

nginx是有模块组成,这些模块的控制指令被指定在配置文件里。指令分为简单指令和块指令。简单的指令包含名字,参数并且被空格分开,以";"结尾。一个块级指令和简单指令有同样的结构,他们以一个额外的被{和}包围的集合结构作为结尾,。如果一个块命令里面还包含以{和}结束的命令,他们被称为上下文环境(例如:eventshttpserverlocation)。

放置在配置文件以外的任何上下文的指令都被认为是在主上下文中,events and http指令在主上下文中,server在http中,location在server中。#后的内容被认为是注释。

Serving Static Content

一个主要的web服务任务就是提供文件服务。例如图片,静态HTML文件。你将实现一个实例,返回的内容取决与请求,请求的文件将会从不同的本地目录:/data/www(可能包含HTML文件)/data/images(包含图片)中获取。要实现这样我们就需要编辑配置文件,在http 块中设置server,在server块中设置两个location块。

首先,创建/data/www目录,把一个index.html文件放入其中,文件中写入写文本内容。创建/data/images目录,放置一些图片在其中。

接下来,打开配置文件,默认配置文件里面已经包含了一些server块的例子。现在注释所有这些块并启动一个新的服务器块。

http {
    server {
    }
}

通常,配置文件可能会包含几个server块,这些server块通过他们监听(listen)的端口号以及服务器的名字(server names)来区分。一旦nginx决定了那个服务进程被请求了,nginx就会拿server块中的location指令与请求头中指定的URI进行匹配。添加下面的location块到server块中。

location / {
    root /data/www;
}

这个location块中指定的"/"前缀会和请求的URI做对比。对于匹配的请求,URI将会被添加到root指定的指令路径中。也就是,添加到/data/www中,构成了请求nginx本地文件系统的请求文件路径。如果有若干个匹配的location块,nginx会选择最长前缀的那个。上面的location模块提供了最短前缀(长度为1)。只有当所有的其他的location块匹配错误,这个块才会被使用。

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

location /images/ {
    root /data;
}

上面是对于一个请求的匹配,开始是/images/(location / 也匹配这个请求,但是前缀比较少)

server块的配置结果应该是下面这样的:

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

    location /images/ {
        root /data;
    }
}

现在已经有了一个监听标准80端口的运行的nginx服务器的配置文件,并且在本地机器上提供http://localhost/访问。对于开始是/images/请求的URI,nginx将会从/data/images目录下发送文,来作为回复。例如,作为对请求http://localhost/images/example.png的回复,nginx将会发送/data/images/example.png文件作为回复。如果这个文件不存在,nginx将会发送404错误作为回复。请求的URIs如果不是以/images开始的将会映射到/data/www目录下。例如:作为对http://localhost/some/example.html请求的应答,nginx将会发送/data/www/some/example.html文件。

为了提供最新的配置文件,如果还没启动nginx,可以启动,如果启动了nginx可以通过重新加载命令:

nginx -s reload

一些情况下程序运行并不在我们的预期,但是我们可以从access.log和error.log中找到原因。前面两个log文件所在的目录是: /usr/local/nginx/logs 或 /var/log/nginx

Setting Up a Simple Proxy Server

nginx一个常见用法就是作为代理服务器,也就意味着nginx服务接收客户端的请求,并把请求传递给被代理的服务器,从被代理的服务器获得响应,并把响应的内容发给客户端。

我们将会配置一个基础的代理服务器,这个nginx代理服务器接收来自对nginx本地图片文件的访问,并且把其他的请求转发给被代理的服务器。在这个例子中,两个服务将不会被定义在一个简单的nginx实例中。

首先,在nginx的配置文件里添加一个或者多个server块来定义被代理的服务器。内容如下:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这是一个监听放在8080端口的简单服务(前面例子中我们并没有使用listen指令来指定端口信息,因为服务已经使用了默认的标准的http接口80)并映射所有的请求到本地的/data/up1目录下。创建这个目录,在其中添加index.html文件。注意root指令放置在server中的上下文环境。当为服务请求选择的location块不包含自己的root指令时,此时root指令才被使用。

接下来,使用上一章的服务配置,修改配置文件使他作为一个代理服务。在第一个location块中,在proxy_pass指令中配置被代理的服务器协议,域名,端口号,这些在参数中指定(在这个例子中是http://localhost:8080)

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

    location /images/ {
        root /data;
    }
}

我们来修改第二个location块,他匹配带有/images前缀的请求,请求的文件在/data/imges目录下,为了匹配一些典型的图片文件扩展名的请求,修改location块如下:

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

这个参数是一个正则表达式通常代表匹配以.gif,.jpg,.png结尾的请求。一个正则表达式前面应该加上~。相应的请求应该映射到/data/images目录里。

当nginx在选择一个location指令为请求提供服务的时候,他首先检查location指令的前缀,使用最长前缀来记录位置,然后检查正则表达式,如果有一个匹配正则表达式,nginx选中这个location,否则nginx会选择以前记录的那个。

代理的配置结果想如下这样:

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

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

这个服务将会过滤** .gif, .jpg, or .png**的请求,并且把请求映射到/data/images目录下(通过添加URI到root指令参数中)。传递其他的请求到配置文件中的代理服务中。

使这个配置文件生效,只需要像前面章节说的发送一个reload 指令给nginx就可以了。

这里有关于指令的更多信息,方便以后在配置代理连接的时候使用。

Setting Up FastCGI Proxying

nginx can be used to route requests to FastCGI servers which run applications built with various frameworks and programming languages such as PHP.

The most basic nginx configuration to work with a FastCGI server includes using the fastcgipass directive instead of the proxypass directive, and fastcgiparam directives to set parameters passed to a FastCGI server. Suppose the FastCGI server is accessible on localhost:9000. Taking the proxy configuration from the previous section as a basis, replace the proxypass directive with the fastcgipass directive and change the parameter to localhost:9000. In PHP, the SCRIPTFILENAME parameter is used for determining the script name, and the QUERY_STRING parameter is used to pass request parameters. The resulting configuration would be:

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;
    }
}

This will set up a server that will route all requests except for requests for static images to the proxied server operating on localhost:9000 through the FastCGI protocol.

翻译自:http://nginx.org/en/docs/beginners_guide.html

原文地址:https://www.cnblogs.com/duhuo/p/4909350.html