Nginx 作为反向Proxy 的优化要点

 

常用优化要点

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

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

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

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

那么,可以从如下配置起步:
# 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进程的CPU使用率,内存占用,整体CPU使用率,交换区使用率等指标。

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

超卖:超卖是指主机商在一台服务器上放了太多的VPS账户,如果遇到所有的VPS账户同时使用所有的资源,就会出现服务器无法访问的情况,严重时硬件瘫痪 、数据丢失。但超卖很难察觉。有时通过 ST 指标可以看到。