Nginx配置引导

做项目的时候经常需要添加nginx配置,添加个配置无非就是配置下root,指定下index就行了。基本模仿就可以搞定,可以模仿现有的项目或官方的demo。线上的环境要复杂的多,但是通常都是配好的,基本接触不到。

然后能力就定格在可以快速配置项目,大概能猜出每个语句的意思。但是细节性的配置需要搜索,有时候还掉坑。

所以这两天就翻了翻nginx的文档,看了官方的引导,做了个翻译。

下文翻译自Nginx Beginner’s Guide,仅供参考。

初学者引导

该引导简单介绍nginx,以及用他来完成一些简单的任务。首先你应该已经安装了nginx。

该引导会讲述如何启动和关闭nginx,如何重载配置文件,解释配置文件的结构,如何启动nginx来解析静态文件,如何用nginx做代理服务,如何用它来连接FastCGI应用。

nginx有一个master进程和多个worker进程。master进程的主要作用是读取和检测配置,管理worker进程。worker进程做实际的请求处理。nginx采用基于事件的模型以及依赖操作系统的机制有效的在worker进程间分发请求。worker进程的数量定义在配置文件中,可以使用固定的数值,或者自动调节为可用CPU内核数。

nginx和他的模块的工作方式定义在配置文件中,默认配置文件为nginx.conf,放置在/usr/local/nxinx/conf,或者/usr/local/etc/nginx里面。(注:这个根据安装的方法自行判断,例如yum安装的nginx,配置文件在/etc/nginx下面)

开启,停止,重载配置

运行可执行文件来开启nginx(也就是nginx命令了)。启动后可以使用-s参数调用nginx命令来控制nginx。使用下面的语法:

nginx -s signal

可使用的signal:

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

例如,等待worker进程处理完当前的请求就停止nginx,使用如下命令:

nginx -s quit

# 执行这个命令的用户应该和启动nginx的用户一样

配置文件做了修改,不会生效,直到下面这个命令来重载配置,或者重启。重载配置如下:

nginx -s reload

一旦master进程接收到重载配置的信号,他会检查配置文件的语法并应用配置,如果成功了,master进程会开启新的worker进程并且发消息给旧的worker进程,让他们停止。否则,master进程回滚修改,继续用旧的配置文件工作。 旧的worker进程接收到停止的命令后,停止接收新的连接,继续处理完当前的请求,直到所有的此类请求完成,旧的worker进程停止。

发送给nginx进程的信号也可以借用Unix工具的帮助。在这种情况下,信号直接发送给进程的进程ID。nginx的master进程的进程ID有被记录,默认放在/usr/local/nginx/logs/var/run下的nginx.pid里面。例如,如果master的进程ID是1628,发送QUIT信号来让nginx优雅的停止,如下:

kill -s QUIT 1628

列出nginx所有的进程,可以使用ps:

ps -ax | grep nginx

配置文件结构

nginx由模块组成,他们被配置文件中的指令控制。指令被分为简单指令和块指令。简单指令由名字和空格分割的参数以及结尾的分号组成。块指令和简单指令一样,但是他不是以分号结束,而是以大括号包围的一组附加指令结束的。如果一个块指令的大括号里面有其他指令,他被成为上下文。例如:events,http,server,location。

配置文件中在任何上下文之外的部分是main上下文,events和http指令在main里面,server在http里面,location在server里面

剩余的在#号后面的列为注释。

解析静态内容

web服务一个任务是解析提供文件(例如图片,静态html页面)。我们将实现一个例子,根据请求,从不同的本地目录返回文件:/data/www提供html文件,/data/images提供图片。这需要编辑配置文件,http里面添加一个server,server里面放两个location。

首先创建/data/www目录,放一个index.html进去。然后创建/data/images目录并放一些图片。

接下来,打开配置文件,默认的配置文件已经包含几个示例的server块。现在注释所有的server块,然后添加一个新的server块:

http {
    server {
    }
}

通常配置文件里面都包含几个server块,通过监听的端口和server name区分。一旦nginx决定哪个server处理请求,他会根据server块内的location指令的参数来测试请求头中的URI。

简单说一下server_name,他的参数也支持正则表达式,与location不同的是,server_name会优先选择确切匹配的,而不是正则表达式。 nginx会通过请求头中的Host来和这个指令的参数进行匹配,如果都没有匹配会走端口匹配的第一个server,也即端口的优先级更高。 可以显式的在listen指令后面添加default_server参数来指定默认server。 详细关于server_name信息可以看这里。

在server块中添加location块:

location / {
    root /data/www;
}

这个location块指定/前缀来和URI进行比较,对于匹配的请求,URI将被添加到root指令的路径后面,这里是/data/www,组成请求文件的本地文件系统的路径。如果有几个location块都能匹配,nginx会选择前缀最长的一个。前面的location块提供了最短的前缀,长度是1,所以,如果其他的location块都没有匹配,就会用它。

下一步,添加第二个location块:

location /images/ {
    root /data;
}

他会匹配以/images/开头的请求。(location /也会匹配,但是/images/前缀更长)

现在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的响应。URI不是以/images/开头的请求将被映射到/data/www目录。例如,响应http://localhost/some/example.html请求,nginx会读取/data/www/some/example.html文件。

为了应用新的配置,启动nginx或发送reload信号给nginx的master进程,执行:

nginx -s reload

# 有些情况可能有问题,可以通过查看/usr/local/nginx/logs或/var/log/nginx下的access.log和error.log

设置成简单的代理服务器

nginx的一个很常用的功能是用作代理服务,也就是接收请求,转发到被代理的服务,回收响应并发送到客户端。

我们将配置一个基础的代理服务,它将解析图片到本地目录,发送所有其他请求到被代理服务。在这个例子中,两个服务都运行在一个nginx实例上。

首先,通过添加一个server块到配置文件来定义被代理服务:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这就是一个简单的服务,监听8080端口(之前的配置,因为使用了标准的80端口,所以没有指定listen指令),并且将所有符合的请求映射到本地的/data/up1目录。创建这个目录,放一个index.html进去。注意,root指令放置在server上下文,当被选择的localtion块没有自己的root指令的时候,这里的root指令才会被应用

下一步,使用之前解析静态文件那个server配置来做代理,在第一个location块里,放上proxy_pass指令,值为被代理的协议,名字和端口。(在这是http://location:8080

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

    location /images/ {
        root /data;
    }
}

我们将修改第二个loaction块,当前是映射带有/images/前缀的请求到本地/data/images目录,为了能能用文件后缀匹配图片,我们修改location为这样:

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

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

当nginx选择location块解析请求的时候,他首先检查特定前缀的location指令(即,非正则表达式),记住有最长前缀的location指令,然后检查正则表达式,如果匹配到了正则表达式,nginx选择此location,否则选择之前记住的location。(优先级是正则表达式 > 普通表达式)

现在配置是这样的:

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

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

这个服务将匹配所有以.gif,.jpg,.png结尾的请求,映射他们到/data/images目录(会添加上root指令的参数)并且其他所有的将被转发到被代理的服务上。

通过发送reload信号给nginx来使配置生效。

设置为FastCGI代理

nginx能被用来路由请求到FastCGI服务,这些服务运行着各种框架和语言构建的应用,例如PHP。

最基本的用来做FastCGI的nginx配置包括替换proxy_pass指令为fastcgi_pass指令,fastcgi_param指令来设转发给FastCGI的参数。假设FastCGI服务可以通过localhost:9000访问,替换掉之前章节的配置的proxy_pass指令为fastcgi_pass指令,改变他的参数为localhost:9000在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的代理服务。

(完)