本文记录了一些nginx做为反向代理和文件服务器的配置技巧和解决方案,原文会持续更新html
有时对于图片、视频,浏览器会视能力,自动为用户显示或播放。这主要是因为Web服务器在返回文件自己数据的同时,返回了一些特殊的MIME类型,好比:image/jpeg
(JPEG图像),application/pdf
(PDF文档),video/mpeg
(MPEG动画)。这些MIMIE类型其实是告诉浏览器,文件数据究竟是什么,这样浏览器就能更好的为用户展现数据。如今像图片、pdf、甚至是视频基本都是能够直接在浏览器中展现和播放的。可是有时,咱们须要浏览器为用户下载文件而不是直接播放,而Nginx在默认配置下,会根据文件的后缀来匹配相应的MIME类型,并写入Response header,致使浏览器播放文件而不是下载,这时须要经过配置让Nginx返回的MIME类型为下面这个类型:前端
application/octet-stream
这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件。能够经过在Nginx的配置文件中作以下配置达到这样的目的:nginx
location /download/ { types { } default_type application/octet-stream; }
这样当Url路径中包含/download/
时,MIME类型会被重置为application/octet-stream
。另外,nginx自带的MIME类型映射表保存在conf/mime.types
中。web
有的时候后端的Web-Server提供文件上传的服务,可是若是前端使用Nginx作反向代理时,会出现文件没法上传的问题,这多是因为Ngxin默认对客户端请求的body的限制。由于,默认状况下Nginx对客户端请求的大小限制是1m,而上传的文件每每超过1m。能够经过修改以下配置项,来放宽这个限制:数据库
client_max_body_size 10m;
将这个值设置为0,能够取消这个限制。这个配置项能够用在http
, server
, location
配置节中。详见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中加入以下键值:app
Content-Disposition: "attachment; filename=test.txt";
经测试,不管是IE仍是Chrome均可以支持这个header。
关于Content-Disposition,详见这里
关于Nginx的标准http模块的嵌入变量,详见这里
若是只有一个公网IP,可是网站功能须要划分为多个不一样的子网站或者子域名,能够用Nginx来搭建反向代理来“复用”IP资源。假设有以下几个域名都是abc.com这个主域的:
www.abc.com image.abc.com video.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; } }
在上述配置中,将三个域名分发给了不一样的模块处理:
www.abc.com
分发给上游的http://192.168.1.100服务器处理image.abc.com
则直接映射到了Nginx本机的一个目录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;