Nginx it?

一、简介

nginx是轻量级、高性能的web服务器和反向代理服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;  #定义错误日志存放地址和等级
pid        /var/run/nginx.pid; #定义pid文件存放地址
events {
    worker_connections  1024; #最大并发数
}
http {
client_max_body_size 10m; #单次请求的最大字节数
    include       /etc/nginx/mime.types; #文件扩展名和类型映射表
    default_type  application/octet-stream;     #默认文件类型
    log_format  main  '$remote_addr -$remote_user  [$time_local] "$request"  '
                      '  $status $body_bytes_sent "$http_referer"'
                      ' "$http_user_agent" "$http_x_forwarded_for"';    #定义一个名字叫main的日志格式
    access_log  /var/log/nginx/access.log  main;    #访问日志存储路径以及使用main格式的日志
    sendfile        on; # 开启高效传输模式
    tcp_nopush     on;    #累积数据包大小到一定量和响应头一起发送
    tcp_nodelay     on;    #禁用naggle算法,立即发送缓冲区数据,对keep-alived有效
    keepalive_timeout  65;    #长连接超时
   #gzip  on;    
    include /etc/nginx/conf.d/*.conf; #导入路由转发文件
server {
   server_name mobileprj.rd.company.net; #监听的域名
   listen 80;#监听的端口
   auth_basic "welcome to gerrit"; # 添加认证
   auth_basic_user_file password_file_path; # htpasswd -c -b password_file_path username password 生成的密码文件
   location /redmine { #根据路径分发
   proxy_redirect off; #隐藏反向代理的服务器的头信息
   proxy_set_header Host $host; #设置转发请求头的host,保留此设置,避免反向代理时无限循环重定向
   proxy_set_header X-Real-IP $remote_addr; #设置转发请求的头的X-Real-IP
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 设置转发请求头的X-Forwarded-For
   proxy_set_header User-Agent $http_user_agent; #设置转发请求头的User-Agent
   proxy_pass http://172.17.0.1:8095;    #设置转发的服务地址
   }
}
}

反向代理支持跨域,在跨域时,options 请求需要返回全部相关 header 和 204,非 option 必须返回 Access-Control-Allow-Origin 然后继续处理;origin 是请求必要的 header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location ~ \.php$ {

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
        add_header 'Access-Control-Allow-Headers' '*' always;
        add_header 'Access-Control-Max-Age' 1728000 always;
        add_header 'Content-Length' 0;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        return 204;
    }

    if ($request_method ~* '(GET|POST|DELETE|PUT)') {
        add_header 'Access-Control-Allow-Origin' '*' always;
    }

}

二、安装

使用包管理器安装

1
2
3
4
5
# deb
sudo apt-get install nginx

# rpm
sudo yum install nginx

使用源码安装

官网上下载源码后,解压在解压后的目录执行

1
2
./configure #可以在这一步添加配置参数,具体参数可以通过./configure --help命令查看
make && sudo make install

对于不同用途,建议采用不同配置

1
2
3
4
# 对于网络加速代理
./configure --with-http_ssl_module --with-htpp_realip_module --with-http_geoip_module --with-http_stub_status_module --with-openssl=${BUILD_DIR}/openssl-1.0.1p
# 对于Web服务器
./configure --with-http_stub_status_module

当然,可以安装第三方模块,注意依赖关系

1
./configure --add-module=<path>#path是第三方模块目录

三、配置指南

基本配置格式

1
2
3
<section> {
  <directive> <parameters>;
}

全局配置参数

1
2
3
4
5
6
user #配置worker进程的用户和组,如果忽略了group,则group使用该用户所在的组
worker_processes #worker进程的启动数量,
error_log #错误日志路径和等级
pid #设置记录主进程ID的文件
use #指定使用什么样的连接方法,需要配合events区段
worker_connections #最大并发数

使用include文件

1
include /etc/nginx/conf.d/*.conf;

注意这些文件要有正确的nginx语法

HTTP的server

客户端指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
chunked_transfer_encoding #
client_body_buffer_size #设置客户端的缓存大小
client_body_in_file_only #设置为"on"时,将客户端请求体强制写入磁盘文件
client_body_in_single_buffer #强制讲客户端请求体保存在单个缓存中
client_body_temp_path #定义一个路径,用于保存客户端请求体
client_body_timeout #该指令指定客户体成功读取的两个操作之间的时间间隔
client_header_buffer_size #为客户端请求头指定一个缓存大小,当请求头大于1KB会用到这个设置
client_header_timeout #读取整个客户端头的超时时间标准
client_max_body_size #允许的客户端的最大请求头
keepalive_disable #对于某些客户端禁用keep-alive功能,比如msie6
keepalive_requests #在一个keep-alive关闭之前可以接收多少个请求
keepalive_timeout #keep-alive连接持续多久
large_client_header_buffers #定义最大数量和最大客户端请求头大小
msie_padding #为了填充响应的大小至512字节,对于 MSIE 客户端,大于400 的状态代码会被添加注释以便满足512字节,通过启用该命令可以阻止这种行为
msie_refresh #对于 MSIE 客户端,该指令可启用发送一个 refresh 头,而不是redirect
文件IO指令
1
2
3
4
5
6
7
8
9
10
11
aio #启用异步文件io,对于linux,需要指定directio大小,当aio生效的时候,就会自动禁用sendfile
directio #可以设置为off或者某个大小值,表示当文件大小大于等于这个值时启用directio,否则使用sendfile,对于大文件,使用aio,节省cpu,对于小文件,使用sendfile,减少拷贝,
directio_alignment #设置directio算法,默认值是512,对于xfs文件系统推荐使用4KB
open_file_cache #配置一个缓存用于存储打开文件描述符、目录查询和文件查询错误
open_file_cache_errors #启动文件查询错误缓存
open_file_cache_min_uses #open_file_cache缓存的文件描述符保留在缓存中
open_file_cache_valid #指定对open_file_cache缓存有效性检查的时间间隔
postpone_output # nginx发送给客户端最小的数值
read_ahead #内核讲预读文件的大小,如果可能的话
sendfile #将文件从磁盘拷贝到内核缓冲区,再将记录数据位置和长度的相关数据保存到socket的相关缓存
sendfile_max_chunk #在一个snedfile中复制最大数据的大小,减少阻塞调用sendfile()所花费的最长时间
Hash指令
1
2
3
4
5
6
server_names_hash_bucket_size #保存server_name散列表大小的桶
server_names_hash_max_size #server_name散列表最大值
types_hash_bucket_size #指定存储散列表的桶的大小
types_hash_max_size # 指定散列类型表的最大值
variables_hash_bucket_size #指定用于存储保留变量桶的大小
variables_hash_max_size #存储保留变量最大散列值的大小
socket指令
1
2
3
4
5
6
7
8
lingering_close #该指令指定如何保持客户端的连接,以便用于更多数据的传输
lingering_time #在使用 lingering close 指令的连接中,该指令指定客户端连接为了处理更多的数据需要保持打开连接的时间
lingering_timeout #结合 lingering close ,该指令显示 Nginx 在关闭客户端连接之前,为获得更多数据会等待多久
reset_timedout_connection
send_lowat
send_timeout
tcp_nodelay
tcp_nopush

虚拟服务器

由关键字server开始的部分都叫虚拟服务器… … 一个虚拟服务器由listen和server_name指令组合定义,listen指定定义了一个ip地址/端口组合或者是unix域套接字路径

1
2
3
listen address [:port];
listen port;
listen unix:path;

对于server_name,其指令相当简单

1
2
3
4
5
*.example.com
www.example.*
.example.com
~^www\.example\.com$
~^www(\d+).example\.(com)$

location用于server内部,

1
2
3
4
5
6
7
8
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
---
=:精确匹配(必须全部相等),不可以嵌套location
~:大小写敏感
~*:忽略大小写
^~:只需匹配uri部分
@:内部服务跳转,不可以嵌套location

四、反向代理服务器

简介

Nginx 能够作为 一个反向代理来终结来自于客户端的请求,并且向上游服务器打开一个新请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#转发/newuri
location /uri {
proxy_pass http://localhost:8080/newuri;
}

#转发/local
location ~ ^/local {
proxy_pass http://localhost:8080;
}

#转发/index.php?page=$1,这个$1是前面括号匹配到的内容
location / {
rewrite /(.*)$/ /index.php?page=$1 break;
proxy_pass http://localhost:8080;
}

代理模块

1
2
proxy_connect_timeout # 从接受请求到连接上游服务器最长等待时间
proxy_cookie_domain # 该指令替代从上游服务器来的 Set-Cookie 头中的 domain 属性,值是一个字符串、 一个正则表达式,或者是引用的变量,但是一般情况下,response中的cookie中domain是个可选项,并不一定存在,这时就不用设置这个值

avatar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
proxy_cookie_path # 替代从上游服务器来的 Set-Cookie 头中的 path 属性
proxy_headers_hash_bucket_size # 该指令指定头名字的最大值
proxy_headers_hash_max_size  # 从上游服务器接收到头的总大小
proxy_hide_header # 指定不应该传递给客户端头的列表
proxy_http_version
proxy_ignore_client_abort # 如果该指令设置为 on ,那么当客户端放弃连接后, Nginx 将不会放弃同上游服务器的连接
proxy_ignore_headers # 当处理来自于上游服务器的响应时,该指令设置哪些头可以被忽略
proxy_intercept_errors # 如果启用该指令, Nginx 将会显示配置的 error page 错误,而不是来自子上游服务器的直接响应
proxy_max_temp_file_size # 在写入内存缓冲区时,当响应与内存缓冲区不匹配时,该指令给出溢出文件的最大值
proxy_pass # 该指令指定请求被传递到的上游服务器,格式为 URL
proxy_pass_header # 该指令覆盖掉在 proxy_hide_header 指令中设置的头,允许这些头传递到客户端
proxy_pass_request_body # 如果设置为 off , 那么该指令将会阻止请求体发送到上游服务器
proxy_pass_request_headers # 如果设置为 off , 该指令则会阻止请求头发送到上游服务器
proxy_redirect # 重写来自于上游服务器的 Location 和 Refresh 头
proxy_set_body # 发送到上游服务器的请求体可能会被该指令的设置值修改
proxy_set_header #
proxy_temp_file_write_size # 该指令限制在同一时间内缓冲到一个临时文件的数据量, 以使得nginx 不会过长地阻止单个请求
proxy_temp_path # 该指令设定临时文件的缓冲 , 用于缓冲从上游服务器来的文件,可以设定目录的层次

带有cookie的遗留应用程序

如果被反向代理服务器设置自己的域和路径的cookie,就要在转发这些服务器请求的时候,对域和路径进行修改

1
2
3
4
5
6
7
8
9
10
server {
server_name app.example.com;

location /legacy1 {
    proxy_cookie_domain legacy1.example.com app.example.com;
    proxy_cookie_path $uri /legacy1$uri;
    proxy_redirect default;
    proxy_pass http://legacy1.example.com/;
  }
}

upstream模块

一般在做反向代理服务器的时候,会使用upstream模块进行做负载均衡或者备份服务,放在http模块中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
... ...
http {
... ...
  upstream loadbalance {
    ip_hash;
    server 172.17.0.2:8095 weight=2;
    server 172.17.0.3:8095 weight=5;
    server 172.17.0.4:8095 backup;
    keepalive 32;
  }
  location / {
    proxy_set_header Connection "";
    proxy_pass http://loadbalance;
  }
}
... ...
1
2
3
4
5
6
7
8
9
ip_hash #该指令通过 IP 地址的哈希值确保客户端均匀地连接所有服务器,键值基于c类地址
keepalive #该指令指定每一个 worker 进程缓存到上游服务器的连接数。在使用 HTTP连接时, proxy_http_version 应该设置为 1.1 ,并且将 proxy_set_header 设置为 Connection ""
least_conn #该指令激活负载均衡算法,将请求发送到活跃连接数最少的那台服务器
server #该指令为 upstream 定义一个服务器地址(带有 TCP 端口号的域名、 IP地址,或者是 UNIX 域套接字)和可选参数。参数如下
#weight :该参数设置一个服务器的优先级优于其他服务器。
#max_fails : 该参数设置在 fail_ timeout 时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么就会被标记为 down 。
#fail_timeout : 在这个指定的时间内服务器必须提供响应,如果在这个时间内没有收到响应,那么服务器将会被标记为 down 状态。
#backup : 一旦其他服务器窑机,那么仅有该参数标记的机器才会接收请求。
#down :该参数标记为一个服务器不再接受任何请求

Keepalive

如果要实现upstream长连接,则每个进程需要另外一个connection pool,里面都是长连接。一旦与后端服务器建立连接,则在当前请求连接结束之后不会立即关闭连接,而是把用完的连接保存在一个keepalive connection pool里面,以后每次需要建立向后连接的时候,只需要从这个连接池里面找,如果找到合适的连接的话,就可以直接来用这个连接,不需要重新创建socket或者发起connect() avatar

非HTTP型的上游服务器

memcached上游服务器
FastCGI上游服务器
SCGI
uWSGI

负载均衡

负载均衡算法

轮询、ip哈希、最少连接数

错误文件处理上游服务器问题

上游服务器无法响应请求的情况,在这些情况下,可以将 Nginx 配置为从它的本地磁盘提供一个文件。

1
2
3
4
5
6
server {
  error_page 500 502 503 504 /50x .html;
  location = /50x.html {
    root share/examples/nginx/html;
  }
}

五、反向代理高级使用

安全隔离

使用ssl对流量进行加密

对于使用浏览器支持的ssl证书,需要付费,这里使用openssl生成一个自签ssl证书,然后进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 443 default ssl;

server_name www.example.com;

ssl_prefer_server_ciphers on;

ssl_protocols TLSvl SSLv3;

ssl_ciphers RC4:HIGH:!aNULL:!MD5:@STRENGTH;#使用RC4算法

ssl_session_cache shared:WEB:10m; # 缓存在所有工作进程之间共享

ssl_certificate /usr/local/etc/nginx/www.example.com.crt; # 指定证书

ssl_certificate_key /usr/local/etc/nginx/www.example.com.key; # 指定key

  location / {

    proxy_set_header X-FORWARDED-PROTO https;

    proxy_pass http://upstream;
  }
}
使用ssl进行客户端身份验证
基于原始IP阻止流量

在编译时,添加GeoIP模块, –with-http_geoip_module,并且在系统中安装了MaxMind GeoIP库,在http中,使用geoip_country指令指定预编译数据库文件文职,通过国家代码,设置阻止/允许IP地址访问,

1
geoip_country /usr/local/etc/geo/GeoIP.dat

变量$geoip_country_code的值讲被设置为ISO俩个字母的原始国家码,然后根据该变量进行控制流量了,如下示例,定义变量$exclusions,默认值是0,当ip是127.0.0.1或者属于172.29.88.0/19,则该值变为1,在之后的逻辑中,当$geoip_country_code为CH时,将$exclusions置为1,从而允许访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
... ...
http {

geoip_country /usr/local/etc/geo/GeoIP.dat;

geo $exclusions {

  default 0;
  127.0.0.1 1;
  172.29.88.0/19 1;
}

  server {

    if ($geoip_country_code = "CH"){

      set $exclusions 1;
    }
    location / {
      if($exclusions = "0"){
        return 403;
      }

      proxy_pass http://upstream;

     }

  }
}

当然,可以使用键值对存储某个ip访问的频率来决定是否限制访问

反向代理服务器性能调优

缓冲数据
1
2
3
4
proxy_buffer_size #
proxy_buffering # 开启从被代理的服务器的响应内容和缓冲,on
proxy_buffers #指定用于响应上游服务器的缓冲数量和大小,默认值是 8 4K 或者8 8K
proxy_busy_buffers_size #

平均请求大小: 800 Byte 平均响应大小: 900 Byte proxy_buffers 240 4K 每个活动的连接是240个4KB缓冲,就是240*4*1024 假设系统能够分配给nginx的内存是768MB,就是768*1024*1024 得到nginx可以支持768*1024*1024 / 240*4*1024 = 819个活动的连接

缓存数据
1
2
3
4
proxy_cache # 定义用于缓存的共享内存区域
proxy_cache_bypass # 指定一个或者多个字符串变量,变量的值为非空或者非零将会导致响应从上游服务器获取而不是缓存
proxy_cache_key #  该指令作为缓存 key 的一个字符串,用于存储或者获取缓存值。可能会使用变量,但是请注意避免缓存的同一个内容有多个副本
proxy_cache_path # 指定-个放置缓存响应和共享内存 zone (keys_zone=name:size )的目录,用于存储活动的 key 和响应的元数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {

proxy_temp_path /var/spool/nginx;

# 缓冲数据的目录在/var/spool/nginx, 响应时间为6个小时,缓存大小为1G,共享内存名称叫CACHE,大小为10M,缓存文件目录层次为两层,缓存目录结构上对某个url的哈希值为 /var/spool/nginx/3/f1/4c16873c96c9db2090134be91cbf13
proxy_cache_path /var/spool/nginx keys_zone=CACHE:10m levels=1:2 inactive=6h max_size=1g;
server {
location / {
  include proxy.conf;

  # 使用CACHE缓存数据
  proxy_cache CACHE ;

  # 对任何响应代码都缓存1天
  proxy_cache_valid any 1d;

  # 在访问上游服务器时返回error、timeout、invalid_header... ...,使用缓存的数据,当数据刷新后再被载入
  proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
  proxy_pass http://upstream;
 }
}
}
存储数据

对于某些从来不会改变的数据,或者说长期不变的数据,没必要设置有效时间,可以直接保留在nginx服务器上,典型的比如说某些js、img、css文件。如果这些文件有更新,则需要手动上出nginx上的备份响应数据,然后才能更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
http {
proxy_temp_path /var/www/tmp;

  server {
    # 定义存储目录
    root /var/www/data

    # 从root指定的目录中查找img文件,如果本地没有,访问@store,即从上游获取文件
    location /img {
      error_page 404 = @store;
    }

    location @store {
      # 限制对该资源的直接访问
      internal;

      #开启存储
      proxy_store on;

      #定义这些文件的权限mode
      proxy_store_access user:rw group:rw all:rw ;
      proxy_pass http://upstream ;
    }
  }
}
压缩数据

压缩上游的服务器的响应能够优化带宽,提升响应速度,gzip默认启用,但是某些浏览器可能不能够响应压缩内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
  #开启压缩
  gzip on;

  #对http1.1版本的请求生效
  gzip_http_version 1.1;

  #压缩等级为2级
  gzip_comp_level 2;

  #以下文件类型需要压缩
  gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript  application/javascript application/json;

  #对于microsoft ie6不压缩
  gzip_disable msie6;
}
1
2
3
4
5
6
7
gzip # on/off
gzip_buffers # 默认32 个 4KB 或者 16 个 8 KB,大小为128KB
gzip_comp_level # 压缩等级 1-9,
gzip_disable # User-Agents的正则表达式,凡是符合的都被禁用
gizp_min_length # 最小需要压缩的长度,这个值与响应中的Content-Length进行比较决定是否需要压缩
gzip_http_version # 高于该版本的请求可以压缩
gzip_types # 除了默认的text/html,需要压缩的MIME类型

六、Nginx HTTP服务器

nginx包含一个master进程和多个worker进程,这些进程都是单线程。master进程负责读取配置文件、处理套接字、派生woker进程、打开日志文件、编译嵌入式Perl脚本,master进程是一个可以通过处理信号响应来管理请求的进程。 worker进程运行在忙碌的时间循环处理中,用于处理进入的连接。每一个nginx模块都被构建在worker中,所以任何qingiqu处理、过滤、处理代理的连接和更多操作都在worker进程中完成。 还有少数辅助程序的nginx的master进程用于处理专门任务,cache loader负责worker进程使用缓存的元数据准备,cache manager 进程负责检查缓存条目即有效期。

HTTP核心模块

server
1
2
3
4
server
server_name
server_name_in_redirect # 在该上下文中,对任何nginx发布的重定向,该指令都使用server_name指令的第一个值激活
server_tokens # 在错误信息中,该指令禁止发送nginx的版本号和server响应头
日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
access_log # 第一个参数是日志文件路经,第二个参数是log_format所定义的日志格式。如果写缓存用于记录日志,第三个参数指明写缓存大小,当第三个参数是gzip,那么缓冲日志将被动态压缩,无法使用log_format参数,且在构建nginx二进制时需要提供zlib库。最后一个参数时flush,表示缓冲日志数据写入到磁盘前能够在内存中停留的最大时间。
log_format # 定义日志格式和该格式名称,格式中可以使用的变量如下,
#$remote_addr, $http_x_forwarded_for 记录客户端IP地址
#$remote_user 记录客户端用户名称
#$request 记录请求的URL和HTTP协议
#$status 记录请求状态
#$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
#$bytes_sent 发送给客户端的总字节数。
#$connection 连接的序列号。
#$connection_requests 当前通过一个连接获得的请求数量。
#$msec 日志写入时间。单位为秒,精度是毫秒。
#$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
#$http_referer 记录从哪个页面链接访问过来的
#$http_user_agent 记录客户端浏览器相关信息
#$request_length 请求的长度(包括请求行,请求头和请求正文)。
#$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
#$time_iso8601 ISO8601标准格式下的本地时间。
#$time_local 通用日志格式下的本地时间。

log_not_found #是否在错误日志中报告404错误,默认是
log_subrequest #是否在访问日中中启用记录子请求,默认不记录
open_log_file_cache #对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下
#max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
#inactive:设置存活时间,默认是10s
#min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
#valid:设置检查频率,默认60s
#off:禁用缓存
#open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
查找文件
域名解析
1
2
resolver #配置一个或者多个域名解析服务器,当使用变量指定上游服务器的时候,必须配置此变量
resolver_timeout #dns查询超时时间
客户端交互
1
2
3
4
5
6
7
8
9
default_type # 默认的MIME类型
error_page # 定义一个错误码和对应uri
etag # 对于静态资源该指令禁止自动产生ETAG相应头,默认值是on
if_modified_since #off 忽略If-Modified-Since头;exact 精确匹配(默认值);before 该参数修改响应时间小鱼或者等于If-Modified-Since
ignore_invalid_headers #禁止忽略无效名字的头(默认值为 on)
merge_slashes #该指令禁止移除多个斜线。 默认值为 on ,这意味着 Nginx 将会压缩两个或者更多个/字符为一个
recursive_error_pages # 启用error_page指令,实现多个重定向,但是默认值是off
types #多数情况下用/etc/nginx/mime.types即可,不用配置该选项
underscores_in_headers #如果使用了on,则在请求头中启用使用下划线字符,当使用了默认值off,那么讲根据ignore_invalid_headers处理

limit

1
2
3
4
5
6
7
8
9
10
11
12
limit_conn # 指定共享内存区域( limit_conn_zone 配置),并且指定每个键值对的最大连接数,以下表示根据ip地址限制,定义一个叫connections为10m的
#limit_conn $binary_remote_addr zone=connections:10m
limit_conn_log_level # 在连接到达限制时,此时将会产生错误日志,该参数用于设置错误级别,可选值 info | notice | warn |error
limit_conn_zone # 设置限制规则、区域名称及分配的内存大小
limit_conn_status # 默认值503,超出limit_conn_status后,返回该客户端错误码
limit_rate # 限制客户端下载速率,字节/秒
limit_rate_after # 完成设定的字节数后,启用limit_rate限制
limit_req_zone # 指定共享内存区域,但是多一个参数表明配置在受到限制之前,请求数速率,以下表示每秒处理1个请求
# limit_req_zone $binary_ remote _addr zone=requests:10m rate=1r/s;
limit_req_log_level #
limit_req #以下表示采用requests限制每秒只处理一个请求,当每秒钟超过1个请求到来的时候,多余的请求存放在缓冲区,但是这个缓冲区只能存放10个请求,多了就返回503,nodelay表示会瞬时提供处理10 + 1 =11个请求的能力,如果没有nodelay,则缓冲区的请求就会排队等待
# limit_req zone=requests burst=10 nodelay

约束访问

1
2
3
4
allow # 允许ip、网段或者值为all的访问
deny # 禁止从ip、网段或者值为all的访问
auth_basic # 默认值off表示不开启http基本认证,当值为一个字符串的时候,该字符串是作用域名
auth_basic_user_file # 指定保存用户名和密码的文件,格式如下,其中的密码是htpasswd或者openss passwd加密后的字符串
1
2
3
# commemt
name1:passwd1
name2:passwd2:comment

实际上,一般不会需要管理员手动编写这样一个密码文件,都是使用ldap认证方式,需要在编译nginx的时候添加nginx-auth-ldap模块。这样才能在配置时使用ldap_server配置。一个典型的配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ldap_server openldap {

        url ldap://192.168.150.20:389/ou=xxx,ou=xxx,ou=xxx,ou=xxx,ou=xxx,dc=xxx,dc=net?mail?sub?(objectClass=xxxxx);

        binddn "cn=xxx,ou=admin,dc=xxx,dc=net";

        binddn_passwd "xx";

        group_attribute memberuid;

        group_attribute_is_dn on;

        require valid_user;
}
...

server{

...

auth_ldap "Restricted Space";
auth_ldap_servers openldap;

...

}

当然,对于更为实际的情况是,当nginx用作反向代理的时候,所代理的服务一般都拥有自己一套账户系统,不需要nginx再做用户认证

1
satisfy # all | any ,默认值为all,对之前的认证无影响;当为any的时候,对allow允许的ip使用不认证,对deny拒绝的ip使用auth_basic认证

流媒体文件

在编译时添加模块 –with-http_flv_module 用于flv文件,–with-http_mp4-module 用于H.264/AAC文件。

1
2
3
4
flv # 在该location中激活flv模块
mp4 #在该location中激活mp4模块
mp4_buffer_size # 设置投递mp4文件的初始缓冲大小
mp4_max_buffer_size # 设置处理mp4元数据使用的最大缓冲

预定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$arg_name
$args
$binary_remote_addr
$content_length
$content_length
$content_type
$cookie_name
$document_root
$document_uri
$host
$hostname
$http_name
$https
$is_args
$limit_rate
$nginx_version
$pid
$query_string
$realpath_root
$remote_addr
$remote_port
$request
$request_body
$request_body_file
$request_completion
$request_filename
$request_method
$request_uri
$scheme
$sent_http_name
$server_addr
$server_name
$server_port
$server_protocol
$status
$tcpinfo_rtt
$tcpinfo_rttvar
$tcpinfo_snd_cwnd
$tcpinfo_rcv_space
$uri

SPDY和HTTP/2

现在对HTTP/2的支持还不够完善,所以基本上用不到。 编译时使用 --with-http_v2_module 激活对HTTP/2的支持

1
2
3
4
5
6
7
http2_chunk_size #设置响应提的最大值
http2_idle_timeout #指定连接关闭后闲置的时间
http2_max_concurrent_streams #设置在单个连接中活动的http/2流的数量
http2_max_field_size
http2_max_header_size
http2_recv_buffer_size
http2_recv_timeout