前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx作为静态资源服务器

Nginx作为静态资源服务器

作者头像
Homqyy
发布2024-08-23 20:06:48
230
发布2024-08-23 20:06:48
举报
文章被收录于专栏:知行合一

Nginx作为静态资源服务器

引用原文:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/#optimizing-performance-for-serving-content

Nginx是一个轻量、高性能的服务器,平时除了可以作为反向代理服务器外,我们还可以将其作为一个静态资源服务器:

  1. 与mkdocs一起使用,可以变成个人博客
  2. 可以发布静态资源,比如文件、图片等供他人下载;部署在家里可以实现跨设备访问呢

资源目录(root)

定义好root资源目录,该目录作为Nginx搜索文件的根目录,比如访问资源 example.zip,Nginx会在root目录下搜索该文件。

定义root目录的方式如下:

代码语言:javascript
复制
server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ \.(mp3|mp4) {
        root /www/media;
    }
}

root指令用来定义资源目录,它可以配置在http{}server{}location{}配置上下文中。如上所示,定义了服务器默认的搜索目录为/www/data,当访问/images/目录时,Nginx会在/www/data/images/目录下搜索文件。但是如果访问的文件后缀是mp3mp4,则会在/www/media/目录下搜索文件。因为location指令的root指令会覆盖serverroot指令(可参阅文章《Nginx心法》。

默认情况下,如果访问一个/结尾(目录)的资源,Nginx会去查找文件index.html,比如访问/images/,Nginx会去查找/www/data/images/index.html文件。一般我们可能会有一堆资源,比如在/www/data/images/目录中可能存在成百上千的图片,这时候可以让Nginx自动生成index.html并返回给客户端(不会落盘):

代码语言:javascript
复制
location /images/ {
    autoindex on;
}
  • autoindex on指令将打开自动生成index.html功能,当访问/images/时,Nginx会自动生成一个index.html文件,列出/www/data/images/目录下的所有文件。如果遇到目录,它也会支持递归访问。

除了index.html作为默认的索引文件外,我们还可以自定义索引文件:

代码语言:javascript
复制
location / {
    index index.$geo.html index.htm index.html;
}

它将按顺序查找索引文件,如果找到则返回,否则返回404

Nginx在搜索文件时,如果文件不存在,它还会尝试内部重定向到其他的location(如果通过index组装起来的资源路径能够命中其他的location的话),比如:

代码语言:javascript
复制
location / {
    root /data;
    index index.html index.php;
}

location ~ \.php {
    fastcgi_pass localhost:8000;
    #...
}

如果访问/path/,且/data/path/index.html不存在,但/data/path/index.php存在对应的location,Nginx会尝试内部重定向到location ~ \.php,然后交给fastcgi处理。

尝试多种选择

try_files指令可以检查指定的文件或目录是否存在,如果不存在则触发内部重定向,或者返回错误码。

代码语言:javascript
复制
server {
    root /www/data;

    location /images/ {
        try_files $uri /images/default.gif;
    }
}

如上所示,如果访问/images/目录下的文件不存在,Nginx会行部重定向到最后一个参数的/images/default.gif文件。

也可以用=code的方式来返回错误码,而不是内部重定向:

代码语言:javascript
复制
location / {
    try_files $uri $uri/ $uri.html =404;
}

如上所示,如果访问的文件不存在,Nginx会尝试查找uri/目录,如果还是不存在,会尝试查找uri.html文件,如果还是不存在,返回404错误码。

内部重定向也支持命名location

代码语言:javascript
复制
location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

如上所示,如果访问的文件不存在,Nginx会尝试查找$uri/目录,如果还是不存在,会尝试查找@backend命名的location,然后交给proxy_pass处理。

优化性能

打开sendfiletcp_nopush

代码语言:javascript
复制
location /mp3 {
    sendfile            on;
    tcp_nopush          on;
    #...
}

对于发送文件来说,sendfile可以提高性能并减低cpu的消耗,tcp_nopush则可以减少网络延迟。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nginx作为静态资源服务器
    • 资源目录(root)
      • 尝试多种选择
        • 优化性能
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档