nginx配置技巧汇总

标签: nginx 技巧 | 发表时间:2014-04-17 21:05 | 作者:Jing
出处:http://blog.jingwentian.com/

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,可以取消这个限制。这个配置项可以用在 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中加入如下键值:

  Content-Disposition: "attachment; filename=test.txt"; 经测试,无论是IE还是Chrome都可以支持这个header。

提供flv视频播放

使用 jwplayer+ Nginx能够实现视频在线播放,视频格式为 flv。Nginx有一个flv模块 ngx_http_flv_module,能够支持flv视频的快进播放。在安装Nginx的时候可能需要手动添加 --with-http_flv_module,不过笔者使用的yum安装,自动带上了这个模块。

其实从这个模块的文档中可以看到,它只是能够处理 start的带参数http请求,需要像下面这样配置:

  location ~ \.flv {
    root /var/video;
    flv;
}

从客户端播放器的角度看,还需要配置播放器的一些参数,以jwplayer为例:

  jwplayer("flashContent").setup({
    flashplayer: "/jwplayer/player.swf",
    height: 270,
    width: 480,
    file: "${file_url}.flv", //flv文件路径
    image:"${file_url}.jpg", //缩略图
    streamer:"start",
    provider: "http", //有时可能是type:"http"
});

这里的关键参数是 provider,用来告诉jwplayer使用http方式请求视频(还有其他协议,比如RTSP), streamer参数是配合Nginx支持的 start参数来设置的。

如果想要实现快进播放的话,还有一个关键点,就是视频需要包含有关键帧信息。关键帧信息其实就是一系列 时间点+ byte位。可以用 yamdi为flv注入关键帧:

  yamdi -i a_without_meta.flv -o b_with_meta.flv

这样jwplayer能够根据快进的时间从关键帧信息中找到最近的关键帧的起始二进制点,并将这个byte作为start参数回传给Nginx。如果关键帧信息越密集的话,越占空间,但是快进也能够越精确:

  //刚开始播放的时候,产生的http:
.../b_with_meta.flv?start=0
//用户快进后,产生的http:
.../b_with_meta.flv?start=37682252

Nginx作为反向代理

一个IP多个域名

如果只有一个公网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;
    }
 }

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

  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;

原文

相关 [nginx 技巧] 推荐:

nginx配置技巧汇总

- - Jing
有时对于图片、视频,浏览器会视能力,自动为用户显示或播放. 这主要是由于Web服务器在返回文件本身数据的同时,返回了一些特殊的MIME类型,比如: image/jpeg(JPEG图像), application/pdf(PDF文档), video/mpeg(MPEG动画). 这些MIMIE类型实际上是告诉浏览器,文件数据到底是什么,这样浏览器就能更好的为用户展示数据.

技巧集:nginx作代理时,查看请求被转发到哪台服务器

- - zzm
使用Nginx代理多台服务器实行负载的时候,如何查看某一个请求被转发到哪台服务器上呢. 重启Nginx,重新访问,在浏览器中F12查看request的Headers信息,可以看到当前服务器的IP. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环境可以使用以下指令. centos平台编译环境使用如下指令. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩.

Nginx GZip 压缩

- - 开心平淡对待每一天。热爱生活
  Nginx GZip 模块文档详见: http://wiki.nginx.org/HttpGzipModule 常用配置片段如下:. # 压缩比例,比例越大,压缩时间越长. 默认是1 gzip_types. text/css text/javascript; # 哪些文件可以被压缩 gzip_disable.

Nginx 限流

- - 鸟窝
电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单、信誉分析,进而根据用户ip信誉权重做相应的流量拦截、限制流量. Nginx自身有的请求限制模块 ngx_http_limit_req_module、流量限制模块 ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. 基于HTTP的FLV/MP4 VOD点播. HLS (HTTP Live Streaming) M3U8的支持. 基于http的操作(发布、播放、录制). 可以很好的协同现有的流媒体服务器以及播放器一起工作.

Nginx content cache Nginx内容缓存

- - CSDN博客推荐文章
原文地址: http://nginx.com/resources/admin-guide/caching/. When caching is enabled NGINX saves responses in the cache on the disk and uses them to respond to clients without proxying the requests..

nginx + memcached session 同步

- - 企业架构 - ITeye博客
squid 缓存疑问 问题归纳:. 1 squid 缓存的数据,何时过期,如何判断缓存的数据已经过期,如何把最新的数据缓入squid 并且替换掉旧的内容. 2 如何判断数据是否应该被缓存. 3 校验失败时,是否给出缓存中旧的内容. 上面的几个问题  都可以通过 squid中的 refresh_pattern 配置项 找到答案.

nginx日志切割

- - haohtml's blog
nginx的日志文件没有rotate功能. 如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件. 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志. 在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件.