Rootop 服务器运维与web架构

2020-03-16
发表者 Venus
php安装composer命令并下载依赖已关闭评论

php安装composer命令并下载依赖

compose用的较少,记录下安装过程。
官网:https://getcomposer.org/download/

# 安装compose

[root@MiWiFi-R3P-srv ~]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
[root@MiWiFi-R3P-srv ~]# php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
[root@MiWiFi-R3P-srv ~]# php composer-setup.php
[root@MiWiFi-R3P-srv ~]# php -r "unlink('composer-setup.php');"
[root@MiWiFi-R3P-srv ~]# mv composer.phar /usr/local/composer

# 更新compose

[root@MiWiFi-R3P-srv ~]# /usr/bin/composer self-update

# 切换国内镜像,提高下载速度, 选一个执行。

[root@MiWiFi-R3P-srv ~]# composer config -g repo.packagist composer https://packagist.phpcomposer.com
[root@MiWiFi-R3P-srv ~]# composer config -g repos.packagist composer https://mirrors.cloud.tencent.com/composer/
[root@MiWiFi-R3P-srv ~]# composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 安装依赖 2 种方式
1、根据composer.json自动下载

[root@MiWiFi-R3P-srv ~]# cat composer.json 

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}
[root@MiWiFi-R3P-srv ~]# composer install

2、手动安装

[root@MiWiFi-R3P-srv ~]# composer require redisent/redis

这两种方式都会将安装的代码放在当前路径下的vendor目录下

# 更多参数直接执行composer可以看到:

[root@MiWiFi-R3P-srv ~]# composer

参数含义可参考:https://www.runoob.com/w3cnote/composer-install-and-usage.html

2020-03-15
发表者 Venus
mysql5.6无法启动,通过设置启动时不进行前滚恢复启动已关闭评论

mysql5.6无法启动,通过设置启动时不进行前滚恢复启动

InnoDB: Failing assertion: addr.page == FIL_NULL || addr.boffset >= FIL_PAGE_DATA
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 595198 K bytes of memory

开始以为是key_buffer_size、read_buffer_size、sort_buffer_size、max_threads这几个参数的问题,修改以后也没效果。
日志里也说遇到个bug,也不知道到底是不是bug。
查到一篇类似文章:https://blog.51cto.com/legehappy/2119514

通过设置innodb_force_recovery参数不进行回滚才启动数据库。

以下仅供参考!

具体方法:
1、先备份mysql的数据目录(生产中非常重要)!
2、修改my.cnf添加。

[mysqld]
innodb_force_recovery = 1

重启数据库。

这里有6个值可用:
作为一个安全措施,InnoDB 在innodb_force_recovery大于0时阻止INSERT,UPDATE或DELETE操作。对于MySQL5.6.15,将innodb_force_recovery设为4或更高会让InnoDB处于只读模式。

1 (SRV_FORCE_IGNORE_CORRUPT)
即使服务器检测到损坏的页仍让它运行。试图使SELECT* FROM tbl_name跳过损坏的索引记录和页,这样有助于转储表。

2 (SRV_FORCE_NO_BACKGROUND)
阻止主线程和任何清除线程的运行。如果崩溃会在清除操作中发生,该恢复值会阻止它。

3 (SRV_FORCE_NO_TRX_UNDO)
不要在崩溃恢复后运行事务回滚。

4 (SRV_FORCE_NO_IBUF_MERGE)
阻止插入缓冲合并操作。如果它们会导致崩溃,不要做这些。不计算表统计。这个值可以永久损坏数据文件。使用这个值后,准备号删除并重建所有辅助索引。在MySQL5.6.15中,设置InnoDB为只读。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
在启动数据库时不查看撤消日志:InnoDB将即使未完成的事务也作为已提交。这个值可以永久损坏数据文件。在MySQL5.6.15中,设置InnoDB为只读。

6 (SRV_FORCE_NO_LOG_REDO)
不要通过恢复对重做日志进行前滚。这个值可能永久损坏数据文件。数据库页被留在一个陈旧的状态,这反过来又可能带给B-trees和其它数据库结构更多的损坏。在MySQL5.6.15中,设置InnoDB为只读。 

更多信息参考原文章,我这里通过设置为3后(从1-3挨个试的),数据库才启动,然后mysqldump备份数据,重装了mysql再导回去。

PS:
这台数据库是有定时备份的。只是为了研究一下怎么能恢复就没重装还原备份。

2020-03-11
发表者 Venus
关于fdisk -l列出的信息含义解释已关闭评论

关于fdisk -l列出的信息含义解释

这里以阿里云的机器为例子

[root@iZm5e1smr945mb1ecjyehvZ ~]# fdisk -l

Disk /dev/vda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003a7b4

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1        5222    41940992   83  Linux

我这里就一块系统盘,以此来解释各个含义。

解释:

Disk /dev/vda: 42.9 GB, 42949672960 bytes
a是第一块硬盘  大小是42G  42949672960为字节单位大小

硬盘顺序由a-z表示,比如vda、vdb、vdc。

255 heads, 63 sectors/track, 5221 cylinders
255个磁面    63个扇区        5221个磁柱
Units = cylinders of 16065 * 512 = 8225280 bytes
每个磁柱约8.2M
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003a7b4

设备名    引导      起始磁柱    结束磁柱  容量KB    分区类型
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1        5222    41940992   83  Linux

vda1 表示第一块硬盘的第一个分区,第二个分区就是vda2,由数字1-9表示
* 星号表示此分区为引导分区,也就是win的活动分区
Blocks 表示分区的容量,单位是kb,也就是(end – start) * Units * 1024

分区id可以用fdisk查看所有的id类型。

[root@MiWiFi-R3P-srv ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):m
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):L

 0  空              24  NEC DOS         81  Minix / 旧 Linu bf  Solaris        
 1  FAT12           27  隐藏的 NTFS Win 82  Linux 交换 / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隐藏的 C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 扩展      c7  Syrinx         
 5  扩展            41  PPC PReP Boot   86  NTFS 卷集       da  非文件系统数据 
 6  FAT16           42  SFS             87  NTFS 卷集       db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux 纯文本    de  Dell 工具      
 8  AIX             4e  QNX4.x 第2部分  8e  Linux LVM       df  BootIt         
 9  AIX 可启动      4f  QNX4.x 第3部分  93  Amoeba          e1  DOS 访问       
 a  OS/2 启动管理器 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad 休 eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 扩展 (LBA)  54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC  
11  隐藏的 FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq 诊断     5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  隐藏的 FAT16 <3 61  SpeedStor       ab  Darwin 启动     f2  DOS 次要       
16  隐藏的 FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  隐藏的 HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST 智能睡眠    65  Novell Netware  b8  BSDI swap       fd  Linux raid 自动
1b  隐藏的 W95 FAT3 70  DiskSecure 多启 bb  Boot Wizard 隐  fe  LANstep        
1c  隐藏的 W95 FAT3 75  PC/IX           be  Solaris 启动    ff  BBT            
1e  隐藏的 W95 FAT1 80  旧 Minix  

通过以上分析可以确认一件事:
当不知道一块硬盘是否有为分配的空间时,就可以通过fdisk -l来确认已有分区的Blocks(kb)大小与总容量计算得出是否有空闲可分配。

2020-03-10
发表者 Venus
umount设备提示target is busy已关闭评论

umount设备提示target is busy

原因是有进程正在使用目标设备,导致无法卸载,通过查找打开的文件(lsof = list open file)进程去关闭。
或者用fuser命令显示出进程使用的文件和网络套接字

方法一:

[root@localhost ~]# umount /www
umount: /www: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
		 
[root@localhost ~]# lsof /www
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    7644 root  cwd    DIR 253,17     4096 655361 /www/backup

[root@localhost ~]# ps aux | grep 7644
root      7644  0.0  0.0 115448  2004 pts/3    Ss+  12:40   0:00 -bash
root      8425  0.0  0.0 112716   924 pts/4    S+   12:51   0:00 grep --color=auto 7644

[root@localhost ~]# kill -9 7644

卸载成功

方法二:

[root@MiWiFi-R3P-srv ~]# umount /www2
umount: /www2:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)
		 
m参数会打印出正在使用目标设备的进程
[root@MiWiFi-R3P-srv ~]# fuser -mv /www2
                     用户     进程号 权限   命令
/www2:               root     kernel mount /www2
                     root       2522 ..c.. bash
                     root       2604 f.c.. bash
					 
k参数会关闭使用的进程
[root@MiWiFi-R3P-srv ~]# fuser -kv /www2
                     用户     进程号 权限   命令
/www2:               root     kernel mount /www2
                     root       2522 ..c.. bash
                     root       2604 ..c.. bash
					 
再次确定没有使用后再卸载
[root@MiWiFi-R3P-srv ~]# fuser -mv /www2
                     用户     进程号 权限   命令
/www2:               root     kernel mount /www2
[root@MiWiFi-R3P-srv ~]# umount /www2

卸载成功

如果2种方法还不行,就去/etc/fstab把目标挂载点注释掉重启机器。

2020-03-10
发表者 Venus
nginx模块 – ngx_http_limit_req_module测试已关闭评论

nginx模块 – ngx_http_limit_req_module测试

此模块用于限制单个ip请求速率,每秒多少次。

模块文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

rate参数的几个写法含义:

limit_req_zone $binary_remote_addr zone=limit_login:10m rate=10r/m;
代表单ip每6秒1个请求(60/10=6)
limit_req_zone $binary_remote_addr zone=limit_login:10m rate=20r/m;
代表单ip每3秒1个请求(60/20=3)
limit_req_zone $binary_remote_addr zone=limit_login:10m rate=30r/m;
代表单ip每2秒1个请求(60/30=2)(官方文档叫half-request per second 1秒半个请求)
limit_req_zone $binary_remote_addr zone=limit_login:10m rate=1r/s;
代表单ip每秒1个请求
limit_req_zone $binary_remote_addr zone=limit_login:10m rate=2r/s;
代表单ip每秒2个请求

开始以为rate=30r/m 这参数意味着一分钟内30个请求,结果测试发现不对,仔细看官方文档是一秒—半个请求

当前配置为:2秒一个,突发burst为5个,意味着同一个ip可以再发起5个排队请求。

limit_req_zone $binary_remote_addr zone=limit_login:10m rate=30r/m; 
# 注意上面这个配置是在server{}之上
server
{
    略过部分配置...
	# 这里实现针对某个url进行限制
	location = /login.php
	{
		limit_req zone=limit_login burst=5;
		limit_req_log_level info;
		limit_req_status 555;

		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
		include pathinfo.conf;
	}
}

第一次访问login.php,会马上显示页面内容。(此时处在突发burst值以下)
第二次连续按2下刷新,会加载转圈2秒钟才显示,因为第一个请求处理后需要2秒后(速率限制)再处理第二个,(此时处在突发值以下,进入队列。)
第三次连续按3下刷新,大约4秒后显示。因为第一个请求2秒+第二个请求2秒。(此时处在突发值以下,进入队列。)
第四个连续按4下刷新,大约6秒后显示,2+2+2=6秒。(此时处在突发值以下,进入队列。)
第五次连续按5下刷新,会在8秒后显示,2+2+2+2=8秒。(此时等于突发值。)
第六次连续按6下或7下刷新(7下是因为按的第一次可能已经处理完成,手动按的刷新浏览器的速度赶不上处理速度快),直接返回555状态码,因为超过突发值了。

如果一直在刷新,那么就会一直返回555状态码,只有在返回555状态,并且没有在30r/m时间内,也就是2秒内没有新请求进来(同一个ip),大约在10秒(2秒一个请求*5个最大突发)后突发请求处理完后就可以再次访问了。

这种限流方法只适用于没有cdn加速的情况下,否则会取到cdn的ip,并不能取到真实客户端ip,此模块也不能用$x_forward_for字段获取真实ip。会报语法错误。
如果有能力改模块源码的话应该可以实现。