现代互联网架构
请求过程
1. 建立连接
2. 计算资源
lvs+nginx架构
lvs将请求快速转发到nginx上,不用建立三次握手阶段,处于第四层
nginx处于第七层,将用户请求进行解读,并将其转发到实际处理的服务器上
为什么要使用nginx
技术新,采用异步,非阻塞,速度快
处于需求转发,不需要使用web容器,仅需要web server,损耗低
数据倾斜问题
lvs 四层负载均衡,只是转发数据包
分析用户请求的内容
当一台服务器出现压力或瓶颈的时候
a)镜像多台服务器负载客户端的并发
b)切分服务,将服务按a)负载
介绍
- Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
- 第一个公开版本0.1.0发布于2004年10月4日。
- 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名
- 官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,
- 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。
Nginx和apache的优缺点
- nginx相对于apache的优点:
- 轻量级,同样起web 服务,比apache 占用更少的内存及资源 ,抗并发,nginx 处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低消耗高性能,高度模块化的设计,编写模块相对简单 ,社区活跃,各种高性能模块出品迅速 ,而apache 则是阻塞型的
- Nginx 配置简洁, Apache 复杂
apache 相对于nginx 的优点:
比nginx 的rewrite 强大模块超多,基本想到的都可以找到,少bug ,nginx 的bug 相对较多
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx的启动
在/etc/init.d目录下加入一个nginx文件,把内容复制进去,更改文件权限,使nginx成为一个服务
nginx配置解析
- 什么是虚拟主机
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的
- nginx虚拟主机的配置
通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置
- 基于ip的虚拟主机, (一块主机绑定多个ip地址)
- 基于域名的虚拟主机(servername)
- 基于端口的虚拟主机(listen如果不写ip端口模式)
nginx的匹配规则
location映射
普通location和正则location
普通location匹配的是最大前缀
正则匹配的是顺序匹配,只要匹配到就停止
有两种情况不需要继续正则匹配
1.定义了‘^~’匹配到了就停止
2.精确匹配,匹配到就停止
概括起来就是
先普通
顺序无关
最大前缀
匹配规则简单
打断:
^~
完全匹配
再正则
不完全匹配
正则特殊性:一条URI可以和多条location匹配上
有顺序的
先匹配,先应用,即时退出匹配
nginx和高并发
请求头
host 决策server负责处理 uri 决策location 反向代理 proxy_pass ip:port[uri];
什么是反向代理
正向代理 客户端不能直接访问目标IP,但是代理服务器可以访问目标IP,于是由客户端向代理服务器发出请求,由代理服务器访问目标IP,再将信息返回给客户端 代理客户端 反向代理 服务器并不处理,而是通过解析uri,将包发给目标处理的服务器,由目标服务器处理完成返回给服务器,再由服务器返回给客户端 代理服务器
nginx反向代理的配置
反向代理: proxy_pass location /baidu { proxy_pass http://192.168.9.12【/】; //nginx收到客户端的uri是否传递到上游,由是否在上游域名后有uri设定,没有uri的情况下:传递 } 反向代理配置nginx.conf: upstream 名字 { server IP:PORT; server IP:PORT; } server { location / { proxy_pass http://名字; } } tengine新增健康检查模块 配置一个status的location location /status { check_status; } 在upstream配置如下 check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx;
nginx的session一致性问题
nginx在实际开发中,用户的两次相同的请求可能会通过不同的服务器去响应,所以,必须要能用nginx实现session的一致性问题。http协议是没有状态的,访问再多的网页对于服务器来说是没有区别的,但是在实际应用中必须要让服务器通过某一种方式记住session
cookie
session的常见实现是会话cookie,生命周期为浏览器会话期间
当用户发起请求时,服务器会检查该请求是否包含sessionid,如果没有,服务器会创造一个名为jessionid的输出,cookie返回给浏览器,放在内存里;如果请求中包含session,则服务器会检查找到与该session相匹配的信息,并直接使用该sessionid,这里的session始终是服务器创建的,但是如果浏览器的cookie被禁止后,session就需要通过get方法的url重写或用post方法提交隐藏表单来实现
session共享
在实际中客户端的两次请求可能不是同一台服务器,所以需要实现session共享
Session一致性解决方案
1、session复制
tomcat 本身带有复制session的功能。(不讲)
2、共享session
需要专门管理session的软件,
memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session。
安装memcached
1、安装libevent
2、安装memcached
3、启动memcached
memcached -d -m 128m -p 11211 -l 192.168.9.11 -u root -P /tmp/
d
-d:后台启动服务
m
-m:缓存大小
p
-p:端口
l
-l:IP
u
-u:服务器启动是以哪个用户名作为管理用户
P
-P:服务器启动后的系统进程ID,存储的文件
配置Tomcat
3、拷贝jar到tomcat的lib下,jar包见附件
4、配置tomcat,每个tomcat里面的context.xml中加入
测试session共享
思考
为什么新技术总能替换老技术:新技术符合需求,老技术为了客户不能做出革命性的更改,一切总是技术的不断更新