服务端网络编程知识框架

进程的基础知识

线程基础知识

协程基础知识

进程线程协程的对比- 多任务:进程、线程与协程

Socket

unix socket tcp socket

五种 I/O 模型

阻塞 I/O

非阻塞 I/O

I/O 的多路复用(select 和 poll)

信号驱动的 I/O(SIGIO)

异步 I/O(POSIX 的 aio_functions)

Reactor模型

TCP粘包

[网络坦白局] TCP粘包 数据包:我只是犯了每个数据包都会犯的错 |硬核图解

惊群效应

网络通讯协议

Linux inotify

C10k问题

C10k文档

Libevent

event loop 事件循环

C/S 客户端->服务端 编程模型

Linux日志管理

日志目录
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件
/var/log/yum.log
/var/log/syslog
/var/log/dmesg
/var/log/journal

history 显示或操作历史列表 文档

more 显示文件内容,每次显示一屏 文档

  • 按 Space 键:显示文本的下一屏内容。
  • 按 Enter 键:只显示文本的下一行内容。
  • 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
  • 按H键:显示帮助屏,该屏上有相关的帮助信息。
  • 按B键:显示上一屏内容。
  • 按Q键:退出more命令。

less 分屏上下翻页浏览文件内容 文档

  • PageUp键向上翻页
  • PageDown键向下翻页
  • Q键退出

tail 在屏幕上显示指定文件的末尾若干行 文档

#查看指定ip的nginx日志
tail -f /dir_name/access.log | grep xxx.xxx.xxx.xxx

sudo journalctl -xe 查看systemd 错误日志 journalctl

参考

linux 6中日志参考方法

Linux 系统日志查看分析(Rsyslog)

Shell常用语法和案例

awesome-shell

ag – 通过目录层次结构,快速搜索文本

shell大全

网道Bash基础教程

Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别

获取时间到变量

currentdate=$(date +%Y%m%d)

字符串操作

向文件末尾追加多行文本

here文档语法

Here 文档内部会发生变量替换,同时支持反斜杠转义,但是不支持通配符扩展,双引号和单引号也失去语法作用,变成了普通字符。

cat >> 1.txt <<EOF
export NVM_DIR="\$HOME/.nvm"
[ -s "\$NVM_DIR/nvm.sh" ] && \. "\$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "\$NVM_DIR/bash_completion" ] && \. "\$NVM_DIR/bash_completion"  # This loads nvm bash_completion
EOF

使用指定用户运行命令

sudo -u username command
su -c "cd /www/wwwroot/tuntun/server_php && /www/server/php/74/bin/php artisan schedule:run >> /dev/null 2>&1" -s /bin/sh www

文本操作

sed 替换文本

linux中sed命令替换包含引号、斜杠等特殊字符的的使用

Shell中使用grep、sed正则提取和替换字符串

Shell判断字符串包含关系的几种方法

应用场景描述

安装nvm脚本时需要添加环境变量,卸载时又想把环境变量删除。可以在写入时,在文件末尾追加特殊标识,删除时通过sed删除末尾有标识行

#写入时增加##nvm标识
cat >> /home/${run_user}/.bashrc <<EOF
export NVM_DIR="\$HOME/.nvm"##nvm
[ -s "\$NVM_DIR/nvm.sh" ] && \. "\$NVM_DIR/nvm.sh"##nvm
[ -s "\$NVM_DIR/bash_completion" ] && \. "\$NVM_DIR/bash_completion"##nvm
EOF

#删除末尾有##nvm的行,通过元字符$匹配
sed -i '/##nvm$/d' .bashrc

获取系统信息

查看Linux内核版本

#方式一
cat /proc/version
Linux version 5.13.0-51-generic (buildd@lcy02-amd64-046) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #58~20.04.1-Ubuntu SMP Tue Jun 14 11:29:12 UTC 2022

#方式二
uname -a
Linux MINIPC-PN51-E1 5.13.0-51-generic #58~20.04.1-Ubuntu SMP Tue Jun 14 11:29:12 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

查看Linux发行版相关信息

#方式一
lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.4 LTS
Release:	20.04
Codename:	focal

#方式二
cat /etc/issue
Ubuntu 20.04.4 LTS

#仅适合Redhat系的Linux
cat /etc/redhat-release

输入输出重定向

Shell 输入/输出重定向

Linux shell中2>&1的含义解释 (全网最全,看完就懂)

数组常用操作

#读取目录下名字为php*的目录,存为数组, 然后合并数组
enable_dir=(`find /usr/local/php/etc/php.d -maxdepth 1 -type f -name "*.ini" | sort`)
disable_dir=(`find /usr/local/php/etc/php.d/disable -maxdepth 1 -type f -name "*.ini" | sort`)
extension_dir=(${enable_dir[@]} ${disable_dir[@]})

条件语句

Shell脚本IF条件判断和判断条件总结

Linux文件系统 FAQ

rm cannot remove xxx Read-only file system 无法删除文件

df dir 查看无法删除的目录所在的文件系统

df /snap/remmina/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/nvme0n1p2 479152840 195515620 259227828 43% /

fsck -y /   #执行修复文件系统 的挂载根目录 或者 有问题的文件所在的挂载目录;

shutdown -r now

再删除ubuntu系统中的snap应用文件时上述方法没有解决

使用df -h 查看 发现remmina中的 /snap/remmina/4978 的挂载点是/dev/loop12

sudo umount /dev/loop12 去掉挂载后,再删除就可以了 ,原因是磁盘的挂载目录无法直接被删除

阿里云在线扩容磁盘遇到的问题

按照官方文档扩容

输入growpart 命令时 没有查找一下该命令的参数和含义,照着文档以为是截图中的序号,结果报如下错误

NOCHANGE: partition 2 is size 0. it cannot be grown

growpart <DeviceName> <PartionNumber>

应该输入分区好,即截图中1,/dev/vdb 是设备名称 ,/dev/vdb1是设备名称+分区号,即设备分区

总结:
服务器运行不了解的命令一定要先查一下文档手册,看个大概,梳理一下操作的大概意思,然后在操作
完善一下文件系统的文档,复习一下文件系统的知识

参考

在线扩容云盘(Linux系统)

阿里云Linux服务器动态扩容(阿里云服务器扩容后磁盘空间无变化解决方法)

Linux安装PHP FAQ

离线安装

很多国企和大型企业的自建机房不允许访问公网,流量只能进开发固定端口,造成安装LNMP环境时缺少各种依赖和报错。以centos系统为例

1.上传和服务器版本一致的操作系统镜像,(例:CentOS-7-x86_64-Everything-2009.iso,一定要使用everything版本包含软件包) 到服务器

2.挂载光盘镜像

mkdir /mnt/dvd //创建挂载目录
mount -o loop /xxx/CentOS-7-x86_64-Everything-2009.iso /mnt/dvd  //挂载,xxx为镜像所在目录
df -h  //查看 /mnt/dvd 挂载点是否挂载成功

3.配置yum本地源

mkdir /etc/yum.repos.d/bk //创建备份目录
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bk //备份源文件

vim /etc/yum.repos.d/CentOS-Media.repo  //编辑本地源
//centos6/7内容如下,file路径为上一步的镜像挂载
[local-media]
name=CentOS-$releasever-Media
baseurl=file:///mnt/dvd/
gpgcheck=1
enabled=1
gpgkey=file:///mnt/dvd/RPM-GPG-KEY-CentOS-7

//CentOS 8本地源配置文件写法与CentOS6和7不同,配置文件内容如下:
[LocalRepo_BaseOS]
name=LocalRepository_BaseOS
baseurl=file:///mnt/dvd/BaseOS
enabled=1
gpgcheck=0

[LocalRepo_AppStream]
name=LocalRepository_AppStream
baseurl=file:///mnt/dvd/AppStream
enabled=1
gpgcheck=0

//保存然后执行
yum clean all && yum makecache

//测试一下是否可用
yum install git

4 执行离线安装

使用oneinstack

一台服务器(可以使用系统版本系统的虚拟机替代)联网使用oneinstack安装后,src目录里会有相应的包,打包oneinstack 放到需要离线安装的服务器(配置好内网yum源)就是离线了。

使用lnmp一键安装包,需要下载完整包

执行CheckMirror=n ./install.sh lnmp

5 其它参考

https://blog.51cto.com/u_1836630/2417675

Linux编译安装相关知识

linux查看某个库是否安装

https://blog.csdn.net/vantian/article/details/76636327

ldconfig -p | grep pcap

ubuntu简单美化

首先更新系统

sudo apt update && sudo apt upgrade

软件中心安装显卡驱动

Software && updates => Additional Drivers 一般N

如果没有合适的去官网下载,出现卡顿等问题也可以装一下显卡驱动试试

AMD Linux驱动 官方地址

NVIDIA官方驱动 NVIDIA安装驱动英文教程

sudo apt install nvidia-utils-530

安装N卡显示设置

sudo apt install nvidia-settings

切换显卡

更新驱动后可能会丢失这个选项 解决参考

可以通过指令切换 nvidia|intel|on-demand|query

sudo prime-select nvidia # select nvidia gpu
sudo prime-select intel  # select intel gpu
sudo prime-select on-demand  # on-demand 按需

安装tweaks

sudo apt install gnome-tweak-tool
#ubuntu22.04
sudo apt install gnome-tweaks
sudo apt install chrome-gnome-shell #需要安装chrome浏览器
sudo apt install gnome-shell-extensions

开启关闭gnome-shell-extensions

安装chrome-gnome-shell成功后

ubuntu20.04+ 已更新版本

安装dash to dock 和 TopIcons Plus 和 Drop Down Terminal

版本未更新时替代品

Dash to Dock for COSMIC (替代 dash to dock ) ddterm (替代Drop Down Terminal ) TopIconsFix (替代 TopIcons Plus)

https://extensions.gnome.org/

打开上述网站,搜索并安装扩展

设置为打开即可,如上图

dash to dock 配置截图

启用Dash To Dock 后 禁用ubuntu dock,否则会导致indicator-sysmonitor插件报错

dock尺寸

图标尺寸

isloate workspace 隔离工作空间 isloate monitors 隔离显示器

ddterm

Panel Icon : none 隐藏顶部栏图标

TopiconsFix

Tray horizontal alignment (托盘图标水平对齐) right

Ubuntu AppIndicators

Tray horizontal alignment left (托盘水平左对齐)可以解决一些应用菜单无法推出的情况

FAQ

gnome出现问题,可以尝试重新安装

sudo apt-get install --reinstall ubuntu-desktop

gnome控制中心设置失效可以重新安装

sudo apt install gnome-control-center 

Linux系统优化

系统参数

Linux内核调优

内核参数调整

打开文件 /etc/sysctl.conf,增加以下设置

#该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除
net.ipv4.tcp_max_tw_buckets = 20000
#定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数
net.core.somaxconn = 65535
#对于还未获得对方确认的连接请求,可保存在队列中的最大数目
net.ipv4.tcp_max_syn_backlog = 262144
#在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 30000
#能够更快地回收TIME-WAIT套接字。此选项会导致处于NAT网络的客户端超时,建议为0
net.ipv4.tcp_tw_recycle = 0
#系统所有进程一共可以打开的文件数量
fs.file-max = 6815744
#防火墙跟踪表的大小。注意:如果防火墙没开则会提示error: "net.netfilter.nf_conntrack_max" is an unknown key,忽略即可
net.netfilter.nf_conntrack_max = 2621440

运行 sysctl -p即可生效。

打开文件数

设置系统打开文件数设置,解决高并发下 too many open files 问题。此选项直接影响单个进程容纳的客户端连接数。

Soft open files 是Linux系统参数,影响系统单个进程能够打开最大的文件句柄数量,这个值会影响到长连接应用如聊天中单个进程能够维持的用户连接数, 运行ulimit -n能看到这个参数值,如果是1024,就是代表单个进程只能同时最多只能维持1024甚至更少(因为有其它文件的句柄被打开)。如果开启4个进程维持用户连接,那么整个应用能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4×1024个用户在线可以增大这个设置以便服务能够维持更多的TCP连接。

Soft open files 修改三种方法:

第一种:在终端直接运行 ulimit -HSn 102400,然后重启workerman。

这只是在当前终端有效,退出之后,open files 又变为默认值。

第二种:在/etc/profile文件末尾添加一行 ulimit -HSn 102400,这样每次登录终端时,都会自动执行。更改后需要重启workerman。

第三种:令修改open files的数值永久生效,则必须修改配置文件:/etc/security/limits.conf. 在这个文件后加上:

* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000

这种方法需要重启机器才能生效。

开启BBR算法

参考

何时使用和不使用BBR

Google BBR 优化算法,实现TCP加速

GOOGLE 2016年出的TCP拥塞控制算法,解决问题提高网络吞吐量,案例Google在YouTube上应用该算法,将全球平均的YouTube网络吞吐量提高了4%,在一些国家超过了14%

BBR不会将丢包视为拥塞信号,这会导致高重传率的保持,如果传递的内容对丢包敏感,那么BBR可能不是一个好选择,这种情况下,内容提供商需要仔细检查吞吐量和体验质量之间的权衡

BBR的公平性存在问题,它会抢占Cubic算法的带宽(取决于瓶颈缓冲区的大小)

如何开启BBR

Laravel项目迁移时,文件存储软链接更新问题

使用laravel本地存储文件时,通常存放到public磁盘,即根目录下storage/app/public

执行命令 创建软链接后才可以通过公共访问文件

php artisan storage:link

laravel 7以上自定义软链接目录

项目迁移更换服务器后,磁盘的挂载目录变了,导致软链接路径不能生效了需要更新软连接

方法一

通过ln命令更新

ln –snf  [新的源文件或目录]  [目标文件或目录]

方法二

使用php artisan storage:link命令重新生成,首先要删除原先的软链接目录,删除软链接时一定要注意路径后边不能带/

cd /laravel根目录/public
rm -rf storage 正确的删除软链接方式
rm -rf storage/ 错误的删除软链接方式,会删除软链接对应的真实目录导致文件丢失