前言: 我想通过上一章如何测试Nginx的高性能,想必大家对于NGINX作为一个高性能的web服务器毫无异议;但是NGINX的功能绝不局限于简单的web服务器,NGINX在互联网扮演的角色也并非只是作为web服务器,其实在实际的应用场景下,NGINX更多是用来做web的反向代理.
什么是反向代理: 首先,什么是反响代理服务器? 我认为维基百科已经有一个很好的定义了: 在计算机网络中,反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端作为代理使用,而不是客户端。
使用反响代理有什么好处: •并发 官方测试Nginx在24G内存的机器上,能够处理的并发请求连接数达到过200万。由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化 的设计和自由的许可证使得扩展Nginx功能的第三方模块层出不穷,而且优秀的设计带来了极佳的稳定性,因此其作为Web服务器的反向代理被广泛应用到大流量的网站上,包括腾讯、新浪、网 易、淘宝等访问量巨大的网站。 •可扩展性:
反向代理可以从后端服务器池中添加删除服务器来响应负载; 拥有更完善的控制机制;如请求速率;连接限制;各种授权方案; •缓存: 虽说nginx的缓存是通过硬盘实现的;不过现在不是有什么固态硬盘么? •弹性 加密和SSL加速 负载均衡 缓存静态内容 压缩 减速上传 安全 更多.....
Nginx作为反向代理的特点
NGINX VS LVS 相对于LVS,NGINZ主要用于网络七层的调度,在灵活和有效性方面更具优势,同时它对服务器健康状态的检测也避免了用户访问过程中的连接断线。但是,网络七层信息处理的复杂度也使得NGINX在负载能力和稳定性方面与LVS相比有较大的差距。另外,它目前支持HTTP应用和EMALL应用,在应用场景上不如LVS丰富,而且也不具备现成的双机热备方案。总体而言,实际场景中可以考虑LVS和NGINX的结合使用,其中LVS部署在前端用于处理四层的负载均衡,当需要更细节的负载调度是再启用NGINX以优化调度效果
涉及的模块
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的写操作的最大间隔时长;
如下面的一个示例:
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模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。 此外,upstream模块也能为非http类的应用实现负载均衡,如下面的示例定义了nginx为memcached服务实现负载均衡之目的。
upstream memcachesrvs {
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服务器;
# 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的规则,而后通过重写后的规则重新发起请求;
访问验证 静态文件访问由nginx直接返回
访问动态文件时转入后端php服务器
直接访问域名或IP地址时跳转至主页
不存在文件访问跳转至主页
访问system目录下的静态文件正常
访问system路径跳转至主页
(责任编辑:IT) |