[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常用命令图:
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外部修改了当前编辑的文件
多行注释
- 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;
- 在行首使用上下键选择需要注释的多行;
- 按下键盘(大写)“I”键,进入插入模式;
- 然后输入注释符(“//”、“#”等);
- 最后按下“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包括三个基本的概念:
- 镜像:用于创建Docker容器的模板,相当于是一个 root 文件系统
- 容器:独立运行的一个或一组应用,是镜像运行时的实体
- 仓库:代码控制中心,用来保存镜像。
安装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或容器名称来指定具体是哪个容器
- 载入镜像:
docker pull ubuntu
- 启动容器:
docker run -it ubuntu /bin/bash
- 查看所有容器:
docker ps -a
- 后台运行:
docker run -itd --name ubuntu-test ubuntu /bin/bash
- 停止一个容器:
docker stop <容器 ID>.
- 重启容器:
docker restart <容器 ID>
- 进入容器:
docker exec -it <容器 ID> /bin/bash
- 导出容器:
docker export <容器 ID> filename.tar
- 导入容器:
cat filename.tar | docker import - test/ubuntu:v1
- 删除容器:
docker rm -f <容器 ID>
- 查看容器底层信息:
docker inspect <容器 ID>
- 列出本地镜像列表:
docker images
- 查找镜像:
docker search httpd
- 删除镜像:
docker rmi <镜像名称>
- 从已有容器创建镜像:
docker commit -m="some infomation" -a="jxc321" <容器 ID> jxc/ubuntu:v2
- 从Dockerfile文件创建镜像:
docker build -t jxc/ubuntu:v2 .
- 设置镜像标签:
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全局块
}
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 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
}
}
}