Nginx 作为反向Proxy 的优化要点

jopen 10年前

常用优化要点

当nginx用于反向代理时,每个客户端将使用两个连接:

一个用于响应客户端的请求,另一个用于到后端的访问;

    如果机器是两核CPU,例如:

    $ grep ^proces /proc/cpuinfo | wc -l  2

    那么,可以从如下配置起步:

    # One worker per CPU-core.  worker_processes  2;  events {      worker_connections  8096;      multi_accept        on;      use                 epoll;  }  worker_rlimit_nofile 40000;  http {      sendfile           on;      tcp_nopush         on;      tcp_nodelay        on;      keepalive_timeout  15;  }

    标准的代理配置

    下面是一个基本的反向代理配置模板,将所有请求都转发给指定的后端应用。

    例如,到http://your.ip:80/的请求都将重定向到 http://127.0.0.1:4433/ 私有服务器:

    # One process for each CPU-Core  worker_processes  2;  # Event handler.  events {      worker_connections  8096;      multi_accept        on;      use                 epoll;  }  http {       # Basic reverse proxy server       upstream backend  {             server 127.0.0.1:4433;       }       # *:80 -> 127.0.0.1:4433       server {              listen       80;              server_name  example.com;              ## send all traffic to the back-end              location / {                   proxy_pass        http://backend;                   proxy_redirect    off;                   proxy_set_header  X-Forwarded-For $remote_addr;              }       }  }

    下面,我们将在此基础上进行优化。

    缓冲控制

    如果禁止缓冲,那么当Nginx一收到后端的反馈就同时传给客户端。

    nginx 不会从被代理的服务器读取整个反馈信息。

    nginx可从服务器一次接收的最大数据大小由  proxy_buffer_size 控制。

    proxy_buffering    off;  proxy_buffer_size  128k;  proxy_buffers 100  128k;

    缓存和过期控制

    上面的配置是将所有请求都转发给后端应用。为避免静态请求给后端应用带来的过大负载,我们可以将nginx配置为缓存那些不变的响应数据。

    这就意味着nginx不会向后端转发那些请求。

    下面示例,将*.html, *.gif, 等文件缓存30分钟。:

    http {       #       # The path we'll cache to.       #       proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:60m max_size=1G;  }              ## send all traffic to the back-end              location / {                   proxy_pass  http://backend;                   proxy_redirect off;                   proxy_set_header        X-Forwarded-For $remote_addr;                   location ~* \.(html|css|jpg|gif|ico|js)$ {                          proxy_cache          cache;                          proxy_cache_key      $host$uri$is_args$args;                          proxy_cache_valid    200 301 302 30m;                          expires              30m;                          proxy_pass  http://backend;                   }              }

    这里,我们将请求缓存到 /tmp/cache,并定义了其大小限制为1G。同时只允许缓存有效的返回数据,例如:

    proxy_cache_valid  200 301 302 30m;

    所有响应信息的返回代码不是 "HTTP (200|301|302) OK" 的都不会被缓存。

    对于例如workpress的应用,需要处理cookies 和缓存的过期时间,通过只缓存静态资源来避免其带来的问题。

    验证

    优化配置的效果需要实践检验,建议部署一个监控工具,监控的内容应包括:

    Nginx:开源版提供的监控指标,仅有如下7个指标:

    Connections,Accepts,Handled,Requests,Reading,Writing,Waiting,

    为便于分析统计,在Hyperic中可扩展为10个指标,增加了三个派生指标,每分钟的接收,请求和处理的数量:

    Accepts per Minute,Handled per Minute,Requests per Minute

    Nginx 作为反向Proxy 的优化要点

    从操作系统的角度:应包括Nginx进程的CPU使用率,内存占用,整体CPU使用率,交换区使用率等指标。

    如果是在虚拟机上运行,还应关注 操作系统的 ST( Steal Time)指标,判断是否有超卖,过载等现象;

    参考资源:

    http://tweaked.io/guide/nginx-proxying/

    网络管理软件hyperic hq监控和管理Nginx

    Hyperic 监控 Nginx1.6 配置过程

    下载免费开源Hyperic

    来自:http://my.oschina.net/hyperichq/blog/405421