Nginx


Nginx荣获2012年度云计算开发奖,全球第二大Web服务器;开源、高性能、高并发、简单配置,解决了C10k问题。

但在稳定性方面交老道的Apache稍差一点。

Apache稳定、开源、跨平台,配置稍微复杂,存在C10k问题。

一、Nginx特性:

1、基本功能:

(1)、静态资源的web服务,能自动缓存打开的文件描述符。

(2)、反向代理服务器,负载均衡、缓存。

(3)、支持FastCGI协议,因此能够实现LNMP(Linux Nginx Mysql Php)。

(4)、高度模块化,但非DSO机制。支持多种过滤器(如gzip),SSI和图像大小调整等。

(5)、支持SSL.

2、扩展功能:

(1)、基于名称和IP做虚拟主机。

(2)、支持keepalive

(3)、支持平滑配置文件更新或程序版本升级。

(4)、定制访问日志,以及日志缓存以提高性能。

(5)、支持url rewrite

(6)、支持路径别名。

(7)、支持基于IP以及用户的认证。

(8)、支持速率限制,并发数限制等。

二、Nginx基本架构:

1、一个master,生成一个或者多个worker,一般而言worker数要小于物理cpu数量。

2、事件驱动,kqueue,epoll

3、支持非阻塞如mmap,AIO

4、支持sendfile,sendfile64

三、Nginx模块类别:

1、核心模块

2、标准http模块

3、可选的http模块

4、邮件模块

5、第三方扩展模块

四、Nginx的安装以及配置:

1、编译安装:

安装前确保Development Tools和Server Platform Development,

如未安装请执行#yum -y groupinstall "Development Tools" "Server Platform Development"


(1)、#yum -y install pcre-devel 为了解决依赖关系要装。

(2)、首先添加用户nginx,实现以此用户运行nginx服务进程。

       #groupadd -r nginx

       #useradd -r -g nginx nginx

(3)、#tar xf nginx1.4.7.tar gz

    #cd nginx1.4.7

    # .configure --prefix=/usr 

  --sbin-path=/usr/sbin/nginx 

  --conf-path=/etc/nginx/nginx.conf 

  --error-log-path=/var/log/nginx/error.log 

  --http-log-path=/var/log/nginx/access.log 

  --pid-path=/var/run/nginx/nginx.pid 

  --lock-path=/var/lock/nginx.lock 

  --user=nginx  

  --group=nginx 

  --with-http_ssl_module 

  --with-http_flv_module 

  --with-http_stub_status_module 

  --with-http_gzip_static_module 

  --with-client-body-temp-path=/var/tmp/nginx/client

  --with-proxy-temp-path=/var/tmp/nginx/proxy

  --with-fastcgi-temp-path=/var/tmp/nginx/fcgi

  --with-uwsgi-temp-path=/var/tmp/nginx/uwsgi

  --with-scgi-temp-path=/var/tmp/nginx/scgi

  --with-pcre


   #make && make install


然后启动#/usr/sbin/nginx  ,并执行#ss -tnl 看下80端口。


(4)、开机启动加脚本:


#vi /etc/rc.d/initd./nginx 内容如下:

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

 

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

 

lockfile=/var/lock/subsys/nginx

 

make_dirs() {

   # make required directories

   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

   options=`$nginx -V 2>&1 | grep 'configure arguments:'`

   for opt in $options; do

       if [ `echo $opt | grep '.*-temp-path'` ]; then

           value=`echo $opt | cut -d "=" -f 2`

           if [ ! -d "$value" ]; then

               # echo "creating" $value

               mkdir -p $value && chown -R $user $value

           fi

       fi

   done

}

 

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

force_reload() {

    restart

}

 

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

    status $prog

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

        exit 2

esac


而后为此脚本赋予执行权限:

# chmod +x /etc/rc.d/init.d/nginx


添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx

# chkconfig nginx on


而后就可以启动服务并测试了:

# service nginx start


2、nginx配置 /etc/nginx/nginx.conf

注意:配置参数需要以分号结尾,否则就语法错误,语法格式:参数名 值1 [值2...];

分为两段:核心段和http段,重要参数如下:

参数配置请参考http://nginx.org/en/docs/http/ngx_http_core_module.html

(1)、核心配置段{


A、正常运行必备的配置:

a、user username [groupname];  

 指定运行worker进程的用户和组

b、pid /path/to/pidfile_name;  

 指定nginx的pid文件

c、worker_rlimit_nofile #;  

 指定一个worker进程所能够打开的最大文件句柄数

d、worker_rlimit_sigpending #;  

 指定每个用户能够发往worker进程的信号的数量


B、优化性能相关的配置:

a、worker_processes #;  

 worker进程的个数,通常其值为CPU的物理核心数减1,即1个留给系统内核用。

b、worker_cpu_affinity cpumask ...; 

如共6个cpu,启动四个cpu,则配置为

             worker_processes 4;  

             worker_cpu_affinity 00000001 00000010 00000100 00001000; 

c、worker_priority nice; 

  worker进程的优先级, nice的值为[-20,19],nice越小优先级越高。

d、ssl_engine device; 

  在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备。

e、timer_resolution T; 

 每次内核事件调用返回时,都会调用系统的gettimeofday()来更新nginx缓存时钟,timer_relolution用于定义每隔多久更新一次缓存时钟;X86_64系统上,调用gettimeofday()代价较小,可以忽略此项;X86_32系统上代价较大。


C、事件相关的配置:

a、accept_mutex [on|off]; 

  是否打开nginx负载均衡锁;此锁能够让多个worker轮流地与客户端建立连接;即实现worker间负载均衡。

wKioL1WBOcnC3osLAAB9CECmfrE393.jpg

b、lock_file /path/to/lock_file; 

  lock文件;如果accept_mutex为off,那么lock_file 失效。

c、accept_mutex_delay #ms; 

  accept锁模式中,一个worker进程为取得accept锁的等待时长。默认为 500ms。如果某worker进程在每次师徒取得锁时失败,至少要等待#ms才能再次请求锁。

d、multi_accept{on|off}; 

  是否允许一次性地响应多个用户请求;默认为off,默认一个一个请求被响应处理。

e、use [epoll|rtsig|select|poll]; 

  定义使用的事件模型,建议让nginx自动选择,在linux一般选择epoll;

f、worker_connections #; 

  每个worker能够并发响应的最大请求数;


D、用于调试、定位问题:只在调试nginx时使用。

a、daemon [on|off]; 

  是否让nginx运行于后台;默认为on,调试时为off,使得所有信息输出到控制台,方便查看信息。

b、master_process [on|off]; 

  是否让master管理多个worker运行,默认为on;调试时为off,以方便追踪问题。

c、error_log /path/to/error_log level;   

    错误日志文件以及级别,默认为error级别;调试时可以使用debug级别,

    但要求在编译时必须使用--with_debug启动debug功能。

}


(2)http配置段{

    说明:Nginx必须使用虚拟主机配置站点;

         每个虚拟主机使用一个server{}段配置;

         非虚拟主机的配置或者公共配置,需要配置在server{}外。

         具体格式如下:

directive value;

...

server{

  listen 80;

  server_name localhost;

  location{

        }

}

server{


}

...


A、重要配置详情:

a、server{}:

  定义一个虚拟主机,支持基于主机名或者IP的虚拟主机。

b、listen:

  listen address[:port]

  listen port

  default_server:定义此server为http中默认的server;如果所有的server中没有任何一

              个listen使用此参数,那么第一个server为默认server。

  rcvbuf=SIZE:接收缓冲大小;

  sndbuf=SIZE:发送缓冲大小;

  ssl:https server


c、server_name相关:

  • server_name NAME...;可以跟多个主机名;当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较。

  • server_name_hash_bucket_size 32|64|128;为了实现快速查找主机名,nginx使用hash表保存主机名;


d、location相关:

  根据用户请求的URI,匹配指定的各location,匹配到时将被location来处理。

  location定义在server或者location中,location可以出现多次,但不能放在http上下文中。

  • location [ =|~|~*|^~ ]  uri { ... } 

  • location @name {...}

        =:精确匹配

        ~:正则表达式模式匹配,匹配时区分字符大小写。

        ~*:正则表达式模式匹配,匹配时忽略字符大小写。

        ^~:uri前半部分匹配,不检查正则表达式。

wKioL1WDgaKieJZUAAFq0XSpLLE346.jpg

e、文件路径定义:

  • root path:设置web资源路径,用于指定请求的根文件目录,通常定义在location中。

      如:location / {

        root /www/html;

        index index.html index.htm

        }

        location ^~ /images/ {

        root /web;

        }

       http://www.a.org/images/b.html

       b.html放置用于/web/images/下

  • alias path:用于配置路径别名,只能用于location中。

      如:location / {

        root /www/html;

        index index.html index.htm

        }

        location ^~ /images/ {

        alias /web;

        }

        http://www.a.org/images/b.html

        b.html放置用于/web/下

        注意:root path和alias path配置时,b.html的放置路径。


  • index file...:定义默认页,自左而右匹配。

       如:location / {

        root /www/html;

        index index.html index.htm

        }

  • error_page code ...[=[reponse]] uri;当对于某个请求返回错误是,如果匹配上了error_page指令中设定的code,则重定向指定的页面。如error_page 404 /404.html,error_page可以定义在server或者location中。

      如:location / {

           root /www/html;

           index index.html index.htm

           error_page 404 /404.html

        }

  • try_files path1 [path2] uri;错误重定向。

       如:location /tryfile {

           root /www/html;

           index index.html index.htm

           try_files $uri /tryfile.html

        }


f、网络连接相关的配置:

  • keepalive_timeout time;设置保持连接的超时时长,默认为75s中。

wKioL1WDu7zACLQYAAEriDXE9Ls645.jpg

  • keepalive_request n;在一次长连接上允许承载的最大请求数;

    wKioL1WDvGDBxbMpAADw1VW_pvo688.jpg

  • keepalive_disable [msie6|safari|none];对指定的浏览器禁止使用长连接。

    wKioL1WDvQGi1dC7AAGj4SUEtCE429.jpg

  • tcp_nodelay {on|off} ;对keepalive连接是否使用tcp_nodelay选项。

  wKioL1WDvMPCj9gJAACx1B-tZmk446.jpg

  • client_header_timeout time;读取http请求首部的超时时长。

  • send_timeout time;发送响应的超时时长。

g、对客户端请求的限制:

  • limit_except method...{...};排除请求方法。

wKioL1WDvieSdzpXAAGIvtEp4QY713.jpg  Please note that this will limit access to all methods except GET and HEAD.


  • client_max_body_size SIZE;http请求的包体的最大值,常用于限定客户所能请求的最大包体;

 根据请求首部中的Content-length来检测,以免无用的传输。如:上传附件的限制。

  • limit_rate speed;限制客户端每秒传输的字节数,默认为0,表示没有限制。

    wKiom1WDvSLwxZ99AAJd6YhFLoA391.jpg

  • limit_rate_after time;nginx向客户发送响应报文时,如果时长超出此处制定的时长,则后续的发送过程开始限速;如:下载网站需要限速,web站点一般就不需要限速了 哈哈...

    wKiom1WDvZrSNgjrAADziSw-_TE937.jpg

h、文件操作的优化:

  • sendfile {on|off};是否启用sendfile功能。

  • aio {on|off};是否启用aio功能。

  • open_file_cache max=N [inactive=time]|off;

    是否打开文件缓存功能:

     max:缓存条目的最大值,当满了以后将根据LRU算法进行置换。

     inactive:某缓存条目在指定时长内没被访问时,将自动被删除,默认为60s。

 缓存的信息包括:

   文件句柄、文件大小和上次修改时间。

   已经打开的目录结构。

   没有找到或者没有访问权限的信息。

  • open_file_cache_errors on|off;是否缓存文件找不到或者没有权限访问等相关信息。

  • open_file_cache_valid time;多长时间检查一次缓存中的条目是否超出非活动时长,默认60s

  • open_file_cache_min_use #;在inactive指定的时长内被访问超出此处指定的次数,才不会被删除

i、对客户端请求的特殊处理:

  • ignore_invalid_heads on|off;是否忽略不合法的http首部;on为默认,忽略不合法的http首部;off意味着请求首部中出现不合规的首部拒绝响应。

  • log_not_found on|off;是否将文件找不到的信息记录到错误日志中。

  • resolver address;指定nginx使用的dns服务器地址。

  • resover_timeout time;指定DNS解析超时时长,默认30s;

  • server_tokens on|off;是否在错误页面中显示nginx的版本号。

j、内存以及磁盘资源分配:

  • client_body_in_file_only on | clean | off;

    http的包体是否存储磁盘文件中;非off表示存储,默认为off

    on|clean:clean请求结束后包体文件会被删除,on请求结束后包体文件不会被删除。

  • client_body_in_single_buffer on | off;

http的包体是否存储在内存buffer中,默认为off。

client_body_buffer_size size;nginx接收http包体的内存缓冲区大小,和client_body_in_single_buffer配合使用。client_body_temp_path dir_path [level1 [level2 [level3]]];定义http包体存放的临时目录,可以多级目录;和client_body_in_file_only配合使用。client_header_buffer_size size;正常情况下接收用户请求的http报文header部分时分配的buffer大小,默认为1k。large_client_header_buffers number size;定义存储超大http请求首部的内存buffer大小以及个数。connection_pool_size size;nginx对于每个建立成功的tcp练级诶都会预先分配一个内存池,此处即用于设定此内存池的初始大小,默认为256。

}



3、重要的内置变量:

$uri :当前请求的uri,不带参数;

$host:http请求报文中的host首部,不过请求中没有host,则以处理此请求的虚拟主机的主机名替代。

$request_uri:当前请求的uri,带完整参数;

$hostname:nginx服务器运行在的主机的主机名;

$remote_addr:客户端IP

$remote_port:客户端port

$remote_user:使用用户认证时,客户端用户输入的用户名;

$request_method:请求方法

$server_addr:服务器地址

$server_name:服务器名称

$server_port:服务器端口

$server_protocol:服务器想客户端发送响应时的协议,如http/1.1,http/1.0


五、配置使用Nginx:

1、Nginx虚拟主机的使用:

例如:配置两个虚拟主机:www.a.com和www.b.org


则需要在nginx.conf中配置两个server,具体配置如下:


server{

  listen 80;

  server_name www.a.com;


  location /{

   root /www/a.com;

   index index.html index.htm index.php index.jsp;

  }


  error_page 500 502 503 504 /50x.html;

  location =/50x.html{

       root html;

  }

}


server{

   listen 80 default_server;

   server_name www.b.org;

   root /www/b.org;

}



2、基于IP的访问控制:

access{

   allow

   deny

}

或者在server中直接写

allow

deny


例如仅允许 172.16.0.0/16这个网段访问,配置如下:

allow 172.16.0.0/16

deny all


3、基于用户做访问控制:


location /admin/ {

root /www/b.org;

auth_basic "admin_area";

auth_basic_user_file /etc/nginx/.htpasswd;

}


4、autoindex模块:站点未配置主页时,将站点的所有页面以列表形式显示输出。

            通常不打开,非常危险,只有建立下载站点时才打开。

location /download/ {

   root /www/b.org;

   autoindex on;

}


5、图片防盗链:

(1)、定义防盗链的步骤:

A、定义合规的引用:

 valid_referers none|blocked|server_names|string ...;

B、拒绝不合规的引用:

 if($invalid_referer){

   rewrite ^/.*$ http://www.b.org/403.html 或者 return 404

 } 


(2)、例如:

location ~* \.(jpg|png|gif|jpeg)$ {

  root /www/b.org;

  valid_referers none blocked www.b.org *.b.org ~\.google\. ~\.baidu\.;

  if($invalid_referer){

   rewrite ^/.*$ http://www.b.org/403.html 或者 return 404

  } 

}

注意:~\.google\.允许google的爬虫


6、URL rewrite相关:

URL rewrite使用场景如京东早期的网址为www.360buy.com,现在网址www.jd.com,那么访问www.360buy.com必须自动跳转到www.jd.com;还有服务器升级,文件路径变更,也需要重定向;以及将url跳转等等;


(1)、rewrite regex replacement [flag];


A、flag的值:

  • last:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而重写后的规则会重新发起请求。

  • break:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而重写后的规则不会重新发起请求。

  • redirect:返回302临时重定向。

  • permanent:返回301永久重定向。

B、注意:如果出现死循环,nginx最多循环10次,超出之后会返回500错误。

  一般将rewrite写在location中时都使用break,或者将rewrite写在if上下文中。

如:

location / {

  root /www/b.org;

  rewrite ^/images/(.*)$ /imgs/$1 break;

}

(2)、rewrite_log on|off :

    是否把重写过程记录在错误日志中;默认为off。一般为off,繁忙的服务器一定为off。

(3)、return code:

     用于结束rewrite规则,并且为客户返回状态码,可以使用的状态码有204 400 402-406,500-504等。

 如:if($invalid_referer){

   rewrite ^/.*$ return 404

 } 

7、gzip 压缩:

nginx将响应报文发送至客户端之前可以启用压缩功能,这样能够有效节约带宽,并提高响应至客户端的速度。通常编译nginx时默认会附带gzip压缩的功能,因此可以直接启用之。


http {

    gzip on;

    gzip_http_version 1.0;

    gzip_comp_level 2;

    gzip_types text/plain text/css text/xml text/javascript 

      application/x-javascript application/xml application/xml+ress application/javascript application/json;

    gzip_disable msie6;

}

六、Nginx反向代理及负载均衡:Nginx比LVS好用,并易于配置。


1、正向代理:

  帮一个网络内的多个客户端访问公网的服务叫正向代理,正向代理简言之就是代表客户端。

2、反向代理:

  帮助服务器接收请求的服务叫反向代理,反向代理简言之就是代表服务器端。

3、nginx的两种常用用途:

(1)、静态内容的web服务器。

(2)、反向代理,处理并发连接处理能力很强,因为nginx是先缓存请求,然后一并发到后端服务器。

4、Nginx的proxy模块:Nginx通过proxy模块实现反向代理功能。

(1)、Nginx通过proxy模块实现反向代理功能。

   Nginx在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI、客户端参数或者其    他的处理逻辑将用户请求调度至上游服务器上。nginx在实现反向代理功能时的最重要的指令为      proxy_pass,它能够将location定义的某URI代理至指定的上游

   服务器(组)上。如下面的示例中,location的/uri将被替换为上游服务器上的/newuri.

   location /uri {

    proxy_pass http://www.b.org:8080/newuri;

   }

   不过,这种处理机制中有两个例外。

   第一个例外是,如果location的URI是通过模式匹配定义的,其URI将直接被传递到上游服务器,而    不能为其指定转换的另一个URI。例如:/bbs将被代理为http://www.b.org:8080/bbs

   ,即newuri就不要写了。

   location ~^/bbs {

    proxy_pass http://www.b.org:8080;

   }

   第二个例外是,如果location中使用的是URL重定向,那么nginx将使用重定向后的URI处理请求,    而不再考虑上游服务器上第一的URI。如下例,传递给上游服务器的URI为/index.php?page=      <match>,而不是/index

   location / {

    rewrite /(.*)$ /index.php?page=$1 break;

    proxy_pass http://www.b.org:8080/index;

   }

(2)、proxy模块指令:

   proxy模块可配置的指令参数非常多,它们分别用于定义proxy模块工作时的诸多属性,如连接超时    时长、代理时使用http协议版本等。

  • proxy_connect_timeout:nginx将一个请求发送至上游服务器(upstream server)之前等待的最大时长。默认60s

  • proxy_cookie_domain ;

    将upstream server通过set-cookie首部设定为domain属性修改为指定的值,其值可以为一个字符、串、正则表达式的模式或一个引用变量。

  • proxy_cookie_path ;将upstream server通过set_cookie首部设定的path属性修改为指定的值,其值可以为一个字符串、、正则表达式的模式或一个引用变量。

  • proxy_hide_header ;设定发送给客户端的报文中需要隐藏的首部。


  • proxy_pass ;指定将请求代理至upstream server的url路径。


  • proxy_set_header ;将发送至upstream server的报文的某首部进行重写。


  • proxy_redirect ;重写location并刷新从upstream server收到的报文首部。


  • proxy_send_timeout;在连接断开之前两次发送至upstream server的写操作的最大间隔时长。

      

  • proxy_read_timeout;在连接断开之前两次发送至upstream server接收读操作的最大间隔时长。


5、Upstream 模块实现负载均衡。

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

(1)、upstream name {

      server address [parameters];

    },只能放在http段中,各server只能直接使用IP或者主机名,不要加协议。

  • 示例如下:

   http{

     .....

    upstream webservers {

       server 172.16.1.8 weight=1 max_fails=2 fail_timeout=5;

      server 172.16.1.18  weight=2  max_fails=2 fail_timeout=5;

       server 127.0.0.1:8080 backup;

    }

     

    ......

     server {

      listen 80;

     server_name www.b.org;

      location / {

        proxy_pass http://webservers;

       proxy_set_header X_Real_IP $remote_addr; 

      }

    }


    server {

     listen 8080;

   server_name 127.0.0.1;

   root /www/backup;

 

  }

     ......

    }

  • server address [parameters];的parameters如下:

    weight=#;设置权重

    max_fails=#;最大失败尝试次数,默认为1

   fail_timeout=#;失败尝试超时时长,默认为10s。

  • backup:当转发失败,转发至本机。

  • health_check:健康状态监测。

    health_check [interval=time] [fails=number] [passes=number] [uri=uri] [match=name];

    定义在location中。

    interval:多长时间监测一次

    fails:尝试失败次数,如果超过此次数,则认为失败。

    passes:重新上线次数。

  uri:监测是uri.

   match:自定义状态监测。

wKiom1WI-JvQhE6yAAB_ZmhBJ5E078.jpg

  • ip_hash;用在upstream中,实际上就是源地址hash,实现session绑定。


    wKiom1WI-frBd57_AABrSFHtwe4386.jpg

(2)、缓存区、缓存:提高反向代理的性能。

  • 缓存区设定:

    nginx在默认情况下在将其响应给客户端之前会尽可能接收来自于upstream服务器的响应报文,它会将这些响应报文暂存于本机并尽量一次性地响应给客户端,然而在来自于客户端的请求或来自upstream服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将大大降低nginx的性能。因此在有着更多可用内存的场景中,应该将用于暂存这些报文的缓冲区调大至一个合理值。

    proxy_buffer_size size:设定用于暂存来自于upstream服务器的第一个响应报文的缓冲区大小。

    proxy_buffering on|off:启用缓冲upstream服务器的响应报文,否则,如果proxy_max_temp_file_size指令的值为0,来自upstream服务器的响应报文在接收到的那一刻

    将同步发送至客户端;一般情况下,启用proxy_buffering并将proxy_max_temp_file_size设定为0能够启用缓存响应报文的功能,并能够避免将其缓存至磁盘中。

    proxy_buffers 8 4k|8k:用于缓存来自upstream服务器的响应报文的缓冲区大小。8为8个缓冲区个数,4k|8k为缓冲区大小。

  • 缓存:

    nginx作为反向代理时,能够将来自upstream的响应缓存至本地(一般缓存到磁盘),并在后续的客户端请求同样内容时直接从本地构造响应报文。

    proxy_cache zone|off:定义一个用于缓存的共享内存区域,其可被多个地方调用;缓存将遵从upstream服务器的响应报文首部中关于缓存的设定,如"Expires"、"Cache-Control:no-cache"、"Cache-control:max-age=XXX" 、"private"和"no-store"等,但nginx在缓存时不会考虑响应报文的"Vary"首部。为了确保私有信息不被缓存,所有关于用户的私有信息可以在upstream上通过"no-cache" or "max-age=0"来实现,也可在nginx设定proxy_cache_key必须包含用户特有数据如$cookie_xxx的方式实现,单最后这种方式在公共缓存上使用可能会有风险。因此,在响应报文中含有以下首部或者指定标志的报文将不会被缓存。

    Set-Cookie

    Cache-Control containing "no-cache","no-store","private",or a "max-age" with a non-numeric or 0 value

    Expires with a time in the past

    X-Accel-Expires:0


你可能感兴趣的:(nginx,基本功能,扩展功能)