• Linux随笔


    [toc]

    Linux常用命令

    cd命令

    这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径

    cd /root/Docements # 切换到目录/root/Docements
    cd ./path          # 切换到当前目录下的path目录中,“.”表示当前目录  
    cd ../path         # 切换到上层目录中的path目录中,“..”表示上一层目录
    cd -               # 回到上一次目录,等同于cd $OLDPWD,它还会返回上一次目录的物理路径
    

    ls命令

    查看文件与目录,它的参数非常多,这些参数也可以组合使用

    -l :列出长数据串,包含文件的属性与权限数据等
    -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
    -d :仅列出目录本身,而不是列出目录的文件数据
    -h :将文件容量以较易读的方式(GB,kB等)列出来
    -R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来
    

    grep命令

    常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为

    grep [-acinv] [--color=auto] '查找字符串' filename
    

    常用参数如下:

    -a :将binary文件以text文件的方式查找数据
    -c :计算找到‘查找字符串’的次数
    -i :忽略大小写的区别,即把大小写视为相同
    -v :反向选择,即显示出没有‘查找字符串’内容的那一行
    
    # 当前目录下所有文件查找 key 单词,并列出行号
    grep -rn 'key' ./*
    

    tra命令

    该命令用于对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序。常用参数如下:

    -c :新建打包文件
    -t :查看打包文件的内容含有哪些文件名
    -x :解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
    -j :通过bzip2的支持进行压缩/解压缩
    -z :通过gzip的支持进行压缩/解压缩
    -v :在压缩/解压缩过程中,将正在处理的文件名显示出来
    -f filename :filename为要处理的文件
    -C dir :指定压缩/解压缩的目录dir
    

    一般常用命令:

    压缩:tra -zcvf filename.tar.gz filename/
    解压:tar -zxvf filename.tar.gz
    

    rsync命令

    Rsync(remote sync)是 UNIX 及类 UNIX 平台下一款神奇的数据镜像备份软件,它不像 FTP 或其他文件传输服务那样需要进行全备份。

    Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制, Rsync 可以使用SSH 安全隧道进行加密数据传输

    rsync支持一百多个多个选项:

    -a 包含-rtplgoD
    -r 同步目录时要加上,类似cp时的-r选项
    -v 同步时显示一些信息,让我们知道同步的过程
    -l 保留软连接
    -L 加上该选项后,同步软链接时会把源文件给同步
    -p 保持文件的权限属性
    -o 保持文件的属主
    -g 保持文件的属组
    -D 保持设备文件信息
    -t 保持文件的时间属性
    --delete 删除DEST中SRC没有的文件
    --exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步
    -P 显示同步过程,比如速率,比-v更加详细
    -u 加上该选项后,如果DEST中的文件比SRC新,则不同步
    -z 传输时压缩
    
    # 将本地目录文件传到远端服务器
    rsync -av ./file -e ssh user@ip:/path
    

    一些常见问题

    apt安装错误:

    错误信息:E: Sub-process /usr/bin/dpkg returned an error code (1)

    解决办法:

    cd /var/lib/dpkg/
    sudo mv info/ info_bak          # 现将info文件夹更名
    sudo mkdir info                 # 再新建一个新的info文件夹
    sudo apt-get update             # 更新
    sudo apt-get -f install         # 修复
    sudo mv info/* info_bak/        # 执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_bak文件夹下
    sudo rm -rf info                # 把自己新建的info文件夹删掉
    sudo mv info_bak info           # 把以前的info文件夹重新改回名
    

    ssh启动错误

    错误信息:no hostkeys available— exiting。错误原因是ssh密钥出现问题,需要重新生成密钥。

    # 重新申城密钥
    ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    
    # 修改密钥权限
    chmod 600 /etc/ssh/ssh_host_dsa_key
    chmod 600 /etc/ssh/ssh_host_rsa_key
    
    # 重启ssh服务
    /etc/init.d/ssh restart
    

    MySQL不用密码也能登录

    进入数据库执行下面命令:

    > use mysql;
    
    > update user set authentication_string=password("你的密码") where user='root';
    
    > update user set plugin="mysql_native_password";
    
    > flush privileges;
    

    之后退出MySQL,重启MySQL即可。

    MySQL允许远程连接

    1.修改MySQL配置文件(一般是:/etc/mysql/mysql.conf.d/mysqld.cnf)中的bind-address,将配置值由 127.0.0.1 改为 0.0.0.0

    2.该表,将表中需要远程连接的用户的host改为 '%',以root为例:

    > use mysql;
    
    > update user set host = '%' where user = 'root';
    

    之后,重启MySQL即可

    WSL上安装jupyter不能自动打开浏览器

    1.找到浏览器在WSL中的位置:/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe

    注意:所有的空格或者符号前都需要加防转义符‘’

    /mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe
    

    创建一个软连接:

    sudo ln -s /mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe /usr/bin/chrome
    

    2.编辑jupyter配置文件

    先生成默认的配置文件:

    jupyter notebook --generate-config
    

    打开配置文件(~/.jupyter/jupyter_notebook_config.py),更改配置:

    # 自定义浏览器
    import webbrowser
    webbrowser.register('chrome',None,webbrowser.GenericBrowser('/usr/bin/chrome'))
    c.NotebookApp.browser = 'chrome'
    
    # 禁用重定向
    c.NotebookApp.use_redirect_file = False
    

    附Linux常用命令图: image

    Vim使用技巧

    Vim基础配置

    '设置编码'
    set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
    set termencoding=utf-8
    set encoding=utf-8
    '显示行号'
    set nu
    set number
    '突出显示当前行'
    set cursorline
    set cul          'cursorline的缩写形式'
    '突出显示当前列'
    set cursorcolumn
    set cuc          'cursorcolumn的缩写形式'
    '启用鼠标'
    set mouse=a
    set selection=exclusive
    set selectmode=mouse,key
    '显示括号匹配'
    set showmatch
    '设置Tab长度为4空格'
    set tabstop=4
    '设置自动缩进长度为4空格'
    set shiftwidth=4
    '继承前一行的缩进方式,适用于多行注释'
    set autoindent
    '设置粘贴模式'
    set paste
    '显示空格和tab'
    set listchars=tab:>-,trail:-
    '总是显示状态栏'
    set laststatus=2
    '显示光标当前位置'
    set ruler
    '打开文件类型检测'
    filetype plugin indent on
    

    获得写权限

    :w !sudo tee %
    

    命令:w !,让 vim 执行一个外部命令,然后把当前缓冲区的内容从 stdin 传入。

    tee 是一个把 stdin 保存到文件的小工具。 而 %,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。

    所以执行这个命令,就相当于从vim外部修改了当前编辑的文件

    多行注释

    1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;
    2. 在行首使用上下键选择需要注释的多行;
    3. 按下键盘(大写)“I”键,进入插入模式;
    4. 然后输入注释符(“//”、“#”等);
    5. 最后按下“Esc”键。

    Linux磁盘挂载

    此处以 /dev/vdb 表示待挂载的分区标示。

    查看系统上的数据

    运行如下命令

    fdisk -l
    

    如果执行命令后,不存在/dev/vdb,表示没有数据盘,请确认数据盘是否已挂载。

    创建分区

    依次运行一下命令给,创建一个分区

    • 运行fdisk -u /dev/vdb命令分区数据盘
    • 输入 p 查看数据盘分区情况
    • 输入 n 创建一个性的分区
    • 输入 p 选择分区类型为主分区。(创建一个单分区数据盘可以只创建主分区。如果要创建四个以上分区,应该至少选择一次 e 即extended,从创建至少一个扩展分区)
    • 输入分区标号并按回车,仅创建一个分区输入 1
    • 输入第一个可用分区的扇区标号,按回车键采用默认值2048
    • 输入最后一个山区编号,仅创建一个分区,按回车键采用默认值
    • 输入 p 查看该数据盘的规划分区情况
    • 输入 w 开始分区,并在完成分区后退出

    查看新分区

    运行fdisk -lu /dev/vdb命令查看新分区。

    如果出现/dev/vdb1的相关信息,表示新分区已创建完成。

    创建文件系统

    之后需要在新分区上创建文件系统,根据需求运行以下任一命令,创建文件系统

    创建一个 ext4 文件系统

    mkfs -t ext4 /dev/vdb1
    

    创建一个xfs文件系统

    mkfs -t xfs /dev/vdb1
    

    如果需要在Linux、Windows和Mac系统之间共享文件,可以创建VFAT文件系统

    开机自动挂载

    向 /etc/fstab 写入新分区信息,启动开机自动挂载分区。

    • 运行命令 cp /etc/fstab /etc/fstab.bak,备份文件
    • 运行命令echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/"//g'` /mnt ext4 defaults 0 0 >> /etc/fstab,向/etc/fstab里写入新分区信息.

    如果需要把数据盘单独挂载到某个文件夹,例如单独用来存放数据,可以将命令中的/mnt 替换成所需的挂载点的路径。

    建议在/etc/fstab中使用全局唯一标识符UUID来引用新分区。您可以使用blkid命令获得新分区的UUID。
    Ubuntu 12.04系统不支持barrier,您需要运行echo '`blkid /dev/vdb1 | awk '{print $3}' | sed 's/"//g'` /mnt ext4 barrier=0 0 0' >> /etc/fstab命令。
    

    挂载文件系统

    运行 mount /dev/vdb1 /mnt命令挂载文件系统。如果运行 df -h 命令后出现新建文件系统信息,表示文件系统挂载成功。

    ssh免密登录

    获取本机的公钥文件,默认在用户目录下的隐藏文件夹 .ssh 中,如果没有,使用下面命令生成:

    ssh-keygen
    

    查看远程主机 .ssh 文件夹下是否有authorized_keys文件,没有则创建并修改权限为600

    touch authorized_keys
    chmod 600 authorized_keys
    

    把本地公钥传输到远程主机,然后追加公钥到authorized_keys文件中

    cat id_rsa.pub >> authorized_keys
    

    重定向

    标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)的文件描述符分别是0、1和2

    标准输入 = /dev/stdin = 代号0 = <符号(注意,没有包含<<符号)。
    
    标准输出 = /dev/stdout = 代号1 = >或>>符号。
    
    标准错误输出 = /dev/stderr = 代号2 = 使用2>或2>>符号。
    

    例如 ls / > file1 2>&1 表示先打开file1作为标准输出(fd=1)的目的地,然后再将标准错误绑定到标准输出(已经是file1)上,这样无论是标准错误还是标准输出都重定向到file1

    Docker

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    容器是完全使用沙箱机制,相互之间不会有任何接口。

    Docker架构

    dockers包括三个基本的概念:

    1. 镜像:用于创建Docker容器的模板,相当于是一个 root 文件系统
    2. 容器:独立运行的一个或一组应用,是镜像运行时的实体
    3. 仓库:代码控制中心,用来保存镜像。

    安装Docker

    Ubuntu安装Docker

    卸载旧版本

    Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们。

    设置仓库

    在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。

    安装 apt 依赖包,用于通过HTTPS来获取仓库

    sudo apt-get install 
        apt-transport-https 
        ca-certificates 
        curl 
        gnupg-agent 
        software-properties-common
    

    添加 Docker 的官方 GPG 密钥:

    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    

    验证您现在是否拥有带有指纹的密钥

    sudo apt-key fingerprint 0EBFCD88
    

    设置稳定版仓库

    sudo add-apt-repository 
        "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ 
        $(lsb_release -cs) 
        stable"
    
    安装

    更新 apt 包索引,安装最新版本的 Docker Engine-Community 和 containerd

    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io
    

    centos安装

    卸载旧版本

    较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项

    sudo yum remove docker 
        docker-client 
        docker-client-latest 
        docker-common 
        docker-latest 
        docker-latest-logrotate 
        docker-logrotate 
        docker-engine
    
    仓库设置

    安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

    sudo yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2
    

    设置稳定的仓库

    # 阿里云的源
    sudo yum-config-manager 
        --add-repo 
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        
    # 官方的源
    sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    
    安装
    sudo yum install docker-ce docker-ce-cli containerd.io
    

    容器使用

    对容器的操作可以使用容器id或容器名称来指定具体是哪个容器

    1. 载入镜像:docker pull ubuntu
    2. 启动容器:docker run -it ubuntu /bin/bash
    3. 查看所有容器:docker ps -a
    4. 后台运行:docker run -itd --name ubuntu-test ubuntu /bin/bash
    5. 停止一个容器:docker stop <容器 ID>.
    6. 重启容器:docker restart <容器 ID>
    7. 进入容器:docker exec -it <容器 ID> /bin/bash
    8. 导出容器:docker export <容器 ID> filename.tar
    9. 导入容器:cat filename.tar | docker import - test/ubuntu:v1
    10. 删除容器:docker rm -f <容器 ID>
    11. 查看容器底层信息:docker inspect <容器 ID>
    12. 列出本地镜像列表:docker images
    13. 查找镜像:docker search httpd
    14. 删除镜像:docker rmi <镜像名称>
    15. 从已有容器创建镜像:docker commit -m="some infomation" -a="jxc321" <容器 ID> jxc/ubuntu:v2
    16. 从Dockerfile文件创建镜像:docker build -t jxc/ubuntu:v2 .
    17. 设置镜像标签:docker tag <镜像 ID> jxc/ubuntu:v2

    容器连接

    端口映射

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

    docker run -d -p 5000:5000 training/webapp python app.py
    

    网络连接

    # 创建一个新的Docker网络
    docker network create -d bridge test-net
    
    # 查看网络
    docker network ls
    

    -d:参数指定 Docker 网络类型,有 bridge、overlay(用于 Swarm mode)。

    运行一个容器并连接到新建的 test-net 网络:

    docker run -itd --name test1 --network test-net ubuntu /bin/bash
    docker run -itd --name test2 --network test-net ubuntu /bin/bash
    

    然后再两个容器中相互ping,看能否ping通

    Dockerfile

    Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需要的指令和说明。

    Dockerfile有很多的指令,下面逐一介绍几个比较重要的:

    FROM:

    定制的镜像都是基于FROM的镜像

    RUN:

    用于执行后面跟着的命令行命令,有两种格式

    shell格式:

    RUN <命令行命令>
    # <命令行命令> 等同于,在终端操作的 shell 命令。
    

    exec格式:

    RUN ["可执行文件", "参数1", "参数2"]
    # 例如:
    # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
    

    注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

    FROM centos
    RUN yum install wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN tar -xvf redis.tar.gz
    # 以上执行会创建 3 层镜像。可简化为以下格式:
    FROM centos
    RUN yum install wget 
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" 
        && tar -xvf redis.tar.gz
    

    COPY

    复制指令,从上下文目录中复制文件或者目录到容器指定的路径。

    # [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
    COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
    COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
    

    CMD

    类似于RUN指令,用于运行程序,但二者的运行时间点不同:

    • CMD 在docker run 时运行
    • RUN是在docker build 时运行

    ENV

    设置环境变量,定义了环境变量,那么在后学的指令中,就可以使用这个环境变量

    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2> ...
    
    # 设置 NODE_VERSION = 7.0 那么在后续的指令中可以通过 $NODE_VERSION 引用
    ENV NODE_VERSION = 7.0
    

    VOLUME

    定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名数据卷。在启动 容器时可以通过 -v 参数修改挂载点

    VOLUME ["<路径1>", "<路径2>"...]
    VOLUME <路径>
    

    Docker-compose

    Docker基础知识

    Compose适用于定义和运行多容器Docker应用程序的工具,是一用python编写的Docker工具,本质上还是调用Docker的API命令。可以使用python包管理工具pip安装,然后使用一个命令,就可以从YML文件配置中创建并启动所有服务。

    Compose使用的三个步骤:

    • 使用Dockerfile定义应用程序的环境
    • 使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    • 最后执行docker-compose up 命令来启动并运行整个应用程序。

    YML基础语法如下:

    • 大小写敏感
    • 使用缩进表示层级关系
    • 缩进不允许使用tab,只允许使用空格
    • 缩进的空格数不重要,只要相同层级的元素左对齐即可
    • # 表示注释

    看一个WordPress.yaml文件模板

    version: '3' # 定义版本,不指定默认为版本 1,新版本功能更多
    
    services: # 容器,就像 docker run
       db: # 名称,它也是 network 中 DNS 名称
         image: mysql:5.7 # 镜像,如果像自定义镜像可以不指定这个参数,而用 build
         volumes: # 定义数据卷,类似 -v
           - db_data:/var/lib/mysql
           - .:/aaa # 挂载当前目录到容器中的 /aaa 无需使用绝对路径
         restart: always # 类似 --restart
         # 'no' 默认,不自动重启,以为 no 是 yaml 关键字所以加引号
         # always 总是自动重启
         # on-failure 当失败时自动重启,也就是 exit code 不为 0 时
         # unless-stopped 除非手动停止,否者一直重启
         environment: # 定义环境变量,类似 -e
           MYSQL_ROOT_PASSWORD: somewordpress
           MYSQL_DATABASE: wordpress
           MYSQL_USER: wordpress
           MYSQL_PASSWORD: wordpress
       wordpress: # 第二个容器
         labels:
           com.example.description: "This label will appear on all containers for the web service"
         # 为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
         depends_on: # 帮助 compose 理解容器之间的关系
         # db 将会在 wordpress 之前被启动
         # 关闭时 wordpress 将会在 db 之前关闭
         # 我们指定只启动 wordpress,db 也会跟着启动
           - db
         image: wordpress:latest
         ports: # 端口,类似 -p
           - "8000:80"
         restart: always
         environment:
           WORDPRESS_DB_HOST: db:3306
           WORDPRESS_DB_USER: wordpress
           WORDPRESS_DB_PASSWORD: wordpress
    
    volumes: # 可选,需要创建的数据卷,类似 docker volume create
      db_data:
    
    networks: # 可选,需要创建的网络,类似 docker network create
    
    

    yml配置指令参考

    • version:指定本 yml 依从的compose版本
    • huild:指定为构建镜像上下文路径
    version: "3.7"
    services:
      webapp:
        build:
          context: ./dir    #上下文路径
          dockerfile: Dockerfile-alternate  #指定构建镜像的Dockerfile文件名
          args: #添加构建参数,只能在构建过程中访问的环境变量
            buildno: 1
          labels:   #设置构建镜像的标签
            - "com.example.description=Accounting webapp"
            - "com.example.department=Finance"
            - "com.example.label-with-empty-value"
          target: prod  多层构建,可以指定构建哪一层
    
    • cap_add、cap_drop:添加或删除容器拥有的宿主机的内核功能
    cap_add:
      - ALL # 开启全部权限
    
    cap_drop:
      - SYS_PTRACE # 关闭 ptrace权限
    
    • container_name:指定自定义容器名称,而不是生成默认名称
    • depends_on:设置依赖关系
    version: "3.7"
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres
        
    
    • restart:重启策略
    no:是默认的重启策略,在任何情况下都不会重启容器。
    always:容器总是重新启动。
    on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
    unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
    
    • volumes:将主机的数据卷或文件挂载到容器里
    version: "3.7"
    services:
      db:
        image: postgres:latest
        volumes:
          - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
          - "/localhost/data:/var/lib/postgresql/data"
    

    示例1:docker部署owncloud

    1.拉取镜像文件
    docker pull owncloud:latest
    docker pull mysql:5.7
    
    2.启动MySQL容器
    docker run --name owncloud-mysql -p 3307:3306 -e MYSQL\_ROOT\_PASSWORD=root -d mysql:5.7
    
    3.启动owncloud容器
    docker run --name owncloud -p 81:80 --link owncloud-mysql:db -d owncloud:latest
    
    4.web界面访问

    IP:端口

    然后设置管理员账户、密码,就可以愉快的使用了

    Supervisor

    Supervisor一个用python开发的一套通用的进程管理程序,能将一个普通的命令进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

    通过fork或exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,可以选择是否自己启动和报警

    安装

    可以使用系统的包管理工具来安装

    yum install supervisor
    apt install supervisor
    

    配置文件

    supervisor的配置文件:/etc/supervisor/supervisord.conf 默认配置时补全的,不过大部分情况下,默认配置的功能已经能满足。

    配置文件说明:

    [unix_http_server]
    file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
    ;chmod=0700                 ;socket文件的mode,默认是0700
    ;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
     
    ;[inet_http_server]         ;HTTP服务器,提供web管理界面
    ;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
    ;username=user              ;登录管理后台的用户名
    ;password=123               ;登录管理后台的密码
     
    [supervisord]
    logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
    logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
    logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
    loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
    pidfile=/tmp/supervisord.pid ;pid 文件
    nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
    minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
    minprocs=200                 ;可以打开的进程数的最小值,默认 200
     
    [supervisorctl]
    serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
    ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
     
    ; [program:xx]是被管理的进程配置参数,xx是进程的名称
    [program:xx]
    command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
    autostart=true       ; 在supervisord启动的时候也自动启动
    startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
    startretries=3       ; 启动失败自动重试次数,默认是3
    user=tomcat          ; 用哪个用户启动进程,默认是root
    priority=999         ; 进程启动优先级,默认999,值小的优先启动
    redirect_stderr=true ; 把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
    stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
    ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
    stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
    stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
     
    ;包含其它配置文件
    [include]
    files = relative/directory/*.ini    ;可以指定一个或多个以.ini结束的配置文件
    

    子进程配置文件

    给需要管理的子进程编写一个配置文件,放在 /etc/supervisor/conf.d/目录下,以.ini作为拓展名。示例:

    #项目名
    [program:blog]
    #脚本目录
    directory=/opt/bin
    #脚本执行命令
    command=/usr/bin/python /opt/bin/test.py
    
    #supervisor启动的时候是否随着同时启动,默认True
    autostart=true
    #当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
    autorestart=false
    #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
    startsecs=1
    
    #脚本运行的用户身份 
    user = test
    
    #日志输出 
    stderr_logfile=/tmp/blog_stderr.log 
    stdout_logfile=/tmp/blog_stdout.log 
    #把stderr重定向到stdout,默认 false
    redirect_stderr = true
    #stdout日志文件大小,默认 50MB
    stdout_logfile_maxbytes = 20MB
    #stdout日志文件备份数
    stdout_logfile_backups = 20
    

    supervisor命令说明

    常用命令如下

    echo_supervisord_conf       //查看默认配置
    supervisord -c /etc/supervisord.conf    //启动supervi服务
    supervisorctl status        //查看所有进程的状态
    supervisorctl stop es       //停止es
    supervisorctl start es      //启动es
    supervisorctl restart       //重启es
    supervisorctl update        //配置文件修改后使用该命令加载新的配置
    supervisorctl reload        //重新启动配置中的所有程序
    

    es换成all可以管理配置中的所有进程。直接输入supervisorctl进入supervisorctl的shell交互界面,此时上面的命令不带supervisorctl可直接使用。

    frp内网穿透

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

    而且,你只需要配置一台有公网IP的服务器,便能通过该服务器的众多端口将多台内网机子、多个服务暴露到公网中,十分方便。

    原理

    frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

    内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

    用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

    下载

    目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中

    部署

    解压缩下载的压缩包,将其中的 frpc 拷贝到内网服务所在的机器上,将 frps 拷贝到具有公网 IP 的机器上,放置在任意目录。

    使用

    编写配置文件,先通过 ./frps -c ./frps.ini 启动服务端,再通过 ./frpc -c ./frpc.ini 启动客户端。如果需要在后台长期运行,建议结合其他工具使用,例如 systemd 和 supervisior。

    配置文件

    参考,下面使用的所有端口都必须在公网服务上开启:5443、6443、5000、5001

    # 服务端配置:ssh 客户端用户@服务器IP -p 客户端映射ssh端口
    [common]
    # 服务器IP地址
    server_addr = xxx.xxx.xxx.xxx
    # 服务器绑定端口,防火墙需开放
    bind_port = 5443
    # 仪表盘端口
    dashboard_port = 6443
    # 仪表盘用户名和密码
    dashboard_user = admin
    dashboard_pwd = 123456
    # 连接密钥
    token = 5HAwZWHmUWzjSoFL
    # http端口,暂时用不上
    vhost_http_port = 8000
    
    
    # 客户端配置,common配置需要与服务器对应
    [common]
    # 服务器IP
    server_addr = xxx.xxx.xxx.xxx
    # 服务器绑定端口
    server_port = 5443
    # 连接密钥
    token = 5HAwZWHmUWzjSoFL
    
    [ssh]
    # 连接协议
    type = tcp
    # 本机地址(不必修改)
    local_ip = 127.0.0.1
    # 本机ssh端口
    local_port = 22
    # 远端映射ssh端口,远端本地就通过这个端口地址访问本机
    remote_port = 5000
    
    [mysql]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3306
    remote_port = 5002
    

    远程连接

    # 连接ssh
    ssh user@xxx.xxx.xxx.xxx -p 5001
    
    # 连接数据库,数据库需要事先设置允许远端登录
    mysql -u root -P 5002  -h xxx.xxx.xxx.xxx -p
    

    Nginx

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

    在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

    Nginx配置文件详解

    配置文件结构大致如下:

    ...              #全局块
    
    events {         #events块
       ...
    }
    
    http      #http块
    {
        ...   #http全局块
        server        #server块
        { 
            ...       #server全局块
            location [PATTERN]   #location块
            {
                ...
            }
            location [PATTERN] 
            {
                ...
            }
        }
        server
        {
          ...
        }
        ...     #http全局块
    }
    
    1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
    3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
    4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
    5. location块:配置请求的路由,以及各种页面的处理情况。

    配置文件示例和解释:

    #user administrator administrators;  #配置用户或者组,默认为nobody nobody。
    
    #worker_processes 2;  #允许生成的进程数,默认为1
    
    #pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
    
    error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
    
    events {
        accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
        multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
        #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
        worker_connections  1024;    #最大连接数,默认为512
    }
    http {
        include       mime.types;   #文件扩展名与文件类型映射表
        default_type  application/octet-stream; #默认文件类型,默认为text/plain
        #access_log off; #取消服务日志    
        log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
        access_log log/access.log myFormat;  #combined为日志格式的默认值
        sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
        sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
        keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
    
        upstream mysvr {   
          server 127.0.0.1:7878;
          server 192.168.10.121:3333 backup;  #热备
        }
        error_page 404 https://www.baidu.com; #错误页
        server {
            keepalive_requests 120; #单连接请求上限次数。
            listen       4545;   #监听端口
            server_name  127.0.0.1;   #监听地址       
            location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
               #root path;  #根目录
               #index vv.txt;  #设置默认页
               proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
               deny 127.0.0.1;  #拒绝的ip
               allow 172.18.5.54; #允许的ip           
            } 
        }
    }
    
    待人友善是修养, 独往独来是性格。 --qq:2986957136
  • 相关阅读:
    图片滚动懒加载用jquery-lazyload 与手动Jquery 写
    穿梭框(filter过滤方法,sort排序 v-model)
    选择添加好友(包含 去重,删除splice 等) v-show(解决显示隐藏闪动问题)
    求数组中最小的数值(结合apply() call())
    Vue
    js递归
    使用kdf 元素来接收键盘的输入指令
    编辑滚动条样式
    【IntelliJ IDEA】Debug调试的使用记录
    福利:IntelliJ IDEA 破解激活教程
  • 原文地址:https://www.cnblogs.com/jxc321/p/14409245.html
Copyright © 2020-2023  润新知