Nginx作为文件服务

避免浏览器自动播放文件

有时对于图片、视频,浏览器会视能力,自动为用户显示或播放。这主要是由于Web服务器在返回文件本身数据的同时,返回了一些特殊的MIME类型,比如:image/jpeg(JPEG图像),application/pdf(PDF文档),video/mpeg(MPEG动画)。这些MIMIE类型实际上是告诉浏览器,文件数据到底是什么,这样浏览器就能更好的为用户展示数据。现在像图片、pdf、甚至是视频基本都是可以直接在浏览器中展示和播放的。但是有时,我们需要浏览器为用户下载文件而不是直接播放,而Nginx在默认配置下,会根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载,这时需要通过配置让Nginx返回的MIME类型为下面这个类型:

application/octet-stream

这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件。可以通过在Nginx的配置文件中做如下配置达到这样的目的:

location /download/ {types        { }default_type application/octet-stream;
}

这样当Url路径中包含/download/时,MIME类型会被重置为application/octet-stream。另外,nginx自带的MIME类型映射表保存在conf/mime.types中。

文件上传大小限制放开

有的时候后端的Web-Server提供文件上传的服务,但是如果前端使用Nginx做反向代理时,会出现文件无法上传的问题,这可能是由于Ngxin默认对客户端请求的body的限制。因为,默认情况下Nginx对客户端请求的大小限制是1m,而上传的文件往往超过1m。可以通过修改如下配置项,来放宽这个限制:

client_max_body_size 10m;

将这个值设置为0,可以取消这个限制。这个配置项可以用在httpserverlocation配置节中。详见client_max_body_size

下载文件重命名

通常情况下,为了保证用户上传的文件在服务器的文件系统中不至于重名,一般会将文件名修改成guid后保存,并在数据库中保持guid与文件名的映射。此时,如果使用Nginx来提供对这些用户文件的下载功能的话,文件下载到用户浏览器,会以文件的guid名作为文件名,这显然是用户不想看到的。可以考虑用这个方案。
假设我们有一个文件的原始文件名为test.txt,对应的guid文件名是21EC2020-3AEA-1069-A2DD-08002B30309D.txt,文件的虚拟路径是/download/

使用服务器端编程语言,在输出的html中使用如下链接提供文件的下载:

<a href="/download/21EC2020-3AEA-1069-A2DD-08002B30309D.txt?n=test.txt" target='_blank'>下载test.txt</a>

可以看到,将原始文件名以QueryString的方式带在请求中,这样可以在Nginx端,利用$arg_name变量来取到这个QueryString的值,从而重写response header:

add_header Content-Disposition "attachment; filename=$arg_n";

这会在response header中加入如下键值:

Content-Disposition: "attachment; filename=test.txt";

经测试,无论是IE还是Chrome都可以支持这个header。

关于Content-Disposition,详见这里

关于Nginx的标准http模块的嵌入变量,详见这里

Nginx作为反向代理

一个IP多个域名

如果只有一个公网IP,但是网站功能需要划分为多个不同的子网站或者子域名,可以用Nginx来搭建反向代理来“复用”IP资源。假设有如下几个域名都是abc.com这个主域的:

www.abc.comimage.abc.comvideo.abc.com

1. 首先在DNS出注册这3个域名同时指向同一个IP,Nginx作为前端的web服务器,让所有访问这个IP地址80端口的请求全部指向Nginx
2. 然后,配置Nginx,根据域名将请求转发转发给内网的上游服务器,例如下面的配置:

    server {        listen 80;        server_name www.abc.com;        location / {                proxy_pass http://192.168.1.100;}}    server {        listen 80;        server_name image.abc.com;        location / {                alias /var/www/image;}}    server {        listen 80;        server_name video.abc.com;        location / {                proxy_pass http://192.168.1.100:8081/video;}}

在上述配置中,将三个域名分发给了不同的模块处理:

  1. www.abc.com 分发给上游的http://192.168.1.100服务器处理

  2. image.abc.com 则直接映射到了Nginx本机的一个目录

  3. video.abc.com 分发给上游的http://192.168.1.100:8081/video服务器处理(video是上游web-server的某虚拟目录)

上游服务器超时

Nginx作为反向代理的时候,如果上游服务器处理时间过长的话,有时会返回504网关超时,从nginx的错误日志看出如果是upstream timed out,就表示是上游服务器处理时间过长,Nginx认为服务超时。Nginx在请求上游服务器时默认的超时时间为1分钟,可以通过调整proxy_read_timeout属性增加这个超时时间

proxy_read_timeout  180s;

本文出自https://segmentfault.com/a/1190000000437323

转载于:https://blog.51cto.com/lookingdream/2118786

nginx配置技巧汇总相关推荐

  1. Nginx配置相关结构划分的技巧和禁止IP访问

    Nginx配置相关结构划分的技巧 原文来自:http://developer.51cto.com/art/201003/190953.htm Nginx配置需要一定的技巧,我们在不断的使用和维护中就会 ...

  2. nginx 配置多个域名 指向不同服务_Nginx的几个常用配置和技巧

    文章列举了几个Nginx常见的,实用的,有趣的配置,希望看过之后能说一句:学到了! 一个站点配置多个域名 server { listen 80; server_name ops-coffee.cn b ...

  3. nginx教程全集汇总(ttlsa出品)

    为什么80%的码农都做不了架构师?>>>    nginx教程写了一段时间,无意中发现,nginx相关文章已经达到了近100篇了.觉得很有必要汇总到一起,它是我们运维生存时间的一片心 ...

  4. php+php-fom+nginx配置参数调优详解

    文章目录 一.前言 1.mysql配置参数: 2.注意 二.php参数配置及讲解 1.phpini的基本设置 2.php参数设置 三.php-fpm设置 1.设置子进程数,增加并发量 2.防止频繁出现 ...

  5. 三个案例看Nginx配置安全

    之前在Sec-News中推荐了一个开源程序  https://github.com/yandex/gixy,作用是来检测Nginx配置文件中存在的问题.正好Pwnhub上周的比赛也出现了一道题,包含由 ...

  6. Nginx反向代理汇总

    文章目录 一.二级域名代理tomcat 二.二级域名https实现 三.二级域名代理wss 三.代理静态文件 四.Nginx配置汇总 4.1 正向代理 4.2 反向代理 4.3 负载均衡 4.4 Ng ...

  7. Latex排版技巧汇总

    Latex排版技巧汇总 一.前言 二.准备工作 1. Latex环境配置 2. 英文期刊Latex模板获取 三.Latex输入各种符号 四.Latex公式 1. 从Mathtype中获取不复杂公式的L ...

  8. Nginx配置及常用配置

    文章目录 一.基本配置及配置说明 1.1 典型配置 1.2 全局变量(nginx内置预定义变量) 二.常用配置 2.1 反向代理配置 2.2 跨域CORS配置 2.2.1 使用反向代理解决跨域 2.2 ...

  9. RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总

    RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总 Q1: MRS调试时如何查看外设寄存器内容? A1: 在调试配置界面添加相应的.svd文件. Q2: MRS如何调用数学库? A2: # ...

最新文章

  1. Cisco无线AP上联口为trunk时无法注册故障处理
  2. PIC中实现printf函数出现:Warning [2066] type qualifier mismatch in assignment
  3. Android 中基本图像绘制
  4. ArcGIS地理坐标系与投影坐标系
  5. java商品列表展示_springMVC入门程序。使用springmvc实现商品列表的展示。
  6. 创建struct fib_info函数分析
  7. 京东健康股价创下新高 市值突破6000亿港元
  8. asio定时器深度探析
  9. python爬虫接口_python爬虫之百度API调用方法
  10. 高数_第2章多元函数微分学__偏导数的几何应用_空间曲线的切线与法平面
  11. 2012年度总结:内心宁静的2012
  12. postman tests
  13. Linux系统网络环境配置(初学者必看)!!
  14. CleanMyMac X4.20最新mac电脑优化工具好用吗?
  15. 实战版 天猫精灵接入指南(AliGenie接入)
  16. 大脑构造图与功能解析_大脑的结构和功能分区_详解人脑构造与功能
  17. 微信小程序如何支持分享给朋友和分享到朋友圈?如何解决分享朋友圈灰色问题
  18. 大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量
  19. windows server 2012 使用包管理工具choco安装程序
  20. office哪个版本最好用、占用资源最少?

热门文章

  1. mysql5.6 函数索引_聊聊MySQL中的索引
  2. Google Guava官方教程
  3. java比较运算_Java比较运算符
  4. linux中mtools工具_Linux mtools命令
  5. matlab中(1 )什么意思,matlab中area(1)什么意?mat – 手机爱问
  6. svnadmin: e000002: 无法创建最上层目录_JFolder::create: 无法创建目录
  7. 用css如何写正方体,css正方体实现--(transform练习)
  8. oracle替换表merge,sql – Oracle – 如何使用merge根据其他表和列中的值更新列
  9. sqlserver2012不是有效的安装文件夹_SQL Server 2012软件安装说明
  10. Zookeeper分布式一致性原理(十一):Zookeeper在JStorm中应用