Linux随笔

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 !{cmd},让 vim 执行一个外部命令{cmd},然后把当前缓冲区的内容从 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           
        } 
    }
}
posted @ 2021-02-17 17:18  佳星辰  阅读(125)  评论(0编辑  收藏  举报