首页 > 技术文章 > nginx使用与配置入门指南

byeyear 2019-11-22 20:23 原文

这是一篇关于nginx使用与配置的入门指南,但不包括nginx的编译与安装。我假定你知晓如何安装nginx。对大多数Linux系统来说,nginx都已经存在于它们的软件包里,直接使用系统提供的软件管理工具安装即可。

nginx根据配置文件决定如何工作。配置文件的目录一般可能在以下几个位置:/usr/local/nginx/conf, /etc/nginx, /usr/local/etc/nginx。

启动,停止和重读配置文件

直接运行执行文件就可以启动nginx了。启动后,可通过-s参数控制它:

nginx -s signal

这个signal和Linux系统里的signal不是一回事。它可取以下几个值:

  • stop - 快速关闭
  • quit - 妥善关闭
  • reload - 重读配置文件
  • reopen - 重新打开日志文件

stop和quit的区别在于,quit会等待当前正在进行的所有服务完成后才退出。

如果你修改了配置文件,可以通过下面的命令让nginx重读配置:

nginx -s reload

在这条命令之后,对每一个新的请求,都将使用新的配置文件,而该命令前未完成的请求仍使用已有配置。

静态内容服务配置

nginx安装好后,已经提供了默认的配置文件。观察默认的配置文件我们可以发现,它是由嵌套的配置块组成,每个配置块都由一对大括号标记。最醒目的就是server块,用于标记一个服务器:

server {
    listen 80;                             # 监听端口。一行以分号结尾;注释标记与bash一样
    server www.example.com;  # 网站名称
}

现在nginx知道对于服务器www.example.com:80要使用上面的server块,但还不知道如何解析URI。我们在server块内部添加location块:

server {
    listen 80;                             # 监听端口。一行以分号结尾;注释标记与bash一样
    server www.example.com;  # 网站名称
    location / {
        root /data/www
    }
}

nginx比较location后面的内容(“/”)和http请求中的URI。如果匹配,那么就将URI附加到root字符串的后面,作为所请求的资源在本地文件系统中的位置。例如对于http请求www.example.com/abc/index.html,对应本地文件系统的位置在/data/www/abc/index.html。

如果一个server块内有多个location,那么将匹配最长的那个。我们可以利用这点,将不同的资源防止不同的位置。例如,我们将所有图片放在了/data/images,并且希望当浏览器送出http://www.example.com/images时从该目录读取文件,那么location块就是下面这个样子:

location /images/ {
    root /data
}
这里要注意的是,匹配过程只进行一次(最长匹配),如果在本地文件系统中没有找到请求的资源,那么将响应喜闻乐见的404,而不会尝试较短的匹配。

作为代理服务器

nginx的常用方式之一是将其作为代理服务器:接收请求,将请求传递给被代理的服务器,接收响应,将响应发送给客户端。

下面我们来配置一个基本的代理服务器:它使用本地文件系统来服务图片请求,将其它请求转发到后端服务器。

首先我们新增一个server块:

server {
    listen 8080;
    root /data/upl;
    location / {
    }
}

这个服务器使用端口8080。我们将root小节写在了sever块中而不是location块,对于没有root段的location,将使用server块里的root。

现在让我们回到上一个server。我们需要识别所有的图像文件(我们假定图像文件只有三种:gif,jpg,png)。修改后的location如下:

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

我们看到了熟悉的正则表达式:这个location匹配任何以gif或jpg或png结尾的URI。正则表达式必须以“~”符号作为前缀。

nginx首先检查最长匹配的location块并记住,然后检查正则表达式。如果正则表达式匹配,则使用其中的locaiton;否则就使用刚记住的最长匹配location块。

最终的代理服务器配置如下:

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

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

推荐阅读