nginx 初学者指南

前言

这个指南会给出一个基本的介绍并且描述一些简单可实现的任务。本指南会描述如何启动、停止nginx还有重新加载配置文件,解释配置文件的结构并描述如何去服务静态资源,怎样配置为代理服务器,及如何连接nginx和一个FastCGI应用。
nginx有一个主进程(master process)和好几个工作进程(worker processes)。主进程的主要目的是读取和解析配置,维护工作进程。工作进程做实际的处理请求工作。nginx使用了基于事件模型和依赖操作系统的机制在工作进程之间高效的分发请求。工作进程的数量在配置文件中指定,可能是固定数量的,也可能是根据CPU cores动态调整的。
nginx和它的模块工作由配置文件决定。默认的,配置文件名字是nginx.conf,位于文件夹/usr/local/nginx/conf,/etc/nginx,/usr/local/et/nginx。

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

为了启动nginx,需要运行可执行文件。一旦nginx启动了,可以通过执行传入参数为-s参数的可执行文件,来控制它。使用语法如下

nginx -s signal

signal可能是以下值:

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

例如,为了停止nginx进程,这个进程要等待工作进程结束服务当前的请求,那么就可以这样写

nginx -s quit

对配置文件做了改动不会立刻应用,只有重新加载配置文件或者重启,重新加载配置文件的命令是

nginx -s reload

一旦主进程收到重新加载配置文件的信号,它会check新配置文件的语法合法性并试图去应用新配置文件。如果成功了,那么主进程会启动新的工作进程并且发送消息给老的工作进程,请求他们关闭。否则,主进程就回滚修改,继续使用老的配置工作。老的工作进程收到停止命令,会停止接收新的connections,继续服务当前请求直到处理完。以上结束后,工作进程会退出。

使用Unix命令,比如kill,也能给nginx进程发信号。这种情况下,信号会直接发送给对应Process ID的进程。nginx主进程的进程号默认会写入到nginx.pid,位于/usr/local/nginx/logs或者/var/run。例如如果主进程号是1628,为了发送QUIT信号以便nginx优雅关机,执行

kill -s QUIT 1628

为了得到所有执行的nginx进程列表,经常使用ps命令,比如

ps -ax | grep nginx

配置文件的结构

nginx包含了很多模块,这些模块由在配置文件中指定的指令控制。指令被分为简单指令块指令。一个简单的指令包含由空格分隔的名字(name)参数(parameters),每条指令以分号(semicolon)结尾块指令有简单指令一样的结构,但它不以分号结尾,它由**大括号{ }(braces)**围绕的指示符结尾。如果一个块指令的大括号内有其它指令,这些块指令成为上下文context(比如,events、http、server、location)。
在配置文件中的指令,不在任何上下文中,我们认为它在主上下文中(main context)。events和http指定就在main context,server在http上下文中,location在server上下文中。

服务静态资源

一个重要的web server task是服务外部文件(比如图片、静态html页面)。你将要实现一个例子,根据请求,文件会从不同的本地文件夹/data/www(包涵HTML文件)和/data/images(包含图片)提供。这会要求编辑配置文件和在http block中设置一个server block,使用两个location blocks。

第一,创建一个/data/www文件夹,把index.html文件放入,index.html中可以写任何内容。创建/data/images文件夹,放入一些图片。
第二,打开配置文件。默认的配置文件已经几个server block的例子,大多数情况下,大多数情况下已经被注释掉。现在,注释掉这些block,创建一个新的server block

http {
    server {
    }
}

一般来说,配置文件也许包涵几个server blocks,这些块通过端口和server names来区分。当nginx决定使用哪个server处理请求时,它会拿测试请求header中的URI与locaton指定的parameters(locaton指令在server块中定义)比较。
增加下边的location块到server块中:

location / {
    root /data/www;
}

location块指定了“/”前缀,这个前缀会与请求中的URI作比较。对于匹配的请求,URI会被加入到root directive指定的路径/data/www,以便组成请求本地文件系统的路径。如果有好几个匹配的location block,nginx选择最长前缀的那个块。上边例子中的locaton 块提供了最短的前缀,长度是1,因此如果其他所有location block不能匹配,会使用这个块。
接下来,增加第二个location block

location /images/ {
    root /data;
}

它会匹配以/images/开头的请求,location /也会匹配这些请求,但是有更短的前缀。
server block的配置结果应该像下边这样:

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

    location /images/ {
        root /data;
    }
}

这已经是一个server的工作配置,监听标准的80端口,并且在本机机器上 http://localhost/ 可达。对以/images/开头的URI响应,server会发送来自/data/images文件夹的文件。例如,对于http://localhost/images/example.png请求,nginx会发送/data/images/example.png文件。如果这个文件不存在,nginx会发送一个404的response error。不以/images/请求URI开头的请求会被映射到/data/www文件夹。例如,http://localhost/some/example.html的请求,nginx会发送/data/www/some/example.html文件。
为了应用新的配置,如果nginx没有启动,那么就启动否则给nginx的主进程,发送reload信号,执行:

nginx -s reload

有些时候,事情并不会像预期的那样发展,你也许试图去access.log和error.log(位于 /usr/local/nginx/logs or /var/log/nginx.)查找原因。

设置一个简单的proxy server

nginx一个最常用的用法就是把它设置为一个proxy server,proxy server意味着一个server,这个server可以接收请求,把请求传送给proxied server,之后从proxied server获取响应,之后把响应发送给客户端。
第一,通过再增加一个server block到配置文件定义proxied server,内容如下:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将会是一个简单server,监听8080端口(之前,listen directive没指定,因为使用了标准80端口),之后映射到所有请求到本地文件系统的/data/up1文件夹。创建这个文件夹,将index.html放进去。注意,root directive放在server context。当location bock没有自己的root directive,这样的root directive就会被用。

接下来,使用上一个块的server configuration,并修改它,使它成为一个proxy server配置。在第一个location 块,放上proxy_pass directive带着proxied server的协议、名字和端口,我们的情况下就是http://localhost:8080,

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

    location /images/ {
        root /data;
    }
}

我们将会修改第二个location 块,当前映射了以/images为前缀的请求到/data/images文件夹下的文件,以使它匹配默认图片后缀的请求。修改后的location 块像下边这样:
location ~ .(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个标准的正则表达式,匹配所有的以.gif,.jpg,.png结尾的URIs。一个标准的正则表达式应该以~开头。相应的请求会映射到/data/images文件夹。
当nginx选择location block去服务一个请求,它首先会check locaton directives,那些制定了前缀、记住有最长前缀的location,之后check正则表达式。如果有一个匹配,nginx会使用这个匹配的location,否则,则使用稍早记住的那个。
proxy server的配置结果类似这样:

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

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

server会过滤以.gif,.jpg,.png结尾的请求,映射它到/data/images文件夹(通过增加URI到root 指令的参数),传入所有其他请求到proxied server。
为了应用最新配置,发送reload信号到nginx就像上一个章节描述的。

设置FastCGI Proxying

本章节暂不翻译

原文出处

Beginner’s Guide

发布了336 篇原创文章 · 获赞 369 · 访问量 193万+

猜你喜欢

转载自blog.csdn.net/wangjun5159/article/details/90311543