nginx系服务器笔记

nginx

官方文档

tengine

官方文档

nginx 一个fork,针对高性能负载网站做了优化,但是更新维护比较慢,跟不上nginx版本

openrestry

官方文档 官方博客 组件

是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。可以操作数据库。

OpenResty 用在 API 网关的开发上。如Orange、Kong、APISIX,他们都是实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案

区别

Nginx|OpenResty|Tengine–到底该爱谁

实用总结

如果不用lua模块,首先nginx官方版本.

nginx泛域名案例

nginx优化大文件下载

nginx安全指南

nginx常用功能配置

nginx反向代理负载均衡

Electron错误记录

storePicPath:D:\pics
renderer.js:26 e--> Error: EPERM: operation not permitted, stat 'D:\pics\hv4TWmiw77JF10e7E2plB3LGrz2qv5HfosFMwkjh.mp3'
    at statSync (fs.js:1086)
    at Object.e.statSync (electron/js2c/asar_bundle.js:5)
    at renderer.js:26
    at Array.forEach (<anonymous>)
    at a.emptyDir (renderer.js:26)
    at a.clearDir (renderer.js:26)
    at a.<anonymous> (renderer.js:26)
    at r (renderer.js:26)
    at Generator._invoke (renderer.js:26)

Installer integrity check has failed Common causes include  incomplete download and damaged media Contact the installer's author to obtain a new copy more infomation at http://nsis.sf.net/NSIS_Error

原因安装包不完整

PHP debug 笔记

简单方式

修改php错误级别,var_dump(),print_r(),die(),exit() 人工断点。

Pecl扩展方式

yasd

出现了coredump

[24-Jul-2022 08:55:01] WARNING: [pool yangliuan] child 14755 said into stdout: “[yasd] Connect IDE failed (Connection refused), please check that the IDE is in a listening state”

child 14756 exited on signal 11 (SIGSEGV – core dumped) after 991.060461 seconds from start

zend xdebug

框架debug工具包

Laravel Telescope

laravel-debugbar

maximebf/php-debugbar

gdb 调试 coredump

什么是coredump

相关文章

coredump调试记录 – PHP篇

使用GDB调试PHP core dump

Generate PHP core dumps on segfaults in PHP-FPM

一个低概率的PHP Core dump

coredump配置、产生、分析以及分析示例 

什么是Core Dump?

Webman/Workman使用笔记

数据库迁移文件Phinx

如何刷新所有回滚

不能直接刷新所有回滚,创建完第一个迁移之后,使用断点命令打上断点,方便后边刷新所有回滚,这样只会滚两次就可以了。

phinx breakpoint -e development -t 20120103083322(第一个迁移的时间版本)

数据模拟的库

改用 https://fakerphp.github.io/#installation,原先的过时了。

ubuntu内核相关配置

Ubuntu 18.04 LTS以上版本 修改Limit(打开文件数)

文件 /etc/security/limits.conf
* soft nofile 1024000
* hard nofile 1024000
* soft nproc 1024000
* hard nproc 1024000
root soft nofile 1024000
root hard nofile 1024000
root soft nproc 1024000
root hard nproc 1024000

文件 /etc/systemd/user.conf
DefaultLimitNOFILE=1024000

文件 /etc/systemd/system.conf
DefaultLimitNOFILE=1024000

消息队列指南

应用场景

在单体应用里面需要用队列解决的问题,在分布式系统中大多都可以用消息队列来解决。

解决多个系统之间的通讯需求

异步处理任务

流量控制

服务器解耦

发布 / 订阅系统实现一个微服务级系统间的观察者模式

连接流计算任务和数据

用于将消息广播给大量接收者

问题和局限性

引入消息队列带来的延迟问题

增加了系统的复杂度

可能产生数据不一致的问题

项目应用案例

Redis常用

基础入门教程

中文官方文档

数据结构常见的应用方式

Redis Strings 字符串

值最大不能超过 512MB

字符串类型对应常用命令

业务不经常变更的数据,接口响应的json字符串等

图片的base64的值

数值秒杀数量之类的,INCR , INCRBYDECR , DECRBY 命令(内部就是同一个命令,只是看上去有点儿不同)会将字符串解析成整数进行原子操作。原子操作意味着多个客户端对同一个key发出INCR命令,也决不会导致竞争的情况。

统计数据,每小时更新访客信息计数器,GETSET可以和INCR一起使用实现支持重置的计数功能

redis> INCR mycounter //访问
(integer) 1
redis> GETSET mycounter "0" //获取并重置计数
"1"
redis> GET mycounter //获取重置后的数据
"0"
redis> 

为减少等待时间,也可以一次存储或获取多个key对应的值,使用MSETMGET命令

> mset a 10 b 20 c 30
OK
> mget a b c //返回由值组成的数组
1) "10"
2) "20"
3) "30"

Redis Hash 哈希

hash (散列) 指令的完整列表

特别适合用于存储对象,Redis 中每个 hash (散列) 可以存储 232 – 1 键值对(40多亿)

系统参数常量配置功能

Redis Lists 列表

list常用命令

简单的消息队列

lpoprpush(或者反过来,lpushrpop)能实现队列的功能,BLPOP,BRPUSH阻塞式实现消息队列。

朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。

限速器,可用于限制某个用户访问某个接口的频率,比如秒杀场景用于防止用户快速点击带来不必要的压力

好友关系,利用集合的一些命令,比如交集、并集、差集等,实现共同好友、共同爱好之类的功能

Redis Set 集合

 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis Sorted Set 有序集合

 string 类型元素的集合,且不允许重复的成员,每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

发布/订阅

Redis 发布订阅简单教程

Pub/Sub发布订阅中文文档

redis实现消息队列(轻量级)的方案

消息队列的考验:Redis有哪些解决方案?

消息队列特征 基于List 基于streams 基于发布订阅
消息保序适用LPUSH/RPOP使用ADD/XREAD
阻塞读取适用BRPOP使用XREAD block
重复消息处理生产者自行实现全局唯一IDStreams自动生成全局唯一ID
消息可靠性适用BRPOP LPUSH使用PENDING List自动留存消息,使用XPENDING查看,使用XACK确认消息
适用场景Redis5.0之前版本的部署环境消息总量少Redis5.0及以后的版本的部署环境消息总量大,需要消费组形式读取数据

缓存使用常见问题

如何保证双写一致性

Cache Aside Pattern 模式

读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。

更新的时候,先更新数据库,然后再删除缓存。删除缓存而不更新缓存的原因:有些需要进行复杂计算或查询的缓存场景,更新的操作成本太高。

不一致场景及解决方案

先删除缓存再更新数据库

进行更新操作时,先删除缓存,然后更新数据库,后续的请求再次读取时,会从数据库读取后再将新数据更新到缓存

先更新数据库再删除缓存

进行更新操作时,先更新 MySQL,成功之后,删除缓存,后续读取请求时再将新数据回写缓存。

存在的问题:更新 MySQL 和删除缓存这段时间内,请求读取的还是缓存的旧数据,不过等数据库更新完成,就会恢复一致,影响相对比较小。

异步更新缓存

数据库的更新操作完成后不直接操作缓存,而是把这个操作命令封装成消息扔到消息队列中,然后由 Redis 自己去消费更新数据,消息队列可以保证数据操作顺序一致性,确保缓存系统的数据正常。

Redis 缓存击穿、穿透、雪崩

相关文章和面试问题

Redis必知必会20问

如何保证缓存(redis)与数据库的双写一致性

缓存一致性,缓存穿透,缓存击穿,缓存雪崩解决方案分析

PHP+Redis 有序集合实现 24 小时排行榜实时更新

redis的五种数据结构和应用场景【如微博微信点赞/共同关注/加购物车】

真实项目中应用案例记录

LBS相关应用总结

根据ip获取位置机构信息

geoip

https://github.com/Loyalsoldier/geoip

本项目每周四自动生成 GeoIP 文件,同时提供命令行界面(CLI)供用户自行定制 GeoIP 文件,包括但不限于 V2Ray dat 格式路由规则文件 geoip.dat 和 MaxMind mmdb 格式文件 Country.mmdb

https://github.com/Hackl0us/GeoIP2-CN

小巧精悍、准确、实用 GeoIP2 数据库

https://github.com/maxmind/GeoIP2-php

geoip2 php sdk

https://github.com/Torann/laravel-geoip/tree/master/src

geoip laravel 扩展包

geoip2数据库官方下载地址

相关文章

深入浅出 Symfony2 – 结合 MongoDB 开发 LBS 应用

电子围栏