物联网开发和网络编程需要掌握哪些知识?

MCU 参考

微控制单元,俗称单片机

micro python

在单片机上运行的精简python版本

socket 通信

粘包,少包,数据在内存中的存储字节序列解析及封装,包括 socket 优化及多进程时 socket 与惊群的效应问题解决办法

关于通信协议最基础的你必须知道 MQTT 协议及 MQTT-SN 协议的解释及封装和算法,我们的传感器设备大部分是 MQTT-SN 和字节流通信协议。

用到的时候后续补充

NVM安装和使用

https://github.com/nvm-sh/nvm

参考github

要安装或更新nvm,应运行安装脚本。为此,您可以手动下载并运行脚本,也可以使用以下cURL或Wget命令:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

运行以上任一命令将下载一个脚本并运行它。该脚本会将nvm存储库克隆到〜/ .nvm,并尝试将以下代码段中的源代码行添加到正确的配置文件(〜/ .bash_profile,〜/ .zshrc,〜/ .profile或〜/ .bashrc)

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

更换镜像

export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node

安装node

nvm install node 安装默认版本
nvm install 12.16.2 安装指定版本

npm修改镜像地址 https://www.cnblogs.com/susu8/p/9208826.html

npm config set registry http://registry.npm.taobao.org

PHP实现守护进程的方式

nohup

nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

语法

nohup(选项)(参数)

选项

--help:在线帮助;
--version:显示版本信息。

参数

程序及选项:要运行的程序及选项。

实例

使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

该指令表示不做挂断操作,后台下载

nohup wget site.com/file.zip

下面命令,会在同一个目录下生成一个名称为 nohup.out 的文件,其中包含了正在运行的程序的输出内容

nohup ping -c 10 baidu.com

PHP示例

nohup xxx.php &

使用pcntl和posix扩展实现

PHP 实现守护进程

  • fork 子进程
  • 父进程退出
  • 设置新的会话
  • 重置文件掩码
  • 关闭标准输入输出
<?php
// Fork the current process
$pid = pcntl_fork();

// If pid is negative, an error occurred
if ($pid == -1) {
    exit("Error forking...\n");
} 
// If pid is 0, this is the child process
elseif ($pid === 0) {
    // Make the child process a new session leader
    if (posix_setsid() === -1) {
        exit("Error creating new session...\n");
    }
    
    $dir = '../../../vendor/mydaemon.log';
    // Open a log file for writing
    $log = fopen($dir, 'w');

    // Loop indefinitely
    while (true) {
        // Write a message to the log file
        fwrite($log, "Daemon is running...\n");

        // Sleep for 5 seconds
        sleep(5);
    }
    
    //close the standard input, output, and error streams respectively.
    //REF:https://www.php.net/manual/zh/wrappers.php.php
    //REF:https://www.php.net/manual/zh/features.commandline.io-streams.php

    fclose(STDIN);
    fclose(STDOUT);
    fclose(STDERR);
} 
// If pid is positive, this is the parent process
else {
    // Exit the parent process
    exit('Exit the parent process');
}

Laravel 踩坑记录之路由与中间件,论规范的重要性

使用一种技术,就要遵循它的规范,尤其是在没有完全了解实现原理的时候,不能随意的DIY否则就会进入坑中

不明原因(可能的原因同事对框架做了修改)导致在控制器构造方方中使用$this->middleware()方法,terminate中间件没有生效,最后在路由中使用->middleware() 方法中间件生效

elasticsearch 基本概念:集群 节点 分片

极客时间学习笔记

简介

elasticsearch是用java语言开发的基于lucene的全文搜索引擎。

特性

高可用,可扩展的分布式系统

服务可以用性-允许有节点停止服务

数据可用性-部分节点丢失不会丢失数据

扩展性-请求量提升/数据不断增长(将数据分不到多有节点上),水平扩容

分布式架构

不同的集群通过不同的名字区分,默认名字 “elasticsearch”,可以通过配置文件或者命令行启动时中 -E cluster.name = xxx 设定 配置文件

一个集群可以有一个或多个节点

节点

节点是一个elasticsearch的实例,本质上是一个java的进程,一台机器可以运行多个节点,生产环境建议一台机器只运行一个elasticsearch实例

每个节点都有自己的名字,通过配置文件,或者启东时 -e node.name = xxx 指定,节点启动后会分配一个UID,保存在data目录下

Master-eligible nodes 和 Master Node

每个节点启动后,默认就是一个master eligible 节点(可以通过配置关闭 node.master:false)

每一个Master-eligible节点都可以参加选主流程,成为Master节点

第一个Master-eligible节点启动时会将自己选举为Master节点

每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态(大哥说了算,保持数据一致性)

集群状态中存储了必要信息 :所有节点的信息;所有索引和相关Mapping与Setting信息;分片路由信息

Data node 和 Coordinaing Node

Data node 保存数据的节点,负责保存分片数据,数据扩展时起重要作用(待补充)

Coordinating Node

负责接受Client请求,将请求分发到合适的节点,最终把结果汇总到一起,每个节点默认都起到Coordinating Node的职责

其他的节点类型

Hot & Warm Node 不同配置的Data Node,用来实现Hot & Warm 架构 降低集群部署成本,Hot高配置机器,Warm低配置机器。

Machine Learning Node 负责跑机器学习 Job ,用来做异常检测

Tribe Node 连接不同的Es集群并支持将这些集群当成一个单独集群处理后续版本将会废弃,5.3开始使用Search across clusters替代

配置节点类型

开发环境一个节点可以承担多种角色

生产环境设置单一的角色节点(dedicated node)

节点类型配置参数默认值
maste eligiblenode.mastertrue
datanode.datatrue
ingestnode.ingesttrue
coordinating only每个节点默认都是coordinating节点设置其他类型全部为false
machine learningnode.mltrue(需 enable x-pack)

分片(Primary shard & Replica Shard)

主分片,用以解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点之上

  • 一个分片是一个运行的Lucene的实例
  • 主分片数在索引创建时指定,后续不允许修改,除非Reindex

副本分片,用以解决数据高可用的问题。分片是主分片的拷贝

  • 副本分片数,可以动态的调整
  • 增加副本数,一定程度上提高服务的可用性(读取的吞吐量)

分片的设定

对于生产环境中分片的设定,需要提前做好容量规划

分片数设置过小

  • 导致后续无法增加节点实现水平扩展
  • 单个分片的数据量太大,导致数据重新分配耗时

分片数设置过大,7.0开始,默认主分片设置成1,解决了over-sharding的问题

  • 影响搜索结果的相关性打分,影响统计结果的准确性
  • 单个节点上过多的分片会导致资源浪费同事也会影响性能

查看集群状态

GET _cluster/health

{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",//green主分片与副分片都正常 yellow主分片全部分配正常,有副本分片未能正常分配,red有主分片未能分配,例如当服务器磁盘容量超过85%去创建新的索引时
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 7,
  "active_shards" : 7,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 87.5
}

Uubntu 常用软件

系统快照软件Timeshift

https://linux.how2shout.com/how-to-install-timeshift-on-ubuntu-22-04-20-04-lts

GUI主题

硬件驱动

工具类

快捷方式编写

WPS设置语言不跟随系统

新建一个空白文档,右上角A图标打开设置语言功能 ,不跟随系统,设置为中文

flameshot添加快捷方式

指令 flameshot gui  如图

chrome

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

qbittorrent

sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable
sudo apt-get update && sudo apt-get install qbittorrent

开发工具

vscode

filezilla apt install filezilla

virtualbox

mysql-workbench 数据库管理工具

postman

remmina远程终端软件

dia画图软件

sudo apt-get install dia

Jmeter压测

redis-manager

sudo snap install redis-desktop-manager --edge

redinav redis-gui工具

wireshark抓包工具

umbrello uml建模工具

sudo apt install umbrello

phpstorm

DBeaver 数据库管理工具

Nodepad++

sudo snap install notepad-plus-plus

Typora

wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add -

# add Typora's repository
sudo add-apt-repository 'deb https://typora.io/linux ./'
sudo apt-get update

# install typora
sudo apt-get install typora

安装钉钉

https://github.com/nashaofu/dingtalk

https://github.com/nashaofu/dingtalk/issues/382

原型工具

pencil

github release 加速下载网站

http://tool.mkblog.cn/github/

https://hao.su/3415/

国外资源加速下载的方案

原理同百度网盘和迅雷的离线下载,

首先购买一台国外的vps,要求带宽不能太差,同时,国内连这个vps也不能太慢

1先将资源下载到vps上

2用ftp或scp将文件下载到本地

Markdown查看工具

wechat 安装

参考

注意事项

安装TopIcons Plus 商店里有

解决中文乱码

不知道从哪个版本开始,Ubuntu安装wine QQ后中文会变成方块。。。原因是wine QQ使用文泉驿字体, 此字体已不随机附带, 随机字体为Noto系列字体。

解决方法为安装对应字体

sudo apt install fonts-wqy-microhei fonts-wqy-zenhei

需注意文泉驿字体归于universe分支, 意味不受Canonical支援, 可能需要在apt sources中添加universe分支

sudo add-apt-repository universe

希望可以将字体并入dependencies中, 免去此麻烦。

解决微信无法发送图片

sudo apt install libjpeg62:i386

TIM 安装 PPAPI FLASH

sudo apt-get install pepperflashplugin-nonfree
sudo update-pepperflashplugin-nonfree --install

微信更新问题

如果出现微信提示跟新问题执行这一条语句即可 可能存在问题。

 wget -qO- https://deepin-wine.i-m.dev/setup.sh | sudo sh

覆盖文件升级方式,这个简单有效

https://blog.csdn.net/ysy950803/article/details/104045975

存在问题图片一直发送中,发不出去

Ubuntu 20.04 安装wechat

wget -O- https://deepin-wine.i-m.dev/setup.sh | sh

sudo apt-get install deepin.com.wechat

ubuntu20.04

推荐使用这个deepinwine

卸载重装后如果出现依赖问题参考

https://github.com/zq1997/deepin-wine/issues/220

新版 deepin-wechat 截图崩溃

ubuntu 安装JDK

https://blog.csdn.net/weixin_38924500/article/details/106215048

安装搜狗输入法

ubuntukylin源

官网版,20.04测试无效不好用,太坑了

https://pinyin.sogou.com/linux/help.php

amd64下载地址

Ubuntu20.04踩坑记录

无法进入设置中心,搜所不到setting

sudo dpkg -l|grep gnome-control-center

sudo dpkg -l|grep ubuntu-desktop

查询软件是否存在,如果不存在则执行重装

sudo apt install --reinstall gnome-control-center //重装控制中心

sudo apt -f install ubuntu-desktop //安装ubuntu桌面

卸载liboffices

https://jingyan.baidu.com/article/bad08e1e244b2109c85121f1.html

Snap core 无法更新解决 snap has no updates available

//更新一下所有软件,排除更新问题
sudo apt update && sudo apt upgrade
//杀死gnome-software进程
killall gnome-software
//重启电脑
reboot 

参考链接

https://askubuntu.com/questions/1321217/ubuntu-store-snap-update-fails

https://askubuntu.com/questions/1321097/snapd-runtime-environment-update

ubuntu22.04 支持华硕笔记本开启背光键盘

fn+f7 亮灯建

ubuntu pro 更新提示问题

https://askubuntu.com/questions/1452299/im-getting-the-error-the-following-security-updates-require-ubuntu-pro-with-e

最简单的方法删除

mkdir -p relocated_apt
sudo mv /etc/apt/apt.conf.d/20apt-esm-hook.conf ~/relocated_apt/.

引导修复工具

#安装
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair

#卸载
sudo apt-get -y autoremove boot-repair
sudo add-apt-repository -r ppa:yannubuntu/boot-repair
sudo apt-get update

装双系统时,可以用来在grub中添加或修复windows boot项

Surface Go 安装ubuntu

将 Linux 放在 Microsoft Surface Go 上

https://github.com/linux-surface/linux-surface

常用笔记索引

TASK TO DO LIST

我在工作中存在的问题

Linux

Linux软件管理 常用命令

Linux编译安装

Linux进程管理 常用命令和工具

Linux网络调试 常用命令和分析工具

Linux日志管理 常用命令和工具

Linux网络文件传输 常用命令工具

常用防火墙指南

生产环境部署配置

jemalloc内存分配工具

Web服务器

Nginx系服务器

Apache服务器

负载均衡指南

LVS

Keepalived

Keepalived 原理介绍和配置实践

Nginx upstream

语言知识体系

PHP知识框架

Go开发生态 常用笔记

前端开发生态 常用笔记本

Shell学习笔记

Lua脚本学习笔记

正则表达式

数据库和中间件

关系型数据库(RDBMS)

关系型数据库设计知识

Mysql常用

分库分表指南

Redis常用

Memcached常用

全文索引指南

Elasticsearch常用

MongoDB常用(ES可替代)

消息队列中间件(Message Quene)指南

RabbitMQ常用

Kafka常用

RocketMQ常用

开发工具软件

Git常用命令

navicat-premium 延期试用和激活

Jmeter工具使用指南

VSCode使用总结笔记

开发规范和约定

语义化版本

数据迁移使用规范

网络编程

网络基础知识及概念

服务端网络编程知识框架

数据结构和算法

学习笔记

软件设计

软件架构知识索引

软件开发定律和心得

如何编写高质量代码

在框架中如何封装业务和功能代码

如何设计SDK和类库

API设计

Api设计经验总结

架构总结

其它

安全指南

IP查询工具

网络搜集的编程相关电子书

鸟哥Linux私房菜

电子书

php-fpm 配置指南

简介

FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,管理PHP进程池。用于接受处理来自WEB服务器(nginx)的请求.

PHP-FPM会创建一个master进程用于管理work进程(fork或killwork进程)和转发请求。work进程会竞争的接受请求,接收成功后,解析FastCGI协议执行脚本,处理完成,等待下一个请求(同步阻塞IO)。

PHP-FPM 对于高并发的处理能力不强。高并发业务推荐使用swoole 或 workman相关生态。

配置项说明 官方文档

全局常用配置

#PID 文件的位置
pid = run/php-fpm.pid
#错误日志目录
error_log = log/php-fpm.log
#日志等级
log_level = warning
#用于设定平滑重启的间隔时间。这么做有助于解决加速器中共享内存的使用问题,可用单位:s(秒),m(分),h(小时)或者 d(天)
emergency_restart_interval = 60s
#如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定进程数量的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动;
emergency_restart_threshold = 30
#子进程接受主进程复用信号的超时时间
process_control_timeout = 5s
#设置 FPM 在后台运行。设置“no”将 FPM 保持在前台运行用于调试
daemonize = yes

emergency_restart 配置解释,在60s内收到30个子进程的SIGSEGV或SIGBUS退出信号,则重启fpm

process_control_timeout场景,例如当父进程发送终止信号时,子进程正在处理某些事情的时候。十秒的时间,他们会有一个更好的机会完成任务并且优雅地退出

进程池相关配置

进程池监听配置

#进程池名称
[yangliuan]
#设置进程池接受 FastCGI 请求的地址,可用格式为:'ip:port','port','/path/to/unix/socket',每个进程池都要设置
listen = /dev/shm/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = yangliuan
listen.group = yangliuan
listen.mode = 0666
user = yangliuan
group = yangliuan

TCP Socket 链接方式127.0.0.1:9000 ,可以跨机器通讯 ,使用 Nginx 做负载均衡做 PHP 服务器集群,应用服务器只需要安装php就可以了

Unix Socket 链接方式 /dev/shm/php-cgi.sock,只能本机通讯 ,Nginx 和 FPM 必须都在同一台服务器上,速度比较快而且消耗资源少(差距不会太大 0.1% ~ 5% 的差别),这种情况做集群的话,应用服务器需要同时安装nginx和php

/dev/shm 是linux tmpfs文件系统,数据存储和读取直接使用内存,速度快

对应nginx监听方式

fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;

进程池模式

fpm 的运行模式有三种:ondemand 按需创建dynamic 动态创建static 固定数量

ondemand

ondemand 初始化时不会创建待命的进程。并且会在空闲时将进程销毁,请求进来时再开启。是一种比较 节省内存 的 FPM 运行方式,不过因为其频繁创建和销毁进程,性能表现不佳。

应用场景:一般是在共享的 VPS 上使用。内存小的机器上。

相关参数

#秒数,多久之后结束空闲进程;默认是 10 秒,超过 10 秒即销毁
pm.process_idle_timeout = 10s
#最大并存进程数,超过此值将不再创建
pm.max_children = 50
#每个进程最多处理多少个请求,超过此值将自动销毁
pm.max_requests = 1000

dynamic

动态创建,这个是默认选项,也是比较灵活的选项。兼顾稳定和快速响应。因为一直保证有「空闲进程」可供使用,所以 dynamic 的配置,相比 ondemand 进程要同时创建,响应速度还是比较快的。然而在还是避免不了频繁创建和销毁进程对系统造成的消耗

应用场景:一台服务器上跑多个php项目,平常访问量不多。

相关配置:

#FPM 启动时创建的进程数
pm.start_servers = 10
#最大并存进程数,超过此值将不再创建
pm.max_children = 50
#空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.min_spare_servers = 10
#空闲进程数最大值,如果空闲进程大于此值,则进行清理
pm.max_spare_servers = 40
#每个进程最多处理多少个请求,超过此值将自动销毁
pm.max_requests = 1000

dynamic模式 进程数量公式

处理请求中的进程数量 + pm.max_spare_servers =  pm.max_children

超过最大进程数后,新来的请求将会阻塞等待,php-fpm日志会出现 server reached pm.max_children setting (n), consider raising it 警告日志。n为配置的pm.max_children最大进程数值

static

固定进程数量是性能最好,省去了创建和销毁进程的开销,资源利用率最高的运行方式,一般在要求单机性能最高的时候使用

应用场景:PHP 服务器集群,希望每台机器都能物尽其用;本地lnmp开发环境,保证占用内存固定

相关配置:

#FPM 启动时创建的进程数,并且会一直保持这个数
pm.max_children = 50
#每个进程最多处理多少个请求,超过此值将自动销毁
pm.max_requests = 1000

该模式需要计算评估一般场景下,每个进程占用多少内存,以及每台机器的总内存。然后根据情况配置。

使用ab压力测试工具或jmeter工具,对访问频率较高的页面和请求进行的正常流量情况下的压力测试。

然后使用如下命令进行统计,查看内存使用情况,单个php进程占用进程数

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm

要求不严谨的情况下,可以根据经验和项目的业务场景的代码对每个进程数进行粗略估算,例如一个常用接口查询请求下占用多少内存,然后在计算。

最大进程数量计算公式

pm.max_children = 可用内存 / 每个进程暂用内存大小

可用内存不是本机所有内存,要除去其他程序运行,例如nginx,mysql,等其它服务的内存。

调试期间,要在生产环境中实战观察,一般建议使用 80% 的内存使用率,留 20% 给内存泄露的空间和其他软件运行。

最后是 pm.max_requests 值,需要我们观察应用是否有 内存泄漏。现代的 PHP 程序,尤其是 Laravel ,会依赖于非常多的扩展包,这些扩展包代码质量参差不齐,多少会出现内存泄漏的问题。如果内存泄露不严重,那么把值设置高一点,让单个进程在存活期间多处理一些请求,如果内存泄露比较严重,应当酌情设置低一点。否则会出现系统内存不够用,然后去使用 Swap 物理内存 的窘境。

如果代码质量非常高,不会出现发生内存泄露的情况,可以将其设置为 pm.max_requests=0 可以避免过高的 PM 开销

请求的生命周期设置

#设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 'max_execution_time' 因为某些特殊原因没有中止运行的脚本有用
request_terminate_timeout = 600

非分片上传大文件时,需要用到

请求慢日志设置

#当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中,0关闭
request_slowlog_timeout = 60
#慢日志路径
slowlog = var/log/slow.log
#慢日志记录脚本堆栈的深度
request_slowlog_trace_depth = 20

文件打开限制

#设置文件打开描述符的 rlimit 限制
rlimit_files = 51200
#设置核心 rlimit 最大限制值。可用值:'unlimited',0 或者正整数
rlimit_core = 0

worker进程开启日志记录

catch_workers_output = yes

参考

为高性能优化 PHP-FPM

PHP-FPM 调优:使用 ‘pm static’ 来最大化你的服务器负载能力

LX3 Laravel 性能优化入门

supervisor安装使用

centos

安装

方式一

yum update

yum install -y supervisor

//yum安装会自动创建systemd脚本,可用systemd管理
systemctl enable supervisord //开机自启

systemctl disable supervisord //禁用开机自启

systemctl start supervisord//启动supervisor

systemctl reload supervisord //重新加载配置

systemctl stop supervisord //停止supervisor

方式二

yum update

yum install -y python-setuptools

easy_install supervisor

echo_supervisord_conf >/etc/supervisord.conf //创建配置文件

需要自己配置systemd脚本

ubuntu

sudo apt-get install supervisor

service supervisor status|start|stop|enable|disable

常用命令

supervisord -c /etc/supervisord.conf //指定配置文件启动

supervisorctl stop programxxx  //停止某一个进程

supervisorctl start programxxx //启动某一个进程

supervisorctl restart programxxx //重启某个进程

supervisorctl status  //查看进程状态

supervisorctl stop groupworker //重启所有属于名为 groupworker 这个分组的进程(start,restart 同理)

supervisorctl stop all //停止全部进程,注:start、restart、stop 都不会载入最新的配置文件

supervisorctl reload //载入最新配置文件,停止原有进程并按新的配置启动所有进程

supervisorctl update //根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

配置文件示例 (laravel项目为例)

#进程组名称
[program:laravel-worker-queue]
#进程名称
process_name=%(program_name)s_%(process_num)02d
#程序执行命令
command=/php-path/bin/php /www/www.youdomain.com/current/artisan queue:work redis --sleep=3 --tries=3 
#supervisor启动后自动启动
autostart=true 
#退出后自动重启
autorestart=true
#程序运行用户
user=www-data 
#supervisor启动进程数量
numprocs=5
#如果为true,则将进程的 stderr 输出发送回其 stdout 文件描述符上的 supervisord(在 UNIX shell 术语中,这相当于执行 /the/program 2>&1)
redirect_stderr=true
#日志大小
stdout_logfile_maxbytes=10MB
#日志数量
stdout_logfile_backups=20
#日志目录
stdout_logfile=/www/www.youdomain.com/current/storage/logs/worker.log

REDIS配置详解





Redis必须是以文件路径作为第一个参数开始
redis-server /path/to/redis.conf

需要内存大小时,可以指定通常以1k 5GB 4M的形式出现,以此类推:
1k => 1000字节
1kb => 1024字节
1m => 1000000字节
1mb => 1024 * 1024字节
1g => 1000000000字节
1gb => 1024 * 1024 * 1024字节
单位不区分大小写,因此1GB 1Gb 1gB都是相同的

==INCLUDES==========================================================
在此处包含一个或多个其他配置文件。如果你这很有用有一个标准模板,可以转到所有Redis服务器,但也需要自定义一些每服务器设置。包含文件可以包括the other files,所以明智地使用它。
通知选项“include”不会被命令“CONFIG REWRITE”重写
来自admin或Redis Sentinel。由于Redis总是使用最后一次处理line作为配置指令的值,你最好把include包括在内在此文件的开头,以避免在运行时覆盖配置更改。
include /path/to/local.conf
include /path/to/other.conf

==MODULES===========================================================启动时加载模块。
如果服务器无法加载模块它会中止。可以使用多个loadmodule指令。
loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

==NETWORK==========================================================
如果未指定“bind”配置指令,则Redis将监听来自服务器上所有可用ip的连接。可以使用只听一个或多个选定的ip
bind 192.168.1.100 10.0.0.1 
bind 127.0.0.1 ::1
bind 0.0.0.0 监听所有
port 6379 监听端口

 
默认情况下启用保护模式。
只有当您确定希望其他主机的客户端连接到Redis 时,即使未配置任何身份验证,也不应使用“bind”指令明确列出特定的接口您应该禁用它.
开启远程访问需要将此选择项改为no
protected-mode yes

此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。
tcp-backlog 511

Unix socket.
指定以redis unix socket方式运行的
unixsocket /tmp/redis.sock //路径
unixsocketperm 700 //权限建议 777


客户端空闲超时时间,0表示禁用
timeout 0


tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
tcp-keepalive 300


daemonize是用来指定redis是否要用守护线程的方式启动。 
daemonize 设置yes或者no区别
daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出
daemonize yes


是否通过upstart或systemd管理守护进程。默认no没有服务监控,可选项有no ,upstart, systemd, auto
supervised no

pid文件在redis启动时创建,退出时删除。最佳实践为配置该项。
pidfile /var/run/redis_6379.pid

#配置日志级别。选项有debug, verbose, notice, warning
loglevel notice

日志名称。空字符串表示标准输出。注意如果redis配置为后台进程,标准输出中信息会发送到/dev/null
logfile /usr/local/redis/var/redis.log

是否启动系统日志记录。
syslog-enabled no

指定系统日志身份。
syslog-ident redis

指定syslog设备。必须是user或LOCAL0 ~ LOCAL7之一。
syslog-facility local0


设置数据库个数。默认数据库是 DB 0
可以通过SELECT where dbid is a number between 0 and 'databases'-1为每个连接使用不同的数据库。
databases 16