配置VIM支持Nginx .conf文件语法高亮显示

我们在编辑配置 Nginx 的配置文件(.conf)时,由于他没有高亮的功能,但是 Nginx 官方是支持这个功能的;要想在编辑配置 Nginx 配置文件(.conf)的时候高亮语法以降低配置的错误发生率,我们只需要使用 Nginx 官方的语法高亮文件就可以了。

系统管理

手动修改

下载Nginx配置文件的语法文件:nginx.vim

wget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vim

将文件复制到 /usr/share/vim/vim74/syntax 目录(也可以是 单用户目录 ~/.vim/syntax/)。

修改 vim /usr/share/vim/vim74/filetype.vim 增加

au BufRead,BufNewFile /etc/nginx/,/usr/local/nginx/conf/ if &ft == ” | setfiletype nginx | endif

注意根据自己安装的nginx目录,修改上面的命令

自动化脚本

#!/bin/bash
mkdir -p ~/.vim/syntax && cd ~/.vim/syntax
wget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vim >/dev/null
echo "au BufRead,BufNewFile /usr/local/nginx/conf/* set ft=nginx" > ~/.vim/filetype.vim

其中路径/usr/local/nginx/conf/*为你的nginx.conf文件路径

将上述代码保存为.sh文件后在bash里运行即可。

centos 6.5 ansible的安装与使用方法

实验环境:

centos 6.5 x64

安装epel 源:

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

安装ansible 服务端:

yum install ansible -y

在配置文件中添加主机

vim /etc/ansible/hosts

[testhost]
192.168.28.70

测试所有连接的客户端:

[root@localhost ~]# ansible all -a 'who'
192.168.28.70 | SUCCESS | rc=0 >>
root pts/0 2017-07-11 04:13 (192.168.28.186)
root pts/2 2017-07-11 04:18 (192.168.28.186)
root pts/1 2017-07-11 04:45 (192.168.28.186)

测试一个简单的 ping:

[root@localhost ~]# ansible all -m ping
192.168.28.70 | SUCCESS => {
 "changed": false, 
 "ping": "pong"

远程执行命令

[root@localhost ~]# ansible testhost -m command -a 'w'

未分类

注意:”-m” 指定模块名,”-a” 指定相应命令,这样就可以批量执行命令。这里的 testhost 为之前自定义的主机组名。当然我们也可以直接写一个 ip,针对某一台机器来执行命令。如下:

未分类

远程执行shell脚本

1、创建一个shell脚本

[root@localhost ~]# cat /tmp/test.sh 
#!/bin/bash
 echo `date` > /tmp/ansible_shell.log

2、把脚本分发到远程主机

[root@localhost ~]# ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"
192.168.28.70 | SUCCESS => {
 "changed": true, 
 "checksum": "032e736ac2c71a85c09cbef25190e404aa7eb7e8", 
 "dest": "/tmp/test.sh", 
 "gid": 0, 
 "group": "root", 
 "md5sum": "874449f8733ff8aaece2a5859b0d4446", 
 "mode": "0755", 
 "owner": "root", 
 "secontext": "unconfined_u:object_r:admin_home_t:s0", 
 "size": 53, 
 "src": "/root/.ansible/tmp/ansible-tmp-1500430217.04-122496835634479/source", 
 "state": "file", 
 "uid": 0
}

3、执行脚本

[root@localhost ~]# ansible testhost -m shell -a "/tmp/test.sh"
192.168.28.70 | SUCCESS | rc=0 >>

拷贝文件

[root@localhost ~]# ansible testhost -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansibletet.txt owner=root group=root mode=0644" 
192.168.28.70 | SUCCESS => {
 "changed": true, 
 "checksum": "bd6fddebe99a0a92d02e9e198d34c406186edc87", 
 "dest": "/tmp/ansibletet.txt", 
 "gid": 0, 
 "group": "root", 
 "md5sum": "80f6c7c933dd1ca1c626ebffa3ddb8ed", 
 "mode": "0644", 
 "owner": "root", 
 "secontext": "unconfined_u:object_r:admin_home_t:s0", 
 "size": 18066, 
 "src": "/root/.ansible/tmp/ansible-tmp-1500430393.64-228538002701013/source", 
 "state": "file", 
 "uid": 0
}

拷贝目录

[root@localhost ~]# ansible testhost -m copy -a "src=/etc/ansible/ dest=/tmp/ansibletest owner=root group=root mode=0644"
192.168.28.70 | SUCCESS => {
 "changed": true, 
 "dest": "/tmp/ansibletest/", 
 "src": "/etc/ansible"
}

添加计划任务

[root@localhost ~]# ansible testhost -m cron -a "name='test_cron' job='/bin/touch /tmp/test.txt' hour='1,5,10' weekday=1"
192.168.28.70 | SUCCESS => {
 "changed": true, 
 "envs": [], 
 "jobs": [
 "test_cron"
 ]
}

去远程主机上查看

[root@bogon ~]# crontab -l
#Ansible: test_cron
* 1,5,10 * * 1 /bin/touch /tmp/test.txt

删除任务计划

若要删除该cron ,只需要加一个字段 state=absent

[root@localhost etc]# ansible testhost -m cron -a "name='test_cron' state=absent"
192.168.28.70 | SUCCESS => {
 "changed": true, 
 "envs": [], 
 "jobs": []
}

Yum 安装

我们来安装一个httpd服务

[root@localhost etc]# ansible testhost -m yum -a "name=httpd"

服务管理

开启 httpd服务,并关闭开机启动

[root@localhost etc]# ansible testhost -m service -a "name=httpd state=started enabled=no"

列出ansible 所有模块

[root@localhost etc]# ansible-doc -l

查看指定模块的用法

[root@localhost etc]# ansible-doc cron

CentOS 7 rpm安装mysql 5.7.18

最近一直使用MySQL,mysql-Linux下安装写了使用其他方式安装mysql,这次主要采用rpm格式来安装,试了一下感觉这种安装模式比较简单。

卸载MariaDB

centos7默认安装MariaDB而不是mysql,可能MariaDB数据库和mysql会冲突,故先卸载MariaDB。

1、查看已安装MariaDB相关的包

rpm -qa | grep mariadb

2、查看已安装的MariaDB相关yum包,包需根据rpm命令的结果判断

yum list mariadb-libs

3、移除已安装的MariaDB相关的yum包,包名需根据yum list命令结果判断,此步骤需要root权限

yum remove mariadb-libs

下载mysql rpm包

下面是官网的下载地址:
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar

使用rpm安装mysql

下面步骤需要root权限,各个包之间有依赖关系,故rpm命令必须按顺序执行。

mkdir mysql
tar -xv -f mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar -C mysql
cd mysql
rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.18-1.el7.x86_64.rpm

出现的问题:

1、libaio.so.1()(64bit) is needed by MySQL-server

解决方案:

安装libaio-0.3.107-10.el6.x86_64.rpm

①下载地址:

http://mirror.centos.org/centos/6/os/x86_64/Packages/libaio-0.3.107-10.el6.x86_64.rpm

②执行:

rpm -ivh libaio-0.3.107-10.el6.x86_64.rpm

2、net-tools is needed

解决方案:

yum install net-tools

3、perl(Getopt::Long) 被 mysql-community-server-5.7.18-1.el7.x86_64 需要

解决方案:

yum install perl

安装成功后,删除安装文件和临时文件,也可以不删除。

登录mysql,修改初始密码

以下步骤需要root权限。
1、由于一开始并不知道密码,先修改配置文件/etc/my.cnf,让mysql跳过登录时的权限验证。加入一行:

vi /etc.my.cnf
skip-grant-tables 

未分类

2、更改MySQL数据库目录的所属用户及其所属组,然后启动mysql

chown -R mysql:mysql /var/lib/mysql/ 
systemctl start mysqld.service //启动mysql数据库服务 

3、登录

mysql -uroot -p

4、修改密码

use mysql; 
update user set authentication_string =password('你自己的密码') where host ='localhost' and user='mysql';
quit;

5、使用密码重新登录

mysql -uroot -p

docker安装部署gitlab 配置使用部外nginx

一、docker安装gitlab镜像

1,镜像信息

https://hub.docker.com/r/gitlab/gitlab-ce/

docker pull gitlab/gitlab-ce

2,启动镜像

sudo docker run --detach 
 --hostname git.tmy.com 
 --publish 8929:80 --publish 2289:22 
 --name gitlab 
 --restart always 
 --volume /data/gitlab/config:/etc/gitlab 
 --volume /data/gitlab/logs:/var/log/gitlab 
 --volume /data/gitlab/data:/var/opt/gitlab 
 gitlab/gitlab-ce:latest

文档地址:https://docs.gitlab.com/omnibus/docker/#run-the-image

3,访问本机安装的gitlab

127.0.0.1:8929 端口号为步骤2中设置的端口号。

此处不知何种原因,启动了需要等待几分钟才可以访问,知道的大神可以六个言交流下。

可以访问之后继续往下走。

二、配置使用外部的nginx服务器

1,关闭gitlab内部的nginx服务

官方文档地址:https://docs.gitlab.com/omnibus/settings/nginx.html#using-a-non-bundled-web-server

启动的时候映射出来的目录
vim /data/gitlab/config/gitlab.rb 

在配置文件最末尾加上配置
nginx['enable'] = false 
web_server['external_users'] = ['www-data']

使配置生效
docker exec gitlab gitlab-ctl reconfigure

2,配置本机上的nginx

新nginx虚拟机配置文件,我的虚拟机配置文件在/usr/local/nginx/conf/vhost

vim /usr/local/nginx/conf/vhost/git.tmy.com.conf

下载官方的配置文件

https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/nginx

配置文件有http 和 https两个版本,这里我选择了http第一个

## GitLab 8.3+
##
## Lines starting with two hashes (##) are comments with information.
## Lines starting with one hash (#) are configuration parameters that can be uncommented.
##
##################################
## CONTRIBUTING ##
##################################
##
## If you change this file in a Merge Request, please also create
## a Merge Request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
##
###################################
## configuration ##
###################################
##
## See installation.md#using-https for additional HTTPS configuration details.

upstream gitlab-workhorse {
 server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}

## Normal HTTP host
server {
 ## Either remove "default_server" from the listen line below,
 ## or delete the /etc/nginx/sites-enabled/default file. This will cause gitlab
 ## to be served if you visit any address that your server responds to, eg.
 ## the ip address of the server (http://x.x.x.x/)n 0.0.0.0:80 default_server;
 listen 0.0.0.0:80 default_server;
 listen [::]:80 default_server;
 server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
 server_tokens off; ## Don't show the nginx version number, a security best practice
 root /opt/gitlab/embedded/service/gitlab-rails/public;

 ## See app/controllers/application_controller.rb for headers set

 ## Individual nginx logs for this GitLab vhost
 access_log /var/log/nginx/gitlab_access.log;
 error_log /var/log/nginx/gitlab_error.log;

 location / {
 client_max_body_size 0;
 gzip off;

 ## https://github.com/gitlabhq/gitlabhq/issues/694
 ## Some requests take more than 30 seconds.
 proxy_read_timeout 300;
 proxy_connect_timeout 300;
 proxy_redirect off;

 proxy_http_version 1.1;

 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;

 proxy_pass http://gitlab-workhorse;
 }
}

将配置文件写入刚才创建的虚拟机文件配置文件中。修改

#找到
upstream gitlab-workhorse {
 server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}
#修改为
upstream gitlab-workhorse {
 server unix:/data/gitlab/data/gitlab-workhorse/socket;
}
#找到
server_name YOUR_SERVER_FQDN;
#修改为
server_name git.tmy.com 【域名是你自己配置好的域名】
#找到
access_log /var/log/nginx/gitlab_access.log;
error_log /var/log/nginx/gitlab_error.log;
#改为
access_log /data/wwwlogs/gitlab_access.log;
error_log/data/wwwlogs/gitlab_error.log;
#上边是日志文件而已,改称你自己的就行

配置完成后检查nginx -t 是否正常,没问题重新载入配置即可。

三、修改目录权限

chown -R www:www /data/gitlab/data/gitlab-workhorse/

修改完成后访问git.tmy.com 即可进入gitlab的web界面了

Linux行匹配命令grep介绍

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep搜索的是包含某一模式的行,而不是完全匹配某一模式的行。

常用选项

  • -v 反转查找

  • -i 忽略字符大小写

  • -q 不显示任何信息

  • -E 使用扩展正则表达式

  • -R 在目录中递归搜索

  • -F 搜索固定字符串而不是搜索匹配表达式的模式

正则表达式

规定一些特殊语法表示字符类、数量限定符和位置限定符,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)

grep的正则表达式 有Basic和Extended两种规范,egrep相当于grep -E,表示才用Extended正则表达式语法。我们学习Extended正则表达式语法。

字符类

系统管理

数量限定符

系统管理

位置限定符

系统管理

其他特殊字符

系统管理

以上介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符 ? + { } | ( ) 应
解释为普通字符,要表示上述特殊含义则需要加 转义。如果用grep而不是egrep,并且不加 -E
选项,则应该遵照 Basic 规范来写正则表达式。

CentOS 6 GitLab的安装配置与使用方法

前言

  • GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
  • 它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。
  • 团队成员可以利用内置的简单聊天程序(Wall)进行交流。
  • 它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

Git的家族成员

  • Git:是一种版本控制系统,是一个命令,是一种工具。
  • Gitlib:是用于实现Git功能的开发库。
  • Github:是一个基于Git实现的在线代码托管仓库,包含一个网站界面,向互联网开放。
  • GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。

Gitlab的服务构成

  • Nginx:静态web服务器。
  • gitlab-shell:用于处理Git命令和修改authorized keys列表。
  • gitlab-workhorse:轻量级的反向代理服务器。
  • logrotate:日志文件管理工具。
  • postgresql:数据库。
  • redis:缓存数据库。
  • sidekiq:用于在后台执行队列任务(异步执行)。
  • unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。

GitLab工作流程

未分类

GitLab Shell

  • GitLab Shell有两个作用:为GitLab处理Git命令、修改authorized keys列表。
  • 当通过SSH访问GitLab Server时,GitLab Shell会:
  • 限制执行预定义好的Git命令(git push, git pull, git annex)
  • 调用GitLab Rails API 检查权限
  • 执行pre-receive钩子(在GitLab企业版中叫做Git钩子)
  • 执行你请求的动作 处理GitLab的post-receive动作
  • 处理自定义的post-receive动作
  • 当通过http(s)访问GitLab Server时,工作流程取决于你是从Git仓库拉取(pull)代码还是向git仓库推送(push)代码。
  • 如果你是从Git仓库拉取(pull)代码,GitLab Rails应用会全权负责处理用户鉴权和执行Git命令的工作;
  • 如果你是向Git仓库推送(push)代码,GitLab Rails应用既不会进行用户鉴权也不会执行Git命令,它会把以下工作交由GitLab Shell进行处理:
  1. 调用GitLab Rails API 检查权限
  2. 执行pre-receive钩子(在GitLab企业版中叫做Git钩子)
  3. 执行你请求的动作
  4. 处理GitLab的post-receive动作
  5. 处理自定义的post-receive动作

GitLab Workhorse

GitLab Workhorse是一个敏捷的反向代理。它会处理一些大的HTTP请求,比如文件上传、文件下载、Git push/pull和Git包下载。其它请求会反向代理到GitLab Rails应用,即反向代理给后端的unicorn。

Gitlab环境部署

ECS配置要求:内存2G以上

方法一:镜像部署

镜像名称:GitLab代码管理(Centos 64位 | GitLab) | 镜像帮助文档

进入镜像详情页面,单击立即购买,按提示步骤购买 ECS 实例。

购买完成之后,登录”ECS 管理控制台”,在左边导航栏里,单击”实例”,进入 ECS 实例列表页,选择所购 ECS 实例所在的地域,并找到所购 ECS 实例,在”IP 地址”列获取该实例的公网 IP 地址。

注意:镜像部署好后默认是禁止远端访问的,所以直接访问ECS服务器的公网IP是不能访问到GitLab的登录界面的,请先运行/alidata目录下的gitlab_opennet.sh脚本,开启远程访问,然后再通过浏览器访问公网IP来访问GitLab的主页。

方法二:手动部署:

1、配置yum源

vim /etc/yum.repos.d/gitlab-ce.repo

复制以下内容:

[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6
Repo_gpgcheck=0
Enabled=1
Gpgkey=https://packages.gitlab.com/gpg.key

未分类

2、更新本地yum缓存

sudo yum makecache

未分类

3、安装GitLab社区版

sudo yum intall gitlab-ce        #自动安装最新版
sudo yum install gitlab-ce-x.x.x    #安装指定版本

未分类

GitLab常用命令:

sudo gitlab-ctl start    # 启动所有 gitlab 组件;
sudo gitlab-ctl stop        # 停止所有 gitlab 组件;
sudo gitlab-ctl restart        # 重启所有 gitlab 组件;
sudo gitlab-ctl status        # 查看服务状态;
sudo gitlab-ctl reconfigure        # 启动服务;
sudo vim /etc/gitlab/gitlab.rb        # 修改默认的配置文件;
gitlab-rake gitlab:check SANITIZE=true --trace    # 检查gitlab;
sudo gitlab-ctl tail        # 查看日志;

GitLab使用

登录GitLab

1、在浏览器的地址栏中输入ECS服务器的公网IP即可登录GitLab的界面,第一次登录使用的用户名和密码为 root 和 5iveL!fe。

未分类

2、首次登录会强制用户修改密码。密码修改成功后,输入新密码进行登录。

未分类

未分类

创建Project

1、安装Git工具linux:安装Git,使用自带的源安装。

yum install git

未分类

2、生成密钥文件

使用ssh-keygen生成密钥文件.ssh/id_rsa.pub。

未分类

未分类

3.在GitLab的主页中新建一个Project

未分类

未分类

4.添加ssh key导入步骤2中生成的密钥文件内容:

未分类

未分类

ssh key添加完成:

未分类

项目地址,该地址在进行clone操作时需要用到:

未分类

简单配置

1、配置使用Git仓库的人员姓名

git config --global user.name "上海驻云"    

2、配置使用Git仓库的人员email,填写自己的公司邮箱

git config --global user.email "[email protected]" 

3、克隆项目,在本地生成同名目录,并且目录中会有所有的项目文件

git clone git@iZbp1h7fx16gkr9u4gk8v3Z:root/test.git

未分类

上传文件

1、进入到项目目录

cd test/ 

2、创建需要上传到GitLab中的目标文件

echo “test” >  /root/test.sh

3、将目标文件或者目录拷贝到项目目录下

cp /root/test.sh ./    

未分类

4、将test.sh文件加入到索引中

git add test.sh 

5、将test.sh提交到本地仓库

git commit -m “test.sh”

6、将文件同步到GitLab服务器上

git push -u origin master 

未分类

7、在网页中查看上传的test.sh文件已经同步到GitLab中

未分类

使用Docker Compose部署Django和Vue.js应用

前言

本文主要内容关于使用docker-compose实践部署后端django-rest-framework和前端vue.js应用。记录其中遇到的一些坑以及解决办法。

准备Docker-compose环境

系统:Ubuntu 16.04(阿里云)代码中用户名:test

安装Docker

# install docker
## prepare
echo 'Preparing...'
sudo apt update
sudo apt upgrade -y
sudo apt install -y linux-image-extra-$(uname -r) linux-image-extra-virtual
## docker
echo 'Installing docker...'
sudo apt remove -y docker-ce docker-engine docker.io
wget -qO- http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh
sudo apt autoremove -y

sudo usermod -aG docker ${USER}

## docker Aliyun accelerator
## https://cr.console.aliyun.com/#/accelerator
echo 'Configuring docker registry mirrors...'
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://<your-own>.mirror.aliyuncs.com"]
}
EOF

exists(){
  command -v "$1" >/dev/null 2>&1
}

echo 'Installing docker-compose...'
if ! exists pip; then
    sudo apt install python-pip
fi
sudo python `which pip` install docker-compose

echo 'Restarting docker...'
sudo systemctl daemon-reload
sudo systemctl restart docker

部署

目录结构

.
├── .env // 环境变量
├── docker-compose.yml
├── backend // 放置后台django文件
├── frontend // 放置前端vue编译后代码
└── nginx // nginx相关配置
    ├── backend.conf
    ├── Dockerfile
    └── frontend.conf

具体配置

docker-compose.yml
version: '3'

services:
  web:
    restart: always
    build: ./backend
    expose:
      - "8000"
    volumes:
      - ./backend:/code
    env_file: .env
    links:
      - db
    depends_on:
      - db
    command: ["/code/wait-for-it.sh", "db:3306", "--", "bash","startup.sh"]
  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
    volumes:
      - ./frontend:/usr/share/nginx/html/frontend:ro
      - ./backend/public:/usr/share/nginx//html/backend/public:ro
    links:
      - web
    depends_on:
      - web
  db:
    restart: always
    image: mysql:latest
    env_file: .env
    volumes:
      - ./data/initsql:/docker-entrypoint-initdb.d
      - ./data/db:/var/lib/mysql
    command: [mysqld, --character-set-server=utf8, --collation-server=utf8_unicode_ci]

第一次使用docker-compose部署,从网上参考了许多例子。但是由于docker-compose个版本的语法改动不小,遇到很多坑:

不同容器共享数据(host主机上的数据)

有些例子使用volumes_from,但是version 3已经删除该设置项更新变化。
官方推荐在根节点(与services同级)下配置volumes,但是没法映射到host主机的文件,有个插件local-persist可以做到,但是不想依赖第三方插件。只能使用麻烦点的写法:在每个service的volume设置项里重复映射host主机的文件

    web:
      volumes:
        - ./backend:/code
    nginx:
      volumes:
        - ./backend/public:/usr/share/nginx//html/backend/public:ro

不同容器互相通信

使用links实现容器间通信。配置需要访问的容器于links配置项下,没什么毛病。

容器启动顺序

实现容器按顺序启动,需要用到depends_on。

但是会有一个问题:depends_on只保证启动顺序,而我们的实际需求是:web容器启动的commands必须等到mysql完全启动,web容器的command才可以执行。因为我们加了restart: always,所以会导致web容器不断重启直到db容器启动完成。

我的解决办法是:给web容器的启动命令加上对mysql服务可用的查询,使用了一个查询脚本wait-for-it:

    command: ["/code/wait-for-it.sh", "db:3306", "--", "bash","startup.sh"]

环境变量

会有多个容器使用相同环境变量的情况,所以都放在.env文件里

    DEBUG=false

    MYSQL_HOST=db
    MYSQL_DATABASE=mydb
    MYSQL_ROOT_PASSWORD=mypass

关于Mysql官方镜像配置

  • 可以定义volume持久化数据库文件:
volumes:
- ./data/db:/var/lib/mysql
  • 如果有初始数据需要导入,可以定义volume映射到/docker-entrypoint-initdb.d:
volumes:
- ./data/initsql:/docker-entrypoint-initdb.d

注意: 该配置只有在/var/lib/mysql/下的mysql目录不存在时才会生效。也就是说,一旦容器启动过一次,之后就在也不会导入/docker-entrypoint-initdb.d里的文件,除非手动清空/var/lib/mysql/(或host主机的./data/db目录)。

关于Nginx容器配置

Dockerfile

    FROM nginx:alpine

    RUN rm /etc/nginx/conf.d/default.conf

    ADD frontend.conf /etc/nginx/conf.d/
    ADD backend.conf /etc/nginx/conf.d/

frontend.conf – vue app build files

    server {
        listen 80 deferred;
        server_name new.bylie.cn;

        root /usr/share/nginx/html/frontend;

        location / {
            try_files $uri $uri/ /index.html =404;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

backend.conf – django app

    server {
        # use 'listen 80 deferred;' for Linux
        # use 'listen 80 accept_filter=httpready;' for FreeBSD
        listen 80 deferred;
        client_max_body_size 5M;

        # set the correct host(s) for your site
        server_name service.bylie.cn;

        keepalive_timeout 5;

        location /public {
            root /usr/share/nginx/html/backend;
        }

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # enable this if and only if you use HTTPS
            # proxy_set_header X-Forwarded-Proto https;
            proxy_set_header Host $http_host;
            # we don't want nginx trying to do something clever with
            # redirects, we set the Host: header above already.
            proxy_redirect off;
            proxy_pass http://web:8000;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

备份数据库到host主机

docker-compose exec db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --databases ${MYSQL_DATABASE}' > ./backup/database.sql

关于django web容器配置

Dockerfile

    FROM python:3

    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    WORKDIR /code
    ADD requirements.txt /tmp/
    RUN pip install -r /tmp/requirements.txt

启动脚本startup.sh

#!/usr/bin/env bash
python manage.py collectstatic --noinput &&
python manage.py migrate &&
gunicorn django_web_app.wsgi:application -w 2 -b :8000

当容器运行起来之后,可能需要导入一些初始数据或者fixtures,我写了一个init的django custom command,手动执行该command:

    docker-compose exec web python manage.py init

grep命令的基本用法

1. grep正则表达式(对文本行进行搜索过滤)

格式:grep [option] PATTERN [FILE...]
option:
        -i:忽略大小写
        -v:取反,显示未被匹配到的pattern
        -n:显示匹配的行号
        -c:统计匹配的行数
        -o: 只显示匹配到的pattern
        -q: 静默,不予显示
        -A#:after,匹配到的行再向后显示#行
        -B#:before,匹配到的行再向前显示#行
        -C#:context,向前向后各显示#行
        -E :等同于egrep(扩展的正则表达式)

2. 正则表达式元字符

字符匹配

.:任意单个字符
[]:匹配[]以内的任意单个字符
[^]:匹配[]以外的任意单个字符
[:digit:]:十进制数字
[:upper:]:大写字母
[:lower:]:小写字母
[:space:]:空格
[:alnum:]:字母及数字
[:alpha:]:大小写字母
eg:
[root@Centos6 ~]#grep r..t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@Centos6 ~]#grep r[a-z]t /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@Centos6 ~]#grep r[^0-9][a-z]t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

次数匹配

*:前面字符任意次
?:前面字符0或1次
.*:任意字符任意次
+:至少一次
{m,n}:大于m小于n次
*:前面字符任意次
[root@Centos6 ~]#grep ro*t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
?:前面字符0或1次
[root@Centos6 ~]#grep "ro?" /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
.*:任意字符任意次
[root@Centos6 ~]#grep ro.*t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
+:至少一次
[root@Centos6 ~]#grep "ro+" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
{m,n}:大于m小于n次
[root@Centos6 ~]#grep "ro{1,5}" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
chrony:x:992:989::/var/lib/chrony:/sbin/nologin
setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
rooooot:x:1001:1001::/home/rooooot:/bin/bash
rooot:x:1002:1002::/home/rooot:/bin/bash

位置锚定

对于行来说
^:行首锚定
$:行尾锚定
^$:空行
^ $:空格
对于词来说
,b:词尾锚定
[root@Centos6 ~]#grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@Centos6 ~]#grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
ymd:x:500:500:ymd:/home/ymd:/bin/bash
[root@Centos6 ~]#grep "" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
ymd:x:500:500:ymd:/home/ymd:/bin/bash

分组

():将一个或多个字符作为一个整体,进行处理。
后向引用:引用前面分组括号中所匹配到的内容
1,2 ···
eg:
grep "(string1+(string2)*)"
1:string1+(string2)*
2:string2

扩展的正则表达式(egrep)

egrep等同于grep -E 其选项及参数大致与grep相同

字符匹配

.:任意单个字符
[]:匹配[]以内的任意单个字符
[^]:匹配[]以外的任意单个字符

次数匹配

*:前面字符任意次
?:前面字符0或1次
.*:任意字符任意次
+:至少一次
{m,n}:大于m小于n次

3、利用所学知识如何在生产环境中实现对磁盘最大使用空间的监控

在实际的生产环境中我们需要实时的查看及监控磁盘空间情况防止因磁盘空间不足导致服务器崩溃
因此我们需要查看磁盘利用率是否超过限制值。

此为利用现在所学的命令完成查看磁盘已使用的空间情况
[root@Centos6 ~]#df -h |grep "^/dev/sda"|tr -s " " | cut -d " " -f5|sort -nr|head -n1
10%

rhel 7.x设置VSFTPD允许匿名登陆

工作环境中的Server经常没有外网环境,需要自己搭建YUM源。

利用web总觉得会白白浪费一台主机,又不想改变端口,所以就喜欢用Vsftpd。

之前一直在centos 6.x环境上面装vsftpd。在/etc/vsftpd/vsftpd.conf中设置

anon_root=/mnt/ios

然后重启就可以匿名访问该目录了。

现在在rhel 7.x环境中安装vsftpd,同样在/etc/vsftpd/vsftpd.conf中设置

anon_root=/mnt/ios

我擦,竟然还要我账号密码登陆,后来简单的搜索了一下,发现是权限的锅,当文件的用户改为ftp时,解决此问题

ok,又能愉快的下载了。