NGINX 反向代理

前言:

  我想通过上一章如何测试Nginx的高性能,想必大家对于NGINX作为一个高性能的web服务器毫无异议;但是NGINX的功能绝不局限于简单的web服务器,NGINX在互联网扮演的角色也并非只是作为web服务器,其实在实际的应用场景下,NGINX更多是用来做web的反向代理.

 

什么是反向代理:

首先,什么是反响代理服务器?  我认为维基百科已经有一个很好的定义了:

在计算机网络中,反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端作为代理使用,而不是客户端。

 

使用反响代理有什么好处:

•并发

官方测试Nginx在24G内存的机器上,能够处理的并发请求连接数达到过200万。由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化 的设计和自由的许可证使得扩展Nginx功能的第三方模块层出不穷,而且优秀的设计带来了极佳的稳定性,因此其作为Web服务器的反向代理被广泛应用到大流量的网站上,包括腾讯、新浪、网 易、淘宝等访问量巨大的网站。

•可扩展性:

反向代理可以从后端服务器池中添加删除服务器来响应负载;

•七层路由:

拥有更完善的控制机制;如请求速率;连接限制;各种授权方案;

•缓存:

虽说nginx的缓存是通过硬盘实现的;不过现在不是有什么固态硬盘么?

•弹性

加密和SSL加速 负载均衡  缓存静态内容  压缩  减速上传  安全  更多.....

 

Nginx作为反向代理的特点

  • 接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送后后端web服务器,极大的减轻后端web服务器的压力;

  • nginx代理和后端web服务器间无需长连接;

  • 发送响应报文时,是边接收来自后端web服务器的数据,边发送给客户端的;

  • 调度灵活。NGINX工作在网络协议栈的第七层,能够对HTTP应用请求进行解析和分流,支持比较复杂的正则规则,具有更优化的负载均衡效果。
  • 网络依赖型低。NGINX对网络的依赖程度非常低,理论上讲,只要能够ping通就可以实施负载均衡,而且可以有效区分内网和外网流量。
  • 支持服务器检测。NGINX能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上。

 

NGINX VS  LVS

  相对于LVS,NGINZ主要用于网络七层的调度,在灵活和有效性方面更具优势,同时它对服务器健康状态的检测也避免了用户访问过程中的连接断线。但是,网络七层信息处理的复杂度也使得NGINX在负载能力和稳定性方面与LVS相比有较大的差距。另外,它目前支持HTTP应用和EMALL应用,在应用场景上不如LVS丰富,而且也不具备现成的双机热备方案。总体而言,实际场景中可以考虑LVSNGINX的结合使用,其中LVS部署在前端用于处理四层的负载均衡,当需要更细节的负载调度是再启用NGINX以优化调度效果

 

 

涉及的模块

  • Proxy:标准的HTTP模块,实现反向代理功能

  • Upstream:标准的HTTP模块,对后端web服务器调度做负载均衡功能;

  • FastCGI:标准HTTP模块,将php动态请求代理至后端PHP服务器;

 

proxy模块的指令:

proxy模块的可用配置指令非常多,它们分别用于定义proxy模块工作时的诸多属性,如连接超时时长、代理时使用http协议版本等。下面对常用的指令做一个简单说明。
proxy_connect_timeout:nginx将一个请求发送至upstream server之前等待的最大时长;
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:将发送至upsream server的报文的某首部进行重写;
proxy_redirect:重写location并刷新从upstream server收到的报文的首部;
proxy_send_timeout:在连接断开之前两次发送至upstream server的写操作的最大间隔时长;

  如下面的一个示例:
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size 10m;
  client_body_buffer_size 128k;
  proxy_connect_timeout 30;
  proxy_send_timeout 15;
  proxy_read_timeout 15;

 

upstream模块:

与proxy模块结合使用的模块中,最常用的当属upstream模块。upstream模块可定义一个新的上下文,它包含了一组宝岛upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。
upstream模块常用的指令有:
ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至同一个upstream服务器;
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
least_conn:最少连接调度算法;
server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
weight:权重;
max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
fail_timeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器;
down:手动标记其不再处理任何请求;

例如:
upstream backend {
server www.magedu.com weight=5;
server www2.magedu.com:8080 max_fails=3 fail_timeout=30s;
}


upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。


此外,upstream模块也能为非http类的应用实现负载均衡,如下面的示例定义了nginx为memcached服务实现负载均衡之目的。


upstream memcachesrvs {
server 172.16.100.6:11211;
server 172.16.100.7:11211;
}

server {
location / {
set $memcached_key "$uri?$args";
memcached_pass memcachesrvs;
error_page 404 = @fallback;
}

location @fallback {
proxy_pass http://127.0.0.1:8080;
}

 

 

FastCGI模块常用命令:

fastcgi模块的常用指令:
        fastcgi_pass: 指定fastcgi服务监听端口、地址;也支持使用Unix sock;
        fastcgi_bind: 指定联系fpm服务时使用的地址;
        fastcgi_param: 定义传递给fpm服务器的参数;
        fastcgi_index: php的主页面文件;


        结果可以缓存,缓存空间使用fastcgi_cache_path定义,使用fastcgi_cache来调用;
        fastcgi_cache_path    fastcgi数据的缓存路径
        fastcgi_cache       fastcgi启用数据缓存
        fastcgi_cache_valid    fastcgi启用并让其生效
        fastcgi_connect_timeout: 连接fastcgi服务器的超时时长;
        fastcgi_send_timeout: 向fastcgi服务传输数据的超时时长 ;

 

 

 

配置部署

说明:本篇中,Nginx负责静态访问处理,动态访问将会被代理至后端PHP服务器;

wKiom1NiFeCx4dQYAAD1fw2YxNs045.jpg

# vi  /etc/nginx/nginx.html
worker_processes  2;
pid    /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       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"';
    sendfile        on;
    keepalive_timeout  65;
    upstream backend {
        server    172.16.25.112:9000;
    }
    server {
        listen          80;
        server_name     xxrenzhe.lnmmp.com;
        access_log/var/log/nginx/lnmmp.access.log;
        error_log/var/log/nginx/lnmmp.errors.log notice;
        root           /www/lnmmp.com;
        location / {
            try_files $uri @missing; # 先访问本地的静态资源,若失败,则转入missing处理块;
        }
        location @missing {
            rewrite ^(.*[^/])$ $1/ permanent; # 直接访问域名或IP地址时,在其后增加结尾符/,并返回301
            rewrite ^ /index.php last; # 将始终无法访问到的资源(如404错误),全部重定向至首页
        }
        # 禁止system目录访问,但允许指定类型的静态文件访问
        location ~* ^/system/.+\.(jpg|jpeg|png|gif|css|js|swf|flv|ico)$ {
            expires max;
            tcp_nodelay off;
            tcp_nopush on;
        }
        # 访问/system/时,则直接跳转回首页                                            
        location ~ /system/ {
            rewrite ^ /index.php last;                   
        }
        location ~* \.php$ {
            default_type text/html;
            charset      utf-8;
            fastcgi_pass backend;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;
break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由TenGine进行后续操作;
redirect: 返回302临时重定向;
permanent: 返回301永久重定向;
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/media/$2.mp3 break;
}
TenGine最多循环10次,超出之后会返回500错误;

 

 

 

访问验证

静态文件访问由nginx直接返回

wKioL1NiFomAMhKYAAtdEUJa2Ow800.jpg

访问动态文件时转入后端php服务器

wKiom1NiFwjhmJVOAAjEzMM-OIg422.jpg

直接访问域名或IP地址时跳转至主页

wKiom1NiFyvQxIdwABANzJylcgo496.jpg

不存在文件访问跳转至主页

wKiom1NiF1CTQbKdABCCiKiBL_4928.jpg

访问system目录下的静态文件正常

wKioL1NiF1TAHgJ9AAm7Aa4fUBM015.jpg

访问system路径跳转至主页

wKiom1NiF6vDQG9WABKWfmR2ebQ603.jpg

 

posted @ 2014-05-04 17:15  想想宝宝  阅读(8410)  评论(4编辑  收藏  举报