一个负载均衡的服务器
做邮件代理服务器 用c++写的 性能非常好的
一.nginx安装与简单使用
1.下载nginx:
tar.gz文件 http://nginx.org/
解压到centos
2.安装nginx:
./configure --prefix=/usr/local/nginx
安装时可能错误提示:
./configure: error: the HTTP rewrite module requires the PCRE library.
安装pcre-devel与openssl-devel解决问题
yum -y install pcre-devel openssl openssl-devel
make
make install
3.启动nginx:
./sbin/nginx
4.查看nginx
ps aux|grep nginx
如果删除kill -9 1635
5.停止nginx:
./sbin/nginx -s stop
nginx模块从功能上划分三类:
handlers 处理器模块
proxies 代理类 upstream
Nginx模块主要有4种角色:
(1) core(核心模块):构建nginx基础服务、管理其他模块。
(2) handlers(处理模块): 用于处理HTTP请求,然后产生输出。
(3) filters(过滤模块): 过滤handler产生的输出。
(4) load-balancers(负载均衡模块):当有多于一台的后端备选服务器时,选择一台转发HTTP请求。
模块是如何被调用的?
当服务器启动,每个handlers(处理模块)都有机会映射到配置文件中定义的特定位置(location);
如果有多个handlers(处理模块)映射到特定位置时,只有一个会“赢”(说明配置文件有冲突项,应该避免发生)。
如果handlers(处理模块)把请求反向代理到后端的服务器,就变成另外一类的模块:load-balancers(负载均衡模块)。
负载均衡模块的配置中有一组后端服务器,当一个HTTP请求过来时,它决定哪台服务器应当获得这个请求。
Nginx的负载均衡模块采用两种方法:
轮转法,它处理请求就像纸牌游戏一样从头到尾分发;
IP哈希法,在众多请求的情况下,它确保来自同一个IP的请求会分发到相同的后端服务器。
如果handlers(处理模块)没有产生错误,filters(过滤模块)将被调用。
多个filters(过滤模块)能映射到每个位置,所以(比如)每个请求都可以被压缩成块。它们的执行顺序在编译时决定。
filters(过滤模块)是经典的“接力链表(CHAIN OF RESPONSIBILITY)”模型:一个filters(过滤模块)被调用,完成其工作,然后调用下一个filters(过滤模块),直到最后一个filters(过滤模块)。Nginx完成这个回复。
过滤模块链的特别之处在于,
每个filters(过滤模块)不会等上一个filters(过滤模块)全部完成;
它能把前一个过滤模块的输出作为其处理内容;有点像Unix中的流水线。
过滤模块能以buffer(缓冲区)为单位进行操作,这些buffer一般都是一页(4K)大小,当然你也可以在nginx.conf文件中进行配置。这意味着,比如,模块可以压缩来自后端服务器的回复,然后像流一样的到达客户端,直到整个回复发送完成。
总之,过滤模块链以流水线的方式高效率地向客户端发送响应信息。
nginx模块处理流程
客户端发送HTTP请求 –> Nginx基于配置文件中的位置选择一个合适的处理模块 ->(如果有)负载均衡模块选择一台后端服务器 –> 处理模块进行处理并把输出缓冲放到第一个过滤模块上 –> 第一个过滤模块处理后输出给第二个过滤模块 –> 然后第二个过滤模块又到第三个 –> 依此类推 –> 最后把回复发给客户端。
epoll异步非阻塞
同步:调用时,在没有得到结果之前不会返回,一旦调用之后就得到返回值。
异步:调用在发生之后,立马得到返回,返回没有结果。
同步导致了阻塞
异步可以让服务处于非阻塞状态
二.反向代理具体实现
1.主服务ip在网址执行后,自动执行 主服务ip:8080
[root@centos64 conf]# vi conf/nginx.conf 增加 server{ location/{ proxy_pass http://127.0.0.1:8080; root html; index index.html index.htm; } //重启nginx [root@centos64 nginx]# ./sbin/nginx -s reload
2.一个主服务里配置两个子服务,子服务负载均衡。
主服务ip在网址执行后,以下两个链接会间隔的加载出现。
upstream demo { server 127.0.0.1:8080; server 192.168.72.1:8080; } server{ location/{ proxy_pass http://demo; root html; index index.html index.htm; }
tomcat初始画面 tomcat7/webapps/root/index.html
3.动静分离:
location ~ .*\.(jpg|png|gif){ //正则匹配 root /user/local/images; //此文件下放入静态图片或静态文件1.png } //重启nginx [root@centos64 nginx]# ./sbin/nginx -s reload
输入 主服务ip/1.png
4.一台服务器连接外网,两个域名都连接此服务器。
当两个域名绑定同一个主服务ip后,一个域名对应一个从服务进行访问。
upstream a { server 192.168.72.1:8080; } upstream b { server 127.0.0.1:8080; } server { listen 80; server_name www.a.com; access_log logs/a.access.log; location /{ proxy_pass http://a; index index.html; root html; } } server { listen 80; server_name www.b.com; access_log logs/b.access.log; location /{ proxy_pass http://b; index index.html; root html; } }
C:\Windows\System32\drivers\etc\hosts 添加域名
192.168.92.129 www.a.com
192.168.92.129 www.b.com
5.PC和手机分离
同一个域名,显示不同服务样式
要想让网站适配PC和手机设备,首先要能做出准确的判断。
HTTP请求的Header中的User-Agent可以区分客户端的浏览器类型,
可以通过User-Agent来判断客户端的设备。
//声明变量 set $mobile_rewrite do_not_perform; //判断访问者设备类型 if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") { set $mobile_rewrite perform; } //判断访问者设备类型 if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") { set $mobile_rewrite perform; } if ($mobile_rewrite = perform) { # 手机 } //以上写在server里面 location / { proxy_pass http://127.0.0.1:8080; # 电脑版 if ($mobile_rewrite = perform) { proxy_pass http://192.168.72.1:8080; # 手机版 } }
结合源码看nginx-1.4.0之nginx模块组织结构详解
http://www.cnblogs.com/didiaoxiong/p/3209767.html