幸福日记

nginx初学者向导

nginx有一个主进程和一些工作进程。主进程的作用是读取并解析配置文件并维持其他工作进程,工作进程会去处理请求。nginx采用事件驱动模式与系统依赖机制来高效的将请求分配到工作进程上。工作进程数可以在配置文件中定义,可以是固定的某个值或根据CPU核心数自动适配。
nginx和相关模块的工作方式由配置文件决定。默认情况下,配置文件叫做nginx.conf,该文件位于/usr/local/nginx/conf,/etc/nginx,或/usr/local/etc/nginx.
启动停止服务与重新加载配置文件
执行可执行文件即可启动nginx(window下,双击nginx.exe,linux下使用nginx命令)。一旦nginx启动,可以通过调用-s参数控制nginx,语法如下:

nginx -s signal

signal可以是下列一个值:

例如,停止nginx进程并等待所有工作进程处理完当前的请求可以使用

nginx -s quit

执行该命令的用户需要与启动nginx的用户相同
配置文件中的改动不会立即生效,直到重新加载配置文件或nginx重启。重新加载配置文件命令如下:

nginx -s reload

当nginx主进程接收到重新加载配置文件的信号时,它会检查新的配置文件的语法,并会尝试应用新的配置。如果成功了,nginx主进程会启动新的工作进程,并通知旧的工作进程,让他们关闭。旧的工作进程在收到关闭命令后会停止接受新的连接并会继续处理当前的请求直到所有请求处理完毕,然后旧的工作进程会退出。
可以借助Unix系统的工具如kill命令向nginx进程发送信号,此时信号将会直接通过进程ID发送给进程。nginx的主进程ID默认写在nginx.pid中,该文件位于/usr/local/nginx/logs或/var/run.例如,如果主进程ID为1628,发送QUIT信号让nginx优雅的关闭需要执行:

kill -s QUIT 1628

获取正在运行中的nginx进程的列表,可以用ps命令,例如:

ps -ax | grep nginx

配置文件结构
nginx由定义在配置文件中的指令控制的模块构成。指令分为简单指令和块级指令。简单指令由名称和参数构成,名称与参数之间用空格分开,结尾以英文分号结束。块级指令结构同简单指令,与简单指令不同的是,它是一些被花括号“{}”包裹指令的集合。如果一个块级指令中有其他的指令,则叫做一个上下文(events、http、server及location)。
配置文件中,不在任何上下文中的指令被看做是main上下文,events和https指令在main上下文中,server指令在http上下文中,location在server上下文中。

以“#”开头的行是注释信息
静态内容服务
服务器的一个重要的任务是提供文件(图片或静态html等)。你可以在此实现一个例子,根据请求,文件从不同的本地目录:/data/www(包含html文档)、/data/images(包含图片)获取并提供服务。这需要编辑配置文件,一个http块内包含了一个server块,server块中有两个location块。
首先,创建目录/data/www并放置一个内容任意index.html,创建目录/data/images并放置一些图片。
然后,打开配置文件,默认的配置文件已经包含了几个server块的例子,其中大部分都注释了,现在注释所有的块,并新建一个如下的块:

http {
    server {
    }
}

一般地,配置文件可以包含多个server块,分别定义了监听的端口和主机名称。当nginx决定了使用哪个server块处理请求,它会检测请求头中的URI及参数并匹配到location块上。
在server块中添加一个location块方法如下:

location / {
    root /data/www;
}

location块会将“/”前缀与请求的URI进行比较,对于匹配的请求,URI将会拼接到root指令定义的路径后面,本例中及/data/www,然后在本地文件中找到请求的文件。如果有很多location都能匹配url,则nginx会选择最长的前缀。上面的location定义了最短的前缀,只有一个字符,所以只有其他location都不匹配的时候,这个请求才会被location /匹配。
添加第二个location块:

location /images/ {
    root /data;
}

它将会匹配/images/开头(/也会匹配,但比/images/短)。
整体的配置如下:

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

    location /images/ {
        root /data;
    }
}

以上配置好了一个监听在80端口,可以被本机通过http://localhost访问的服务。以/images/开头的请求,会响应一个从/data/images目录对应的文件。例如,响应http://localhost/images/example.png请求,nginx会发送/data/images/example.png文件,如果文件不存在,则返回404错误。不以/images/开头的URI将会定位到/data/www目录。例如,响应http://localhost/some/example.html请求,nginx会发送/data/www/some/example.html文件。
要应用新的配置文件,需要启动nginx或通过nginx的重新载入命令:

nginx -s reload

如果出现问题,可以尝试在access.log和error.log中找到原因,文件位于/usr/local/nginx/logs 或 /var/log/nginx.
设置一个简单的代理服务器
nginx的常用功能之一是用作代理服务器,接受请求并发送到被代理的服务器上然后把服务器的响应返回给客户端。
我们将要配置一个基础的代理服务器,该服务器对于图片文件会从本地读取,其他请求会发送到被代理的服务器上。本例中,两个服务器都在一个nginx实例中定义。
首先,配置被代理的服务器:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这个服务器监听8080端口(80端口已经占用了),将所有请求定位到本地/data/up1目录。建立此目录并放置index.html。注意,root指令放在server上下文中,location中就不再添加root指令。
然后,将上例中的server修改一下:

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结尾的URI。正则表达式应以~开头。匹配正则表达式的请求会被定位到/data/images目录。
当nginx选择location块时,首先会location块前缀的长度,并记住最长的前缀,然后检测正则表达式。如果有一个请求匹配了正则表达式,则选择该location,否则选择最长前缀的匹配。
最终配置文件如下:

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

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

服务器会过滤所有以.gif、.jpg、及.png的请求,把他们定位到/data/images目录(并将路径后面追加上URI),其他的请求会转发到定义的被代理服务器上(localhost:8080)。
修改完配置文件需要重新载入配置文件才会生效。
设置FastCGI代理
nginx可以FastCGI协议的网关代理服务器,支持应用服务如PHP。
最基础的nginx FastCGI协议网关代理服务器配置使用fastcgi_pass指令。通过fastcgi_param指令设置传给FastCGI服务的参数。支持FastCGI的服务监听localhost:9000端口。在PHP中,SCRIPT_FILENAME参数用于定义script name,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上。

退出移动版