细说 Nginx: 静态资源服务器基础 - server,location,root

细说 Nginx: 静态资源服务器基础 - server,location,root

Nginx 概述 & 安装简要

Nginx 作为 http 服务器可说是大获成功,不论是在静态资源分发或是反向代理上的负载均衡性能都非常好。

本篇将带大家来认识 Nginx 的基础用法之一:静态资源服务器的基础配置方式

安装

  • Linux

Linux 系统方面的支持都挺好,可以直接参考下面链接进行安装

传送门:nginx: Linux packages

  • MacOS

macOS 上稍微特别,这里推荐使用 homebrew 进行安装

brew install nginx

homebrew 提供了类似 linux 系统的 service 指令,可用来启动 nginx 服务

brew services start nginx

后续提到的相关目录(如 /var/log/var/run/etc/nginx.conf 等配置可能会被迁移到 /opt/homebrew 目录下,具体需要看 homebrew 的配置,应该还是蛮好找的)

  • Docker

Docker 算是一个非常好的部署平台,弭平了系统间的差异。基于 Docker 启动 nginx 也非常简单,直接拉一个官方的镜像就好了,可以跟着下面教程走

传送门:nginx(Official Image) - Official build of Nginx.

  • Windows

Nginx 作为服务器通常还是用 Linux 居多,退一步在同样基于 Unix 内核上的 MacOS 也勉强还行,但是真的不推荐装在 windows 上。下面提供一个安装连接,相关命令应该是保持一致的,但是目录结构的不相同就需要用户自己去探索了

传送门:nginx for Windows

Nginx 配置文件结构

Nginx 官方对于配置文件的结构说明和书写主要是按具体用例一一说明,官方似乎没有对所有可配置项有一个统整的说明。

不过这样也并不是什么大问题,用到啥功能再去学也不迟

本篇先介绍一些非常基本的配置结构,更细节的后面几篇会再说到hh

  • 配置文件结构

nginx.conf 的配置文件结构可以分成指令(directive)和块(block),块同时也作为内部指令的上下文(context)存在,而所有块的最外层则称为全局上下文(main context)。

全局上下问只允许包含两种块体:eventshttp

events {
}

http {
}

本篇关注在 http 静态资源服务器的搭建,所以我们具体只关注 http 块结构

http 块当中又可以包含多个 server 块,称为虚拟服务器(virtual server);而 server 块当中则可以再包含 location 块,结构如下

http {
  server {
    location / {
    }
  }
}

下面我们直接带大家来看看简单的 http 服务器要怎么写

实验1: 第一个路由

上面提过的配置文件结构直接拿下来用,并且填充第一个 location 块就能完成第一个最基础的静态资源服务器啦

http {
    server {
        listen          8080;
        server_name     localhost;

        location / {
            root ~/data/images;
        }
    }
}

这里我们在 server 块中指定监听 8080 端口以及 host 名(localhost),并且写了第一个 location 块

如此一来 nginx 就能够响应 http://localhost:8080/ 为前缀的任何资源,并从 root 指定的路径查询相关数据。例如对于 http://localhost:8080/sample.jpg 的请求,nginx 就会去查找 ~/Desktop/tmp/test-root/data/images/sample.jpg 的文件是否存在

  • 示例

实验2: 更多的服务器

接下来我们创建第二个 server,以及更多的 location

http {
    server {
        listen          8080;
        server_name     localhost;

        location / {
            root ~/data;
        }

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

    server {
        listen  8081;

        location / {
            root ~/data/images;
        }
    }
}

这次我们指定了两个 server,分别监听 8080、8081 的请求,并且在 8080 的 server 下添加了第二个 location,当我们遇到指定后缀名的时候,则从 /data/images 路径下寻找资源

也就是说上面的例子我们不论是访问 http://localhost:8080/sample.jpg 或是 http://localhost:8081/sample.jpg,实际上都是访问到 ~/data/images/sample.jpg 的图片

  • 示例

2.1 location 路径匹配

这里还要再特别介绍一下 location 的路径匹配问题,当我们添加更多 location 或是在 location 的路径上做文章的时候,实际上只是给予 nginx 一个选择,也就是仅仅描述一个匹配规则。

匹配到目标 location 之后,还是会用整个 pathname 与 root 合并作为最终路径,而不会自动舍弃匹配的部分

location /images {
  root /data/images
}

如上面这种匹配方式,如果我们发起的是 http://localhost:8080/images/sample.jpg,实际上真正去寻找的文件则是 /data/images/images/sample.jpg,这点需要读者小心(作者在使用初期常常陷入这种误区)

实验3: 代理服务器

到目前为止相信透过 server、location 的组合已经能够基本满足一些简单静态资源的分发(注意我们这边说的都是单体应用的情况下)

最后我们额外介绍一种代理,简单的将对指定站点的请求转发到另一个站点

server {
    listen          8082;
    server_name     localhost;

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

这样写的目标是去匹配 http://localhost:8082/www 为前缀的路径,并将其转发给 8080 的 server(注意根据前面 2.1 的路径匹配规则),转发之后实际上还是对 8080/www 进行匹配,而不会将匹配过的 www 删掉,这点也要小心。

实验小结

本质上我们可以将 nginx 视为一个单一的反向代理服务器,所以对于 location 的设计可以从用户可能发起的方式来进行配置,然后最后将可能匹配的路径集合导向正确的资源存放位置


参考连接

TitleLink
nginxhttps://nginx.org/en/docs/
NginxDocshttps://docs.nginx.com/

完整代码示例

https://github.com/superfreeeee/Blog-code/tree/main/deployment/nginx/nginx_detail_basic

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值