系列文章目录
lnmp架构lnmp架构-nginx负载均衡以及高可用
- 系列文章目录
- 一、源码编译
- configure(检测预编译环境是否可行)
- make
- make install
- 优化关闭Debug
- 二、 nginx负载均衡
- 三、nginx的高并发
- nginx work数量的设定
- nginx work进程与cpu的静态绑定
- 压力测试
- nginx高并发
- 修改操作系统的限制
- 四、nginx技术阅读文档
- 五、nginx权重以及nginx的健康检测
- 六、nginx ip哈希负载均衡
- 七、基于cookie算法的nginx负载均衡
- 八、 lnmp架构
- 九、数据库的编译
- 系列文章目录
- lnmp架构图
- 一、Mysql的初始化
- 二、php的源码编译
- 三、更改php的配置
- 三、 做nginx和php-fpm的整合
- 四、 nginx + php-fpm + mysqld的整合
- 五、 扩充PHP模块之memcache
- nginx高速缓存
一、源码编译
Nginx web 7 proxy cdn(cache)
www.nginx.com官网 www.nginx.org 下载要下载稳定版本Stable
阿里发行的版本Tengine(修改后的Nginx,二次开发)
源码编译可以灵活定制你需要的功能相比较rpm包安装
源码编译三部曲:
configure (这个是个脚本,gnumake)
make
make install
camke有缓存(有安装进度),gnumake没有缓存,每次都会重新编译
configure(检测预编译环境是否可行)
./configure --help 查看编译的功能模板
如果不指定安装路径一般安装在/usr/local 配置文件放在/usr/local/etc 二进制程序放在 /usr/local/bin(在系统的环境变量里面,echo $PATH)
指定安装路径比较好,以后备份删除修改都方便查找 --prefix=/usr/local/nginx
–with默认不编译,想要编译这个模板就加入–with
–without默认编译,去掉这个功能,就–without
缺少xxx library 在系统一般是xxx-devel(开发包),不是的话yum search找下
编译成功后,会把你之前写的参数写入到Makefile中,执行make的时候回读取当前的Makefile
configure没有生成Makefile的话,make也无法执行
make
编译时间与源代码量和机器性能有关
把源码编译成二进制程序
make install
make install 会把编译好的二进制程序、配置文件等,拷贝到指定的位置/usr/local/nginx,在修改nginx配置的时候要在/usr/loacl/nginx里面的conf修改而不是源码包里面的conf修改
在make install安装完后,可以回收到源码包
源码包/objs
有个绿色的文件nginx(编译好的二进制程序)
在make install的时候会把源码里面拷贝到这个路径
在源码包里面有个conf这里面是它的配置
在安装路径,二进制程序在sbin目录里面
希望让其被系统环境识别
在运行后,它会产生临时的目录
优化关闭Debug
传参(相当于kill)
由于c语言编译会产生很多的临时文件,所以清理
为了更纯净的,可以删掉,重新解压一个tar包
关闭其debug
然后继续configure make make install
优化成功
二、 nginx负载均衡
ps aux 查到Nginx
变更conf文件/usr/local/nginx/conf
ps aux
/usr/local/nginx conf里面这些是gobal
在http里加的参数会直接作用里面所有的server
定义负载均衡器名字westos
location / 当访问/目录的时候
proxy_pass 反向代理http://westos(负载均衡器的名字)
反向代理,负载均衡加速
反向代理,客户端不需要任何操作,代理服务器帮忙
正向代理,客户端需要设置代理服务器(网游和翻墙)
检测语法-t,没有问题就可以刷新服务了
给结点2和结点3开启Httpd服务
http报错5开头一般是服务端有问题,百度直接搜索HTTP状态码
三、nginx的高并发
修改并发到65535,一个进程并发65535
nginx work数量的设定
work数量和你cpu数量是相关的,几个cpu几个work
根据cpu数量自动判断几个work
nginx work进程与cpu的静态绑定
01表示第一个cpu核心,10表示第二个cpu核心
把work的进程和cpu进行静态的绑定,这样可以大量避免cpu上下文切换带来的损耗
具体更多用法查看Nginx work_processes参数
压力测试
httpd自带的ab压测工具 -c 1 一个并发
没有请求失败的,每s速度8000
压力都在server2 server3上去了
由于是反向代理,所以吞吐量(流量要除以2)
netstat-antlpe
大概用了10s左右
nginx高并发
修改操作系统的限制
要添加这个,要不然操作系统默认是1024,突破不了,65535
即改即生效
速度变快了
四、nginx技术阅读文档
阅读官方文档 https://docs.nginx.com/nginx/,学习
五、nginx权重以及nginx的健康检测
设置权重 https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
server2接受的请求就变多了
设置本机的80端口,只要后端有一个服务端存活,就不会启动本机bakeup,在bakeup服务器不要放应用服务,写入此网站正在维护中
关闭后端的server2和server3的httpd,它有健康监测,当后端没有服务器,便会启动自己
六、nginx ip哈希负载均衡
算法,ip哈希(不支持bakeup)
只要来源不变,访问服务器不变
问题:client->dns->CDN(内容分发网络,用来加速,减轻后端server的压力)
client(原地址,目标地址) -> cdn(反向代理)->nginx(获取的地址时cdn的地址,很多客户端过了cdn,地址都变成cdn了)nginx变会调度到同一服务器
如果架构有缓存,不能用哈希ip算法
七、基于cookie算法的nginx负载均衡
手动下线某台机器
这种算法,是那台服务器负载小调度谁,但是这个服务要Nginx plus才能用,收费
所以使用基于cookie的算法
希望不同客户端过cdn都能均衡,过cdn以后ip变成一样
添加算法sticky
Nginx服务启动不来,因为是nginx plus才能使用的,注释掉sticky
替代方法
重新编译
重新进入/usr/local/nginx/conf/nginx.conf
把刚才注释的sticky算法打开
sticky算法,这种算法是基于浏览器的cookie来负载均衡
cookie非常小,每当客户端访问时,server端会给客户端返回一个cookie,这个值交给浏览器(浏览器要支持)(关闭浏览器会被自动清理),之后所有的请求都会带cookie过去,当cookie到服务器时候,会对应服务器内存的sasion,继续由同一个后端处理清理网页缓存后
刷都是server2
不能用curl命令,curl命令不支持cookie
不用原地址做哈希,用cookie来解决,即使过cdn cache都行
八、 lnmp架构
前2列是前面做的负载均衡后面是lnmp架构(电商的平台)
lamp=linux/unix/windows(操作系统) +apache/nginx/…(web服务器)+mysql/pgsql/…(数据库)+php/jsp/python…(动态语言)
通过路由器的等价路由,配合OSPF等价协议,扩展LVS
九、数据库的编译
编译mysql数据库
www.mysql.com下载源码,我们需要编译
也可以下载集成好的包
选择源码下载
下载这个,这个含有c++的boost库,要不然还要额外的下载
第三个版本更新表示修复bug
第二个版本更新新的功能
第一个版本变更表示大变更
编译完要占用10个G,所以/空间一定要够用
里面没有configure(gmake)这个是cmake
pub/docs/有lamp架构的部署文档
\vi因为里面很多特殊字符,用vim就不转译了
安装的时候从真机复制就没问题了
官方推荐创建Build目录,在这个目录里面编译
数据目录也可以挂载远程的存储区
sock没有指定默认在/tmp
数据库的字符集很重要
找不到Boost库
写相对路径和绝对路径都行,我写的是绝对路径
缺少c++编译器
缺少依赖性,告诉你是redhat系统,应该需要这个软件
由于cmake有cache文件
所以
继续编译,编译成功
有个警告
完全编译成功
如果是在真机上面,可以make -j10,开启10cpu一块编译
但是在虚拟机就单线程make编译就行,虚拟机是2G内存,很容易内存溢出,cmake有安装进度,虚拟机可以分配7G内存,一定要给真机留够1G的内存,要不然很容器就卡死了
cmake安装是有进度的
END
系列文章目录
lnmp2lnmp架构2-lnmp架构的搭建
- 系列文章目录
- 一、源码编译
- configure(检测预编译环境是否可行)
- make
- make install
- 优化关闭Debug
- 二、 nginx负载均衡
- 三、nginx的高并发
- nginx work数量的设定
- nginx work进程与cpu的静态绑定
- 压力测试
- nginx高并发
- 修改操作系统的限制
- 四、nginx技术阅读文档
- 五、nginx权重以及nginx的健康检测
- 六、nginx ip哈希负载均衡
- 七、基于cookie算法的nginx负载均衡
- 八、 lnmp架构
- 九、数据库的编译
- 系列文章目录
- lnmp架构图
- 一、Mysql的初始化
- 二、php的源码编译
- 三、更改php的配置
- 三、 做nginx和php-fpm的整合
- 四、 nginx + php-fpm + mysqld的整合
- 五、 扩充PHP模块之memcache
- nginx高速缓存
lnmp架构图
一、Mysql的初始化
将启动脚本考入/etc/init.d/下启动(init方式传统启动脚本)
装了mariadb以后才会有这个文件
这个是Mysql的全局变量参数,在这里面配置的参数是全局生效的,并且持久化
修改mariadb的全局变量参数文件并作为Mysql的全局变量参数文件
包含很多Mysql数据库的配置参数
Mysqld默认会读取的文件
初始化参数,一个是安全的,一个是非安全的
非安全是没有给管理员加密码,你要进去以后加密码
安全的是随机生成了密码
为了安全性,让mysql运行在私有用户中,不是直接在root下运行
运行完以后生成一个随机密码
在启动以后,如果有报错,可以去改路径下去查看
netstat - antlp查看到3306mysql端口已经打开了
已经启动了
生产环境推荐使用的安全安装
将刚才生成随机密码输入,自己设置新的密码后,是否启动密码校验脚本,我选择的是No
启动密码校验脚本的话,会强制你密码的强度,字符串大小写长度等等
刷新数据库的认证数据表
-p后面跟的是密码,进入到了数据库,warning是推荐你不要-p后面直接接入密码,这样别人history就能查到你数据库的密码,不安全使用交互式输入密码
二、php的源码编译
rpm 源码 自动化 容器化安装都行
可以直接去php下载php的源码
我直接在我的服务器下获取
yum install bzip2 -y
–with-config-file是php主配置文件的目录,–enable-fpm激活faster cgi的管理器 --with-fpm-user指定Php运行的时候以什么身份运行,用Nginx当初配Nginx时候的用户,这样可以防止处理权限问题了,不指定,默认是httpd,可不加,你后面可以更改主配置文件来随时更改用户
选项越多,编译的模块依赖性就越多
–with-curl curl命令 iconv 有关图形 --with-mhash加密 --with-zlib 网页压缩 --with-openssl网页加密 --enable-mysqlnd直通数据库,5.4以后默认就会激活Mysql的nd驱动,原生的话要外挂mysql这样会外加模块,占用内存,这个是php自己的模块可以减少内存
mysqlli pdo-mysl都是通过调用mysqlnd来完成
soap是动态模块sockets网页的socket --enable-inline php的优化参数
这些参数连安装rpm包的参数都不够
系统自带的php动态的包,缺什么直接安装
系统优先找rpm包,所以源码编译的时候不要安装rpm包
-libsystemddevel没有
这个包系统不带,我从阿里云下载的
make 以后然后make install
三、更改php的配置
默认配置目录
将php变量加入用户变量中
将default去掉就是它的默认配置文件
;代表注释,去掉该注释
不用变更文件,看看里面的配置
监听端口
进程pm最多5个,默认2个,保持一个空闲
进入php源码里面拷贝所需配置文件
这是主配置文件
考入源码包里面的启动脚本
有两种启动方式
init方式,起名php-fpm
由于编译的使用了–sytemd使用它可以用systemctl来启动
systemd启动:
没有特别具体的报错
错误点READ-only,百度查看
是因为启动了保护,不让在里面写入东西
每次修改这里的文件都需要reload一下
注释掉这个
启动以后,需要去修改配置文件里面的时区
rpm包编译是cgi 无后台程序
源码是fastcgi 有后台程序,所以可以平滑加载
但是后台会消耗大,所以一般会做反向代理和负载均衡
直接访问9000端口访问php意义不大
三、 做nginx和php-fpm的整合
当php处理以php结尾的请求
通过fastcgi递交给后台的9000端口
注释掉是因为这个文件包含了
路径要写自己的与官方不一样
nginx开机自启
查看php自带的内部的信息函数,通常不要让外部主机访问这个Info
四、 nginx + php-fpm + mysqld的整合
如果数据库不在本地还可以指定远程的主机,用户还有密码
测试
php代码写的数据库管理工具
权限没有问题
是找不到它的首页
解决方法
定义默认如何找首页
这里的用户是数据库的用户,不是操作系统里面的用户
root和刚才进入数据库的密码
目录中的other进不去
php和Nginx都是nginx用户针对这个文件是other所以进不去
lnmp搭建完成
五、 扩充PHP模块之memcache
没有config
一定要把php源码路径的安装目录中的Bin放在全局环境中,要不然调用不了phpize
这个指令可以完成预编译环境,其实就是寻找你的动态库
make make install
该模块安装在这个位置
php的主配置文件,php-fpm是php的管理器
写一个扩展参数
平滑加载,重新加载你的主配置文件
-m是列出php所有模块
这个是nosql数据库,做数据库的缓冲,完全运行在内存
传统的关系式数据库结构是存储结构化关系数据
netstat -antlpe监听端口11211端口
nosql数据库,完全运行在内存,默认启动会占用你本机64M的内存量,也可以修改
将数据写入你内存,读写速度快,特点不能做持久化,一重启数据就没有了,内存没有做持久化
好处快,并且降低数据库的压力
连接memache
默认会连接你的11211端口,如果你的memache在远程你可以替换掉你的localhost
编写的就是把数据存入你的内存
数据存入你的内存里面了
监控页面
修改认证的admin和密码,不改也行
memache没有集群的概念是分布的,每个结点,对cpu没有要求,对内存有要求,所以不好的电脑多插入几个内存,可以当memache服务器
远程的话多加几个ip地址就行了
多刷几遍这个
这个页面监控的是在Memache里面的命中率,就是访问example.php页面的时候就是访问的memache
缓存命中率非常高
需要php什么模块就官网搜索下载然后搭建起来
下载进入安装的目录
phpize(加载php安装路径和库)
./configure源码编译三部曲
nginx高速缓存
现在(前面)搭建好的是传统的缓存策略
访问的php页面
80->9000(php-fpm管理器)->调用php进程处理->memache 该方式比Php加载到mysql模块,访问mysql(sql)磁盘,Memache(nosql)内存,访问内存快
这个架构也可以,先访问Memache,有无命中,没有这个去Mysql取,取到后再存入memache
php进程处理
弊端:nginx高并发不能体现出来
因为nginx通过fastcgi这个方式递交给php后端这个方式后,生命周期由后端php来处理**(nginx的反向代理,客户端通过nginx代理到后端的php,而不是直接访问php)**
高并发可以继续处理客户端的请求,但是无法返回客户端需要的数据
由于动态,静态直接nginx给,但是动态的页面则需要到后端的数据库以及memache里面来取
通过压力测试
ab是http的压力测试工具
-c10并发10个,-n5000完成5000次请求
每s处理2000多个请求
高效缓存策略
不需要动态语言的处理,直接返回(非常快),生命周期变成nginx可以发挥好Nginx高并发的特性
需要2个模块,memc(专门连接memache,也可以换成redis,也可以是别的存储,filesystem)和scrache(nginx标准模块,专门处理缓存,可以连接后端不同类型的缓存设施)
默认Nginx没有这些模块,需要到官网下载,进行编译,(麻烦,让nginx支持cookie算法,每次都要编译麻烦)
我使用另一款nginx发行版,openresty
内部就是Nginx,加了lua脚本
适合敏捷的web开发,可以支持web服务器的快速扩展,如动态更新
都是基于lua,更加灵活
这个已经集成了大量的nginx模块,不用安装
同样是web服务器同样是80会冲突,所以先停掉Nginx
有时候服务启动不来,就是端口冲突
所以查看ps ax 和 netstat -antlp
查看有无重复启动服务,和端口冲突没
它的安装参数和Nginx一样,所以直接用直接nginx安装参数就行,内部就是Nginx
但是其默认安装路径就是/usr/local/openresty
make make install
修改主配置文件
对照之前Nginx的主配置文件修改
我直接把/usr/local/nginx/conf/nginx.conf文件考入覆盖掉/usr/local/openresty/nginx/conf
启动openresty
没有问题
定义后端有多少个memache,多个Memache是来负载均衡的,本机127.0.1,如果想要远程输入ip
逻辑,用户访问的url,先到memache看有无该key,没有,通过fastcgi_pass递交给后端的php取,取完后返回值为200就成功,再调用srcache_store 将数据上传到memache,下次直接就可以去memache取
现在是Nginx来控制生命周期了
压力测试
速度变成2w多每s处理数据
END