书写技术成长之路

docker占满磁盘问题解决

前几天启动了docker创建了几个容器,几天没看,发现服务器异常的慢,登上服务器发现磁盘空间全部占满了

2019-12-30.Wwbfx3ndrY.png

解决方案如下:

执行命令 sudo docker system prune -a -f

可以用此命令来查看docker实际使用的空间,未必的container占用的 du -h /var/lib/docker | sort -H

参考

https://github.com/moby/moby/issues/33775

https://github.com/moby/moby/issues/32420

https://stackoverflow.com/questions/31712266/how-to-clean-up-docker-overlay-directory

使用caddy取代nginx

Caddy由于自动启用HTTPS,不需要安装其他依赖,简洁的yaml配置受到欢迎,可以很容易就搭建起来服务。

也可以安装很多插件,比如 jwt, geoip, ratelimit等web开发常用的插件。

下载caddy很简单,只需要执行 CADDY_TELEMETRY=on curl https://getcaddy.com | bash -s personal就可以成功安装caddy开始使用了。

安装完成后,需要新建Caddyfile文件,文件内容可参考下面的配置,修改保存后执行caddy命令即可。

执行效果如下

ilzLeUC2AL.png

下面是一些基本的配置仅供参考

# https://caddyserver.com/tutorial
# you only need to change the hostname
caddy.example.com {
    root /www/webroot
    gzip
    proxy / localhost:8088 {
        header_upstream Host {host}
        header_upstream X-Real-IP {remote}
        header_upstream X-Forwarded-For {remote}
        header_upstream X-Forwarded-Port {server_port}
        header_upstream X-Forwarded-Proto {scheme}
    }
    header /images {
        Cache-Control "public, max-age=31536000"
    }

    header (.css|.js)$ {
        Cache-Control "public, max-age=31536000"
    }

    log /var/log/caddy_access.log
    errors /var/log/caddy_error.log
}

GitHub上也有很多示例可供参考 https://github.com/caddyserver/examples

注意不能占用80和443端口,这是caddy启动服务要使用的端口,应该使用反向代理。

参考

https://caddyserver.com/docs

使用v2ray进行科学上网

近来由于shadowsocks服务器被限制的很严重,只能考虑使用其他代理软件自由上网了。

v2ray是一款不错的代理软件, 这是官网介绍 https://www.v2ray.com/en/welcome/install.html

下面讲下安装步骤

  1. 在可科学上网的服务器上下载安装脚本 wget https://install.direct/go.sh

  2. 执行脚本安装v2ray bash go.sh

  3. 将v2ray加入开机启动项 systemctl enable v2ray

  4. 启动v2ray systemctl start v2ray

  5. 查看v2ray的配置文件 vim /etc/v2ray/config.json

  6. 下载v2ray mac客户端来使用v2ray代理服务自由上网, 下载地址https://github.com/Cenmrev/V2RayX/releases

m1IuQib5ie.png

fMUgKByh1T.png

然后运行软件点击Configure选项来配置IP等参数, 按照服务器的配置填写

最后点击图标下面的第一个选项 v2ray-core: unloaded 去加载

至此就可以自由上网了。

开启BBR加速

# 下载脚本
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh

# 添加执行权限
chmod +x bbr.sh

# 执行脚本安装
bash bbr.sh

安装完成后用`lsmod | grep bbr`查看结果,如果出现tcp_bbr就说明成功了。

参考

https://www.v2ray.com/awesome/tools.html

https://symeonchen.com/2019/05/22/configuring_v2ray_on_macos/

https://github.com/teddysun/across

一键安装最新内核并开启 BBR 脚本

https://blog.naibabiji.com/ji-qiao/centos7-an-zhuang-bbr.html

Redis pipeline优化

Redis pipeline 可以一次包含多条要执行的命令,减少和redis-server之间的网络来回,减少了建立网络连接的时间。

但是如果在pipeline中一次发送大量的命令,也会导致阻塞,直到所有命令执行完成。所以开发者通常会关心在pipeline中一次执行多少条命令才好呢。

其实这个没有标准答案,它视你服务器的配置而定,但是你可以通过redis-benchmark来测试最佳的命令条数。

测试普通情况下执行效率

redis-benchmark -n 100000 -t set,get -q

测试使用pipeline情况下的执行效率

redis-benchmark -n 100000 -t set,get -P 600 -q

n后面的数字是总请求数,P后面的是每次pipeline执行的命令个数,默认是1, q参数表示只显示每秒执行的命令数,如果不加q的话会显示详细的压测信息。

通过不断调整P后面的参数便可测试出你redis服务器pipeline最优数量。

参考

redis-benchmark 官网介绍

RHEL7安装protobuf

  1. sudo yum install autoconf automake libtool unzip gcc-c++ git -y
  2. git clone https://github.com/google/protobuf.git
  3. cd protobuf
  4. ./autogen.sh
  5. ./configure
  6. make
  7. make install
  8. 测试是否安装成功 protoc --version

在RHEL7上安装Docker CE

服务器版本: Red Hat Enterprise Linux Server release 7.5

在安装Docker CE的时候提示 WARNING: rhel is now only supported by Docker EE Check https://store.docker.com for information on Docker EE

解决办法如下:

  1. Install yum-utils. 执行 yum install -y yum-utils
  2. Install epel-release. 执行 wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmrpm -ivh epel-release-latest-7.noarch.rpm
  3. Add Docker CE to yum repos. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  4. 安装container-selinux,因为docker-ce依赖于container-selinux, yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.33-1.git86f33cd.el7.noarch.rpm, 如果不行尝试执行 yum -y --enablerepo=rhui-REGION-rhel-server-extras install container-selinux
  5. 安装Docker CE yum install -y docker-ce
  6. 查看是否安装成功 docker --version
  7. 重启Docker服务并加入开机启动 systemctl restart dockersystemctl enable docker
  8. 安装nginx容器测试下 docker run --name webserver -d -p 9090:80 nginx

安装完成后,需要把当前用户添加到用户组才能不以root身份运行 sudo usermod -aG docker ec2-user

参考地址

https://getstart.blog/2018/03/24/docker-ce-installation-on-red-hat-7/

https://www.itzgeek.com/how-tos/linux/centos-how-tos/installing-docker-on-centos-7-rhel-7-fedora-21.html

https://nickjanetakis.com/blog/docker-tip-39-installing-docker-ce-on-redhat-rhel-7x

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7

container-selinux问题的解决方案, 参考nderzhak的回答

脚本安装Docker-CE

Docker系列教程

Git常用操作详解

  • 删除远程分支

    git push -d origin branch_name

    git branch -d branch_name

  • 暂存当前的代码

    git stash save -u "your comment message"

  • 应用并删除最新暂存区的代码

    git stash pop

  • 应用暂存区最新的代码

    git stash apply

Linux Crontab 介绍

Crontab是Linux下用于管理定时任务运行的工具,常用的命令有两个crontab -ecrontab -l

有两种方式可以建定时任务

  • 第一种,每个用户都可以建立自己的crontab,直接输入crontab -e便可建立自己的crontab,建议用于临时测试。
  • 第二种,编辑文件vim /etc/crontab,这种方式便于系统的统一管理和调度,避免找不到哪些crontab是由哪些用户建的问题,推荐此方式。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# 如上说明了crontab的基本语法,以及可以指定运行crontab的用户身份。
# 比如下面的例子指定了以www用户的身份来运行,这种指定用户的方式可以很好的避免权限所带来的一些问题。
# * * * * * www php artisan queue:work

Centos安装配置Supervisod

EPEL是Fedora官方维护的Linux企业扩展库,提供高质量的软件库,里面包含大量开源的工具集。

第一步,开启EPEL Repository,下载并安装EPEL。

  • wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm

  • rpm -ivh epel-release-7-10.noarch.rpm

第二步,检查EPEL是否开启成功 yum repolist

第三步, 查找supervisord yum --enablerepo=epel info zabbix

第四步, 安装supervisord yum --enablerepo=epel install zabbix

安装完后后会有两个命令,一个supervisord和supervisorctl,supervisord是服务端进程,supervisorctl是管理服务器端进程的,可以重新加载配置,重启,查看进程状态等。

Supervisord配置

;[program:laravel-worker]
;command=php artisan queue:work --timeout=120              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s) 多进程的话需要设置为%(program_name)s_%(process_num)02d
;numprocs=1                    ; number of processes copies to start (def 1) 进程数量
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999) 优先级,值越低优先级越高,越先启动
;autostart=true                ; start at supervisord start (default: true) 如果是true,当supervisor启动时,程序将会自动启动
;autorestart=true              ; retstart at unexpected quit (default: true) 是否自动重启
;startsecs=10                  ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)
参考

https://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/

https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/

https://support.rackspace.com/how-to/install-epel-and-additional-repositories-on-centos-and-red-hat/

https://my.oschina.net/crooner/blog/395069