Nginx上手指南

简介

通过几个基本的任务介绍Nginx的基本使用方法。在阅读之前请先安装Nginx。本文将简要介绍Nginx启动、停止、加载配置文件的方法,介绍配置文件的基本结构,最后介绍如何通过配置文件实现静态文件服务、反向代理服务以及如何结合使用FastCGI应用。

Nginx在工作时,有一个主进程以及多个工作进程。主进程的作用主要时管理、加载、分配配置文件,以及管理、调度所有工作进程。工作进程则主要用来处理外部的请求。Nginx使用基于事件的模型,并且依靠操作系统的底层机制来高效的为工作进程分配任务。工作进程的数量可以通过配置文件制定,也可以根据当前CPU的核心数量以及计算能力有Nginx自动分配(worker_processes )。

Nginx及其各个模块的工作方式通过配置文件来确定。默认情况下配置文件被命名为 nginx.conf。一般存在于/usr/local/nginx/conf/etc/nginx /usr/local/etc/nginx 路径下。

启动、停止及加载配置

可以通过安装之后的可执行文件来启动nginx。例如我通过apt-get安装Nginx,可以直接在具备权限的环境中输入 nginx命令 即可启动 Nginx。启动之后我们可以通过 -s指令来控制Nginx的行为。主要命令有:

  1. stop——快速停机。
  2. quit——安全停机。
  3. reload——从新加载配置文件(不用停机)。
  4. reopen——从新开启日志文件。

quit命令用来安全停机,当输入

nginx -s quit

之后。nginx不在接收外部请求,但是他会等待每一个已经开始工作的工作进程处理完任务之后再停机。

nginx -s reload

用来加载配置文件,并根据配置文件的内容来从新分配工作进程。如果主进程接收到reload的指令,它会首先检查配置文件语法的有效性,然后开始尝试将配置文件的内容部署当运行环境中——主进程会使用新的配置属性来启动新的进程,然后将停止的信号发送给旧进程。这些旧进程一旦处理完当前任务,就会自动推出。如果尝试部署配置文件的过程出现问题,主进程将会回滚到之前的配置文件,并继续使用旧配置文件工作。

当然除了使用Nginx相关的命令,还可以直接使用UNIX的指令来控制进程,比如kill命令。在Nginx工作时,我们可以在/usr/local/nginx/logs或/var/run路径下找到nginx.pid文件,可以通过他了解Nginx进程被分配的进程ID。还可以通过

ps -ax | grep nginx

了解Nginx的情况,需要了解更多的Nginx控制方法请查看这里。

配置文件结构

Nginx由多个模块组成,模块的行为主要由配置文件中的指令来指定。指令分为简单指令和块指令,简单指令由key和value组成,key和value之间由 符号分割。块指令和简单指令一样,也是由key和value构成,不过块指令的value部分是一个用 {} 符号包含起来的块。如果块指令中还包含其他指令,我们将其称之为上下文(context)。在Nginx中常见的上下文有 eventshttpserver 和 location。如果一个指令没有包含在任何上下文中,那么认为他输入main上下文(main context),例如eventshttp属于main上下文、server属于http上下文,location则属于server上下文。此外#之后的内容表示为注释,用于附加说明。

我使用的是apt-get安装,Nginx被安装在/etc/nginx下,其他方式的安装可能略有区别。在nginx的安装目录中配置文件的入口是nginx.conf,打开后可以看到已经配置了基础的http块:

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #记录日志的格式,这里用到了代理协议和IP_REAL模块的参数
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

配置文件通过include指令引入了更多的配置文件,被放置在/etc/nginx/conf.d/路径下,文件后缀为 .conf。打开对应的路径只有一个default.conf文件,里面对server块进行了简单的配置:

server {
    #监听端口
    listen       80;
    #服务名称
    server_name  localhost;
    #路由配置
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

后面的案例主要是针对这个server块进行修改。

静态服务器

Nginx的一项重要功能是提供静态资源服务,静态资源包括html页面,js、css文件,以及图片等。下面的案例将通过路径配置,实现HTML页面服务以及图片服务。

下面的例子将页面文件放置在/data/www路径下,把图片资源放置在/data/images路径下。http上下文中的server块中的location指令用于配置静态资源服务,其结构为:

http{
   server{
       location /{
          #
       }
   }
}

配置文件中可以包含多个server块,每个块可以定义不同的端口、域名、请求头以及一些正则表达式的规则。Nginx会根据配置的规则以及请求的参数来确定使用哪个server来响应当前的请求。

 我们将location定义为以下样式:

location / {
    #映射路径
    root /data/www;
}

location块以一个 “/” 参数开始,他表示URL中前缀为"/"的请求都会由这个location处理。块中的root指令表示静态资源文件是在磁盘系统中,路径为 /data/www 。

然后再专门定义一个用来处理/images/请求的路径:

location /images/ {
    #映射路径
    root /data;
}

这个时候,整个server的定义看起来是这样的:

#server根据URL映射不同的路径
server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

然后执行

nginx -s reload

重新加载配置文件。此时当我们访问80端口时(http://localhost/)会映射到/data/www读取index.html文件。当我们的URL为/images/myImg.png时,会到/data/images/路径下去读取 myImg.png文件。

Nginx的路径匹配遵循最长匹配原则,所以当出现/images/在URL中时会匹配到第二个location,而不会去匹配第一个。如果我们输入的路径是 http://localhost/some/example.html。那么匹配的文件是 /data/www/some/example.html。

在运行过程中出现任何问题,到 /usr/local/nginx/logs 或 /var/log/nginx 路径下查看 access.log 和 error.log 排查问题。

 代理服务

比静态资源服务更常用的功能就是代理服务功能。简单的说就是接收外部发送的请求,然后根据一定的规则将这些需求转发给指定的服务,然后等待服务的响应并返回给发送请求的客户端。下面的案例将会配置一个简单的Nginx代理服务。

首先在上文的基础上增加一个监听8080端口的虚拟主机(server):

server {
    #监听8080端口
    listen 8080;
    #将root指令直接写在server中
    root /data/up1;

    location / {
    }
}

这个虚拟服务器将所有获取的请求都转发到磁盘路径 /data/up1 上,我们在这个路径下放置一个index.html文件以验证效果。应该注意到,这里的root指令直接写在server块中,而前面的root指令是写在location中的,这样的意义是当不需要多个location交替工作时,可以直接将所有请求映射到对应的路径中去。

然后,我们再配置代理服务。代理服务通过 proxy_pass 指令来实现。我们修改前文例子中的配置:

server {
    #将请求映射到8080端口
    location / {
        proxy_pass http://localhost:8080;
    }
    #匹配/images/规则的映射到/data/路径下。
    location /images/ {
        root /data;
    }
}

然后将第二个location块的配置进行一些优化,让所有的图片后缀都映射到存放图片的目录。通常使用正则表达式来实现这个功能:

#适配对应的图片后缀
location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

在Nginx中正则表达以 ~ 开头。上面的配置会将对应的图片请求转发到 /data/images/路径下。

前面已经提到Nginx的匹配规则称为“前缀最长匹配规则”,在融合正则表达式后,他的匹配过程是:

  1. 如果有多个location配置,当获取一个请求时会优先从最长的字符串匹配起,并记录匹配的位置。
  2. 然后再检查正则表达式是否匹配。如果正则表达式匹配则使用该正则对于的location提供服务,如果没有正则匹配上,则使用之前记录的位置。

 最后,修改之后的配置结构如下:

server {
    #代理服务
    location / {
        proxy_pass http://localhost:8080/;
    }

    #静态图片服务
    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

此时,当后缀为git、jpg、png的请求时,会直接访问本地磁盘路径 /data/images/去查找对应的图片。而其他请求则会转发给本机的8080端口,然后通过前面的虚拟主机访问本地 /data/up1/ 路径获取对应文件。

猜你喜欢

转载自my.oschina.net/chkui/blog/1793131