静态服务器

静态服务器概念非常简单:当用户请求静态资源时,把文件内容回复给用户。

但是,要把静态服务做到极致,需要考虑的方面非常多:

  • 正确书写header:设置content-type、过期时间等
  • 效率:减小文件体积,合理设置缓存,使用策略减少服务器内存占用
  • 安全性,防盗链

Nginx提供了强大的静态服务功能。

基本配置

root和alias:设置静态资源根目录

root的取值最好使用绝对路径。
root 指令可以放在 http、server 或 location 上下文的任何位置。

例如:

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

在此配置中,如果 URI 以 mp3 或 mp4 后缀结尾,Nginx 会在 /www/media/ 目录查找文件。否则在 /www/data 目录中查找。如果请求以 / 结尾,Nginx 会把这个请求当做一个目录请求,尝试找这个目录中的 index 文件。index 指令定义了 index 文件的文件名(默认使用 index.html 文件)。例如上面的配置,如果请求是 /images/some/path/,Nginx 会尝试寻找并返回文件 /www/data/images/some/path/index.html,如果文件不存在则返回 404。

autoindex:访问目录时列出文件列表

autoindex 指令如果设置为 on,则 Nginx 会返回自动生成的目录列表。最终的效果和ftp服务相似。

alias和root的区别在于:对于root而言,location匹配的全部路径就是root下的文件路径;对于alias而言,location匹配后的路径才是root下的文件路径。

index:默认文件

index表示默认的文件。index 指令中可以列出多个文件。Nginx 会按顺序查找文件并返回第一个找到的文件。

location / {index index.$geo.html index.htm index.html;
}

性能调优

gzip:压缩文件·

location ~ .*\.(jpg|gif|png)$ {gzip on;gzip_min_length 1k;gzip_buffers 4 16k;  #gzip_http_version 1.0; gzip_comp_level 2;gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary off;gzip_disable "MSIE [1-6]\.";root /nginxtest/images;
}

gzip选项

  • gzip:开启Gzip
  • gzip_min_length :不压缩临界值,大于1K的才压缩,一般不用改
  • buffer:缓存大小
  • gzip_http_version:用了反向代理的话,末端通信是HTTP/1.0,有需求的应该也不用看我这科普文了;有这句的话注释了就行了,默认是HTTP/1.1
  • gzip_comp_level :压缩级别,1-10,数字越大压缩的越好,时间也越长,看心情随便改吧
  • gzip_types :第6行:进行压缩的文件类型,缺啥补啥就行了,JavaScript有两种写法,最好都写上
  • gzip_vary:跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
  • gzip_disable:控制在某些情况下禁用gzip,例如:IE6对Gzip不怎么友好,不给它Gzip了

expires:启用缓存

location / {expires 24h;root   /usr/share/nginx/html;index  index.html index.htm;
}

sendfile:把小文件加载在内存中

如果静态文件很小,直接放在内存中可以加快传输效率(避免了读硬盘操作)。如果文件太大也放在内存中,会浪费内存资源。

location /mp3 {sendfile           on;sendfile_max_chunk 1m;...
}

tcp_nopush

tcp_nopush 指令需要和 sendfile 指令配合使用。
如果 tcp_nopush 指令和 sendfile 指令同时使能,则 Nginx 在通过sendfile 获取数据块后会立即在一个数据包中发送 HTTP 响应头。

tcp_nodelay

tcp_nodelay 选项允许覆盖 Nagle 的算法,最初设计用于解决慢速网络中小数据包的问题。该算法将多个小数据包合并为较大的数据包,并以200毫秒的时延发送数据包。如今,在提供大的静态文件时,无论数据包大小如何,都可以立即发送数据。延迟还会影响在线应用程序(ssh,在线游戏,在线交易)。 默认情况下,tcp_nodelay 指令被使能,禁用 Nagle 的算法。 该选项仅用于保持连接:

location /mp3  {tcp_nodelay       on;keepalive_timeout 65;...
}

高级调优

测量监听队列(Measuring the Listen Queue)

运行下面的命令可以测量监听队列(Linux 下的 netstat 命令不支持 -L 参数,需要使用命令 ss -l):

netstat -Lan

1
输出如下:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address
0/0/128        *.12345
10/0/128        *.80
0/0/128        *.8080

上面的输出显示,在 80 端口的监听队列有 10 个未接受的连接,最大连接数限制为 128,这种情况是正常的。

然而,如果输出是下面这样子的:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address
0/0/128        *.12345
192/0/128        *.80
0/0/128        *.8080

上面显示有 10 个未接受的连接,超过了最大限制 128。在网站访问量大时这种情况挺常见的。为了达到最佳性能,可以修改操作系统和 Nginx 配置,增加 Nginx 可以等待接受的队列中的最大连接数。

调整操作系统(Linux,FreeBSD)

可以增加 net.core.somaxconn 参数的值(默认 128)以应对高并发流量:

对于 FreeBSD 运行命令 sudo sysctl kern.ipc.somaxconn=4096
对于 Linux 运行命令 sudo sysctl -w net.core.somaxconn=4096
打开文件 /etc/sysctl.conf,添加这一行:net.core.somaxconn = 4096

调整 Nginx

如果设置的 somaxconn 值大于 512,需要更改 Nginx 配置文件中的 backlog 参数匹配这个设置:

server {listen 80 backlog=4096;# The rest of server configuration
}

安全

使用add_header设置跨域访问

location / {add_header Access-Control-Allow-Origin www.baidu.com;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;root   /usr/share/nginx/html;index  index.html index.htm;
}

使用referer防盗链

location ~ .*\.(jpg|gif|png)$ {valid_referers none blocked 119.2x.1x3.218 支持增则匹配;if ($invalid_referer) {return 403;}root /nginxtest/images;
}

try_files:定制文件不存在时的操作

try_files 指令可以检查指定的文件或目录是否存在,从而执行内部重定向或在文件不存在的时候返回指定的 HTTP 状态码。

例如,通过 try_files 指令和 $uri 变量检查和请求中的 URI 相关的文件是否存在:

server {root /www/data;location /images/ {try_files $uri /images/default.gif;}
}

文件以 URI 的形式指定,并且使用在当前 location 或 server 的上下文中设置的 root 或 alias 指令进行处理。此时如果源 URI 指定的文件不存在,Nginx 会内部重定向到最后一个参数指定的 URI,返回 /www/data/images/default.gif。

最后一个参数也可以是状态码(前面需要加等号)或一个 location 的名字。下面的例子中,如果 try_files 指令指定的文件或目录都不存在,则返回 404 错误:

location / {try_files $uri $uri/ $uri.html =404;
}

下面的例子中,如果原始 URI 和带有附加斜线的 URI 指定的文件或目录都不存在,请求就会被重定向到指定名称的 location:

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

参考资料

https://blog.csdn.net/kikajack/article/details/79323643
http://www.nginx.cn/doc/standard/httpcore.html
http://www.nginx.cn/doc/standard/httpgzip.html
http://www.nginx.cn/doc/standard/httpheaders.html

转载于:https://www.cnblogs.com/weiyinfu/p/10387282.html

Nginx配置静态资源相关推荐

  1. nginx配置静态资源,重新发布后,浏览器缓存导致异常原因和解决

    原因: nginx作为静态资源服务器,重新构建后发生浏览器页面直接取缓存中的js等文件名,但是由于服务器中文件已经被替换导致出现异常. 浏览器在下次请求这个资源的时候不会将请求发向后端,而是直接从缓存 ...

  2. nginx配置静态资源为https

    最近遇到一个问题,https页面不能加载http静态资源,需要将http链接的静态资转为https链接的静态资源,在网上看了很多文档才配置出来,把nginx配置文件分享给大家,希望给用到的人做参考:n ...

  3. nginx配置静态资源访问

    目录 在配置静态资源访问之前先了解一些nginx的常用命令 接下来开始配置访问静态资源 先创建一个想要访问的资源文件夹,加入自己想要访问的文件内容,如(jpg.TXT.HTML等) 记一下路径 然后进 ...

  4. nginx 配置静态资源缓存。解决web静态资源访问过慢

    Nginx文件结构 1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等. ...

  5. Nginx 配置静态资源防盗链

    当本网站的静态资源链接被其他网站给引用,如此可以被盗用静态资源显示. 如本网站资源是www.img.example.com/img.png 在某个其他网站引用了此链接,就直接发生的盗用. <im ...

  6. Nginx 配置静态资源服务器

    目录 一.打开config/nginx.config 二.添加一个资源文件夹存放静态资源 三.配置文件 ​四.测试访问 一.打开config/nginx.config 二.添加一个资源文件夹存放静态资 ...

  7. nginx配置静态资源html,详解nginx静态资源服务器简单配置

    传统的web项目,一般都将静态资源存放在 webroot的目录下,这样做很方便获取静态资源,但是如果说web项目很大,用户很多,静态资源也很多时,服务器的性能 或许就会很低下了.这种情况下一般都会需要 ...

  8. nginx配置静态资源html,通过nginx服务器访问静态资源(示例代码)

    通过nginx服务器访问静态资源 引言 之前在做毕设的时候接触过nginx,那时候是用来做前后端分离的.一转眼都快一年了,nginx的相关内容也忘的差不多了. 有过接触前端的同学都知道,直接在标签的s ...

  9. nginx配置静态资源访问路径

    server { #这里是我自己配置服务端口listen 8666;server_name resouce;root E:/zhanshi; #访问文件根目录autoindex on; #是否浏览文件 ...

最新文章

  1. Python使用matplotlib可视化华夫饼图(Waffle Chart) 、华夫饼图可以直观地显示完成度(百分比)或者部分占整体的比例、从不同的分类变量来可视化华夫饼图(Waffle Chart
  2. 抽象方法和接口的区别
  3. Session机制详解及分布式中Session共享解决方案
  4. linux 内存泄露工具,linux下检查内存泄露的工具--mtrace
  5. 使用curl获取Location:重定向后url
  6. ASCII码表在线查询进制转换
  7. 一道六年级数学题,求阴影面积,那我只能用Python代码了
  8. 数据结构和算法liuyubobo_C++,java算法与数据结构-某课网价值166元实战教程
  9. 能力的变迁:能力包括哪些方面
  10. 电商项目5:商品模块
  11. 小程序云开发实战:从零搭建科技爱好者周刊小程序
  12. 微信公众号文章链接正则校验
  13. 行业务实派:解锁数据价值,翼方健数全栈隐私安全计算技术
  14. php生成免签转账码,(转)支付宝免签二维收款码生成
  15. MQTT之十一 阿里云物联网平台网址
  16. T1: String根据特定字符截取字符串
  17. 一种以STC89C51为核心控制器的积水清除与利用装置解决方案
  18. android管理自启动,Android自启动管理原理
  19. C语言高级专题(4)-------指针和数组的高级应用
  20. 自然语言处理R8数据集介绍

热门文章

  1. openSSH离线升级(6.6->7.9),解决Linux安全漏洞(CVE-2018-15473)
  2. vue中ref的使用(this.$refs获取为undefined)
  3. [Coci2015]Divljak
  4. 【php】Windows PHP及xdebug安装 安装
  5. 洛谷 1373 dp 小a和uim之大逃离 良心题解
  6. python request属性及方法说明
  7. 导航栏 UITabBarController等颜色的区别
  8. 基于ffmpeg入门学习相关的资料
  9. ASP.net的PDF打印(水晶报表)[摘]
  10. Linux逻辑卷(LVM)技术详解