Nginx服务器部署负载均衡反向代理
LVS Nginx HAProxy的优缺点
三种负载均衡器的优缺点说明如下:
LVS的优点:
1、抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;
2、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;
3、应用范围比较广,可以对所有应用做负载均衡;
4、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
LVS的缺点:
1、软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
2、如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Nginx的优点:
1、工作在OSI第7层,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比HAProxy更为强大和灵活;
2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;
6、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;
7、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;
Nginx的缺点:
1、Nginx不支持url来检测。
2、Nginx仅能支持http和Email,这个它的弱势。
3、Nginx的Session的保持,Cookie的引导能力相对欠缺。
HAProxy的优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;
反向代理:代理服务器 正向:代理客户端
RESTFUL API 前后端分离
- 前端的数据发送与接收
1)提交表单数据
2)提交JSON数据 - 后端的数据接收与响应
1)接收GET请求数据
2)接收POST请求数据
3)响应请求
关于restful api:
设计:
协议 HTTPS
域名:
应该尽量将API部署在专用域名之下。
https
api
example
com
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
https
example
org
https
api
example
com
路径
- § https://api.example.com/v1/zoos
- § https://api.example.com/v1/animals
- § https://api.example.com/v1/employees
Url:/api/v1.0/smscode/<mobile>&text=imagecode&id=image_code_id
Url:/api/版本号/路径
前后端分离:各负责各的接收ajax 返回json数据
Django应该擅长什么
FastDfs
分布式文件储存系统 一种允许文件通过网路在多台主机上分享的文件系统,可让机器上的多用户分析那个文件和存储空间 建议大小 4kb<file_size<500MB
构架
追踪服务器 均衡作用负责管理所有的存储服务器和组别
存储服务器 提供容量和备份服务 以group为单位 给个group有多个存储服务器 依赖于本地服务器 一个崩溃了恢复数据只能依靠组别里的其他机器 新鞋的文件会哈希的形式写进去
客户端 是上传下载的服务器,也就是项目部署的服务器 每个服务器都要安装nginx
Mysql语句储存过程存储优化
存储过程:
DELIMITER // 声明语句结束符,用于区分;
CEATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程
BEGIN …. END 存储过程开始和结束符号
SET @p_in=1 变量赋值
DECLARE l_int int unsigned default 4000000; 变量定义
Mysql 优化原理:
选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。越简单的数据类型在计算时需要更少的CPU周期,比如,整型就比字符操作代价低,因而会使用整型来存储ip地址,使用DATETIME来存储时间,而不是使用字符串。
1选取最实用的字段属性 在可能的情况下尽量包字段设置为nonull 查询时就不需要比较null
2.使用连接(join)来代替子查询(sub-queries)因为不需要创建临时表
3.使用联合来代替手动创建的临时表 将多条select查询语句合并为一个
4.事务 一系列语句来完成一个事务 如果一个语句错了就全错 可以保持数据库中的数据的一致性和完整性 begin开始 commit结束 rollback可以把数据库恢复到begin之前
可以利用锁定数据库的方法来为用户提供一种安全的访问方式,保证用户的操作不被其他用户干扰
- 锁定表 继承第4点 处理延迟 由用户锁定带来延迟
- 外键 锁定表维护数据的完整性,不能保证数据的关联性 我们可以使用外键 定义的方法是在CREATETABLE语句中加上TYPE=INNODB
- 使用索引 可以令数据库以比没有索引快的多的速度检索 尽量不要给一个有大量重复的值得字段建立索引 这样没用 还降速
- 优化的查询语句 首先最好是在相同类型的字段间进行比较的操作 其次在建有索引的字段上尽量不要使用函数进行操作 第三在搜索字符型字段,我们有时使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的
Redis 储存类型开发中的应用以及持久化的概念和启用方法
Redis
list(名字:内容)
set(无序集合)
hash(键:多个属性)
string(一个key对应一个value)
Zset(有序集合)
开发中的应用:
可以使用list存储历史记录 用hash来存储个人信息
持久化和启用方法
RDB(全量写入):将内存的数据库写到本地磁盘 启用:在redis.conf设置
AOF(增量写入):记录数据库操作比RDB有更好的恢复完整性 redis重启优先启用
多线程服务器
多线程:thread
Scrapy 反反爬虫机制
- 禁用cookies COOKIES_ENABLED=False
- 设置下载延迟 DOWNLOAD_DELAY=3
- 设置下载中间件
- Ip池 vpn和代理ip
- 使用crawlera(专用于爬虫的代理组件)正确配置和设置下载中间键后项目所有的request都是通过crawlera
- cookied池
- 动态设置User-Agent
多线程多进程的区别
多线程的优点:无需跨进程边界 程序逻辑和控制方式简单 所有线程可以直接共享内存线程方式消耗的总资源比进程方式好
缺点:每个线程与主进程公用地址空间 受限于2GB的空间 线程之间的同步和加锁控制比较麻烦。一个线程的崩溃可能影响整个程序的稳定性
多进程的优点:每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系; 通过增加CPU,就可以容易扩充性能; 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系; 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
缺点:逻辑控制复杂,需要和主程序交互; 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大; 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……
进程优点:顺序程序的特点具有隔离性和再现性
程序的并发执行和资源共享,多道程序设计出现后实现了程序的并发执行和资源共享,提高了系统的效率和系统的利用率
缺点:操作系统调度切换多个线程比切换调度进程在速度上快的多,并且进程间内容无法共享通讯比较麻烦
线程缺点:调度要保存线程状态频繁调度,需要占用大量的机时 程序设计容易出错
优点:一种节俭的多任务操作方式 使用相同的地址空间共享大部分数据切换的时间远小于切换进程需要的时间 使多CPU系统更加有效
Scrapy-redis 分布式爬虫原理
Mongodb的爬虫中的应用开启方式
Python标准库递代器生成器装饰器在开发中的实际应用
Git的使用
14_赵文化 08:30:12
函数作用域
a = 1
def func(a):
a += 1
print(a)
深拷贝,浅拷贝
copy.copy() 和 copy.deepcopy()方法的不同
celery发邮件流程
redis如果服务器宕机了,该怎么办,怎么解决
每个分类有不同商品,每个商品有不同规格,可以按照不同规格的商品下单,按照这个设计一个api希望前端给你返回什么数据
用代码实现以下pagenatior的具体内容
线上服务器出现了问题,你应该怎么解决
14_赵文化 08:51:35
git 中rebase和merge的区别,reset和revert的区别
进程,线程,协程分别是什么,区别为什么
静态方法是什么,有什么应用场景
celery发送邮件,任务函数是以什么数据类型保存在redis中
python内存是如何进行管理的
数据库如何优化
递归层级过高会存在什么问题
fastdfs实现原理
迭代器,生成器,装饰器的原理,手写一个生成器和装饰器
TCP HTTP 网络协议
Flask框架开发需要擅长什么
Celery
第三方JDK的使用
分页
Xpath使用