Ubuntu系统配置Nginx Node.js MongoDB环境

腾讯云最近上线了开发者实验室,主要的功能就是提供一台真实的 VPS,让你现场敲 Linux 命令来完成各种实验任务,比如现场搭建 Python 开发环境、基于 Ubuntu 搭建 WordPress 个人博客等等,所谓“让所有技术更容易入门”。

未分类

目前腾讯云这个服务是免费的,不过是限时免费。比如这篇文章讲的用 Ubuntu 搭建微信小程序服务,就是限制必须 3 个小时内完成实验。如果没完成又想保存学习进度的话,你就要花 65 元买下这个 VPS 才行,否则机器直接会被释放,并且过 24 小时后才能重新开始同样的实验。

未分类

咱看到这个服务就直接玩得不亦乐乎,一晚上直接把所有课程基本刷了一遍,给我的体验呢,感觉就像是程序员的密室逃脱游戏,非常有意思。当然了,既然是个“实验课”,它也会一步一步教你,所以并不是难。

这篇文章呢,算是自己做个 Mark。当然,也是给真正有需要搭建微信小程序服务的同学一点参考。本文的最终效果是成功部署 Node.js + Websocket 构建的网络版锤子剪刀布游戏。

对了,要去玩这个小程序实验的同学,最好有点 Linux 和 Node.js 基础,然后提前准备好一个域名和一个可用的域名 SSL 证书,因为小程序必须采用 HTTPS 访问,然后你还得再三个小时之内当场配置 HTTPS。

1、申请域名和 SSL 证书

(1)、域名服务商推荐 Godaddy / 阿里云 / Name.com,注册一个自己想要的域名。
(2)、由于小程序服务端必须使用 HTTPS 域名连接,所以关于 SSL 证书的申请请看这篇文章:http://devops.webres.wang/2017/07/nginx-config-ssl-force-301-https/

2、注册微信小程序账号

不管你曾经在微信公众平台注册过没有,反正就是要重新注册一个,因为服务号 / 公众号不能和小程序号互换,注册微信小程序账号:https://mp.weixin.qq.com/

3、设置微信公众平台

注册小程序账号进入后,点击设置->开发设置->服务器域名,把你自己注册的域名写入request合法域名和socket合法域名中,后面两个域名不用填。

这一步的原因是:如果在微信上运行的小程序想联网,必须采用这两个合法域名才可以连接,否则直接被微信阻止连接。

4、安装本地开发环境

(1)、开发微信小程序,首先得安装微信 web 开发者工具,下载:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
(2)、下载小程序源码:https://best66.me/wp-content/uploads/2017/07/lab-weapp-client-master.zip

重复一遍呀,这篇文章主要是介绍如何操作服务器并且从零开始搭建微信小程序服务,所以直接给小程序源码了。

5、配置本地开发环境

(1)、在微信 web 开发者工具添加项目,AppID 依旧在微信公众平台->设置->开发设置->开发者 ID 中。
(2)、项目名称随你
(3)、项目目录选择下载的 lab-weapp-client-master 中直接包含 app.js 的目录
(4)、在微信 web 开发者工具打开 app.js(这是一个全局配置文件),将 host 中的域名修改为你自己的域名

6、安装 Node.js

Node.js 是一个 JS 运行环境,通过它可以实现 JS 编写后端服务器。
(1)、连接你的 VPS
(2)、使用下面的命令安装 Node.js

sudo apt-get update  
sudo wget https://mc.qcloudimg.com/static/archive/262420521a966befe17dfa0070ddb272/node-v6.11.0.tar.gz
sudo tar xvf node-v6.11.0.tar.gz
cd node-v6.11.0
sudo ./configure # 自动配置编译
sudo make # 由于 apt-get 安装不到最新版,我们采用编译安装来安装 Node.js。这条命令会执行比较久。
sudo make install # 采用这条命令来编译安装,以便可以在任何地方使用 node 命令
sudo cp /usr/local/bin/node /usr/sbin/

(3)、安装完成后,使用下面的命令测试安装结果,会输出当前的 Node.js 版本:

node -v

7、上传后端源码并安装依赖组件

(1)、上传 data 文件夹到服务器根目录,点击下载。上传后,修改所有文件权限为 a+rw。
(2)、进入此工作目录

cd /data/release/webapp

(3)、在工作目录创建 package.json 文件,并修改文件的访问权限。

sudo touch package.json
sudo chmod a+r+w package.json

(4)、Node.js 的每个包应该有 package.json 描述文件,包含包名、包版本和依赖包等信息。我们修改 package.json 添加我们服务器包的名称和版本号,可参考下面的示例。vi 命令进入修改。

{
    "name": "webapp",
    "version": "1.0.0"
}

(5)、NPM 之于 Node,如同 homebrew 之于 OS X,apt-get 之于 Ubuntu。我们先安装 NPM 包管理工具。

sudo apt-get install npm

(6)、pm2 是一个带有负载均衡功能的 Node 应用的进程管理器,我们的应用最好是通过 pm2 来运行和管理,而不是使用原生的 Node 执行。使用下面的命令安装 pm2

sudo npm install -g pm2 # 全局安装 pm2 模块
# 如果安装时间太长,我们可以用淘宝的镜像来安装:
# sudo npm install -g pm2 --registry=https://registry.npm.taobao.org

我们顺便看看 pm2 支持的命令:

pm2 start app.js # 运行
pm2 logs # 查看工作日志
pm2 restart app #重启

(7)、我们的服务器源码里使用到了 Express 模块,这是一个 Node.js 的 MVC 框架。Express 的调用方法可以看看源码里的 app.js,它是应用的入口。下面的命令使用 NPM 来安装 Express。

cd /data/release/webapp
sudo npm install express --save # 这里一定要在工作目录执行这条命令,因为会自动更新 package.json 的依赖项

(8)、小程序不支持 Cookie 存储和跟踪,服务器需要自行实现会话层。这里我们的源码采用了 MongoDB 在后端存储会话数据、Node 的模块 connect-mongo 来连接数据库。配合腾讯在 Github 上发布的 Express 会话管理中间件 wafer-node-session 实现小程序会话(还支持 redis 等数据库,github)会话管理的相关源码依旧在 app.js 入口文件中,大家可以去研究。

使用 apt-get 在机器上安装 MongoDB 和客户端命令行工具:

sudo apt-get install mongodb-server mongodb -y 

安装结束后,可以使用下面的命令查看安装的版本:

sudo mongod --version
sudo mongo --version

安装 connect-mongo、wafer-node-session 模块:

cd /data/release/webapp
sudo npm install connect-mongo wafer-node-session --save

(9)、WebSocket 是新一代 Web 通讯技术,直接基于 80 端口和 443 端口。通过 WebSocket 我们可以实现玩家直接与服务器双向通信,不用重复进行握手,延时很低。这里我们需要 ws 模块实现 WebSocket。(源码中 websocket.js 用来和玩家直接双向通信,含有游戏入口。而 app.js 是整个 App 的入口,包含 websocket.js)

cd /data/release/webapp
sudo npm install --save ws

(10)、HumanPlayer.js 的源码中使用到了 co 模块进行协程管理,启动游戏服务前,需要先安装:

cd /data/release/webapp
sudo npm install co --save

8、配置 MongoDB

创建目录,用于 MongoDB 数据和日志存储:

sudo mkdir -p /data/mongodb
sudo mkdir -p /data/logs/mongodb

创建后,使用下面的命令来启动 MongoDB:

sudo mongod --fork --dbpath /data/mongodb --logpath /data/logs/mongodb/webapp.log

可以使用下面的命令来检查是否启动成功

netstat -ltp | grep 27017 # 注:27017 是 MongoDB 默认端口

登录本地 MongoDB 服务:

sudo mongo

登录后,创建一个用户 webapp:

use webapp;
db.addUser({ user: 'webapp', pwd: '你想要的密码', roles: ['dbAdmin', 'readWrite']});

创建完成后,使用 exit 退出命令行工具。

9、配置 config.js

config.js 是服务端应用配置文件,调用位置在 app.js 入口文件。config.js 可参考下面的修改。(注:请将 YORU_APP_ID 和 YOUR_APP_SECRET 替换为你申请的小程序对应的 AppID 和 AppSecret)

cd /data/release/webapp
vi config.js
module.exports = { 
    // 8765 是为了设置 Node.js 构建的 Web App 监听端口,使用 http://主机IP:8765/ 可以进行查看
    serverPort: '8765', 

    // 小程序 appId 和 appSecret 
    // 请到 https://mp.weixin.qq.com 获取 AppID 和 AppSecret
    appId: 'YORU_APP_ID', 
    appSecret: 'YOUR_APP_SECRET', 

    // mongodb 连接配置,生产环境请使用更复杂的用户名密码
    mongoHost: '127.0.0.1', 
    mongoPort: '27017', 
    // 27017 是 MongoDB 默认端口,我们没有修改
    mongoUser: 'webapp', 
    mongoPass: '替换为你刚刚设置的密码', 
    mongoDb: 'webapp'
};

10、安装配置 Nginx

微信小程序要求和服务器的通信都通过 HTTPS 进行,所以我们需要用 Nginx 实现 HTTPS,并反向代理到 Node 服务器来处理。

(1)、在 Ubuntu 上,可直接使用 apt-get 来安装 Nginx

sudo apt-get install nginx -y

(2)、安装完成后,使用 nginx 命令启动 Nginx:

sudo /etc/init.d/nginx start

现在我们可以通过 http://主机IP/ 来查看 Nginx 默认页面。

(3)、配置 HTTPS 反向代理

修改 /etc/nginx 目录的读写权限:

sudo chmod a+rw /etc/nginx

在 /etc/nginx/conf.d 目录创建 ssl.conf 文件:

cd /etc/nginx/conf.d
sudo touch ssl.conf
sudo chmod a+rw ssl.conf

将 ssl.conf 文件修改为如下内容(关于详细的 SSL 证书申请和配置请看这篇文章):

# 让 Nginx 代理支持 WebSocket 的配置
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
        listen 443;
        server_name www.example.com; # 改为绑定证书的域名

        # ssl 配置
        ssl on;
        ssl_certificate sshh.pem; # 改为自己申请得到的 crt 文件的名称
        ssl_certificate_key sshh.key; # 改为自己申请得到的 key 文件的名称
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        # WebSocket 配置
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # 反向代理
        location / {
            proxy_pass http://127.0.0.1:8765;
            # 8765 是刚刚通过 config.js 设置的通过 Node.js 构建的 Web App 的端口,可以使用 http://你的域名:8765/ 来查看,Nginx 代理以后,就可以直接使用 https://你的域名/ 来查看了
        }
    }

最后,我们运行入口文件:

pm2 start app.js

让 Nginx 重新加载配置使其生效:

sudo nginx -s reload

最终效果:

未分类

引用

大部分资料源于腾讯开发者实验室,我只是根据个人理解做了注释和顺序修改,所以,要感谢腾讯咯。

这篇文章花的时间很长,改动也非常多,如有错误,敬请指正!

CentOS 7 yum快速安装MongoDB

MongoDB是深受广大开源爱好者支持和研究的NoSQL数据库之一,它基于灵活的JSON文档方式,非常适合敏捷开发,其高可用功能强大,支持水平扩展等众多关键特性。一如其简约而不简单的MySQL一样,安装起来也非常方便,支持源码编译安装,rpm安装以及yum安装等众多方式。本文主要讲述在CentOS 7下yum方式快速安装mongodb。

一、安装环境及配置yum

    # more /etc/redhat-release 
    CentOS Linux release 7.2.1511 (Core)

    # vi /etc/yum.repos.d/mongodb-org-3.2.repo 
    [mongodb-org-3.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

二、安装MongoDB

    # yum -y install mongodb-org     
    Loaded plugins: fastestmirror, langpacks                     
    base                                                              | 3.6 kB  00:00:00     
    epel/x86_64/metalink                                              | 5.2 kB  00:00:00     
    extras                                                            | 3.4 kB  00:00:00     
    mongodb-org-3.2                                                   | 2.5 kB  00:00:00     
    updates                                                           | 3.4 kB  00:00:00     
    mongodb-org-3.2/7/primary_db                                      |  50 kB  00:00:03     
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * epel: mirrors.tuna.tsinghua.edu.cn
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    Resolving Dependencies
    --> Running transaction check
    ---> Package mongodb-org.x86_64 0:3.2.10-1.el7 will be installed
    --> Processing Dependency: mongodb-org-tools = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-shell = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-server = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-mongos = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Running transaction check
    ---> Package mongodb-org-mongos.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-server.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-shell.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-tools.x86_64 0:3.2.10-1.el7 will be installed
    --> Finished Dependency Resolution

    Dependencies Resolved

    ===================================================================================================
     Package                                      Arch     Version             Repository         Size
    ===================================================================================================
    Installing:
     mongodb-org                                  x86_64   3.2.10-1.el7        mongodb-org-3.2   5.8 k
    Installing for dependencies:
     mongodb-org-mongos                           x86_64   3.2.10-1.el7        mongodb-org-3.2   5.6 M
     mongodb-org-server                           x86_64   3.2.10-1.el7        mongodb-org-3.2    12 M
     mongodb-org-shell                            x86_64   3.2.10-1.el7        mongodb-org-3.2   6.7 M
     mongodb-org-tools                            x86_64   3.2.10-1.el7        mongodb-org-3.2    41 M

    Transaction Summary
    ===================================================================================================
    Install  1 Package (+4 Dependent packages)

    Total download size: 65 M
    Installed size: 201 M
    Downloading packages:
    warning: /var/cache/yum/x86_64/7/mongodb-org-3.2/packages/mongodb-org-3.2.10-1.el7.x86_64.rpm: 
            Header V3 RSA/SHA1 Signature, key ID ea312927: NOKEY  ]  
    Public key for mongodb-org-3.2.10-1.el7.x86_64.rpm is not installed
    (1/5): mongodb-org-3.2.10-1.el7.x86_64.rpm                                  | 5.8 kB  00:00:04     
    (2/5): mongodb-org-server-3.2.10-1.el7.x86_64.rpm                           |  12 MB  00:00:11     
    (3/5): mongodb-org-shell-3.2.10-1.el7.x86_64.rpm                            | 6.7 MB  00:00:06     
    (4/5): mongodb-org-tools-3.2.10-1.el7.x86_64.rpm                            |  41 MB  00:00:36     
    (5/5): mongodb-org-mongos-3.2.10-1.el7.x86_64.rpm                           | 5.6 MB  00:03:28     
    ---------------------------------------------------------------------------------------------------
    Total                                                              322 kB/s |  65 MB  00:03:28     
    Retrieving key from https://www.mongodb.org/static/pgp/server-3.2.asc
    Importing GPG key 0xEA312927:
     Userid     : "MongoDB 3.2 Release Signing Key <[email protected]>"
     Fingerprint: 42f3 e95a 2c4f 0827 9c49 60ad d68f a50f ea31 2927
     From       : https://www.mongodb.org/static/pgp/server-3.2.asc
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : mongodb-org-tools-3.2.10-1.el7.x86_64                                    1/5 
      Installing : mongodb-org-mongos-3.2.10-1.el7.x86_64                                   2/5 
      Installing : mongodb-org-shell-3.2.10-1.el7.x86_64                                    3/5 
      Installing : mongodb-org-server-3.2.10-1.el7.x86_64                                   4/5 
      Installing : mongodb-org-3.2.10-1.el7.x86_64                                          5/5 
      Verifying  : mongodb-org-server-3.2.10-1.el7.x86_64                                   1/5 
      Verifying  : mongodb-org-3.2.10-1.el7.x86_64                                          2/5 
      Verifying  : mongodb-org-shell-3.2.10-1.el7.x86_64                                    3/5 
      Verifying  : mongodb-org-mongos-3.2.10-1.el7.x86_64                                   4/5 
      Verifying  : mongodb-org-tools-3.2.10-1.el7.x86_64                                    5/5 

    Installed:
      mongodb-org.x86_64 0:3.2.10-1.el7                                                                                                                                                                           

    Dependency Installed:
      mongodb-org-mongos.x86_64 0:3.2.10-1.el7      #Author : Leshami      
      mongodb-org-server.x86_64 0:3.2.10-1.el7      #Blog   : http://blog.csdn.net/leshami
      mongodb-org-shell.x86_64 0:3.2.10-1.el7           
      mongodb-org-tools.x86_64 0:3.2.10-1.el7          

    Complete!

三、验证安装结果

    # rpm -qa |grep mongodb
    mongodb-org-3.2.10-1.el7.x86_64
    mongodb-org-mongos-3.2.10-1.el7.x86_64
    mongodb-org-shell-3.2.10-1.el7.x86_64
    mongodb-org-server-3.2.10-1.el7.x86_64
    mongodb-org-tools-3.2.10-1.el7.x86_64

    # rpm -ql mongodb-org-server
    /etc/init.d/mongod
    /etc/mongod.conf
    /etc/sysconfig/mongod
    /usr/bin/mongod
    /usr/share/doc/mongodb-org-server-3.2.10
    /usr/share/doc/mongodb-org-server-3.2.10/GNU-AGPL-3.0
    /usr/share/doc/mongodb-org-server-3.2.10/MPL-2
    /usr/share/doc/mongodb-org-server-3.2.10/README
    /usr/share/doc/mongodb-org-server-3.2.10/THIRD-PARTY-NOTICES
    /usr/share/man/man1/mongod.1
    /var/lib/mongo
    /var/log/mongodb
    /var/log/mongodb/mongod.log
    /var/run/mongodb

    [root@localhost ~]# /etc/init.d/mongod start
    Starting mongod (via systemctl):                           [  OK  ]
    [root@localhost ~]# netstat -nltp|grep mongo
    tcp        0      0 127.0.0.1:27017      0.0.0.0:*   LISTEN      89958/mongod

    # mongo
    MongoDB shell version: 3.2.10
    connecting to: test
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
            http://docs.mongodb.org/
    Questions? Try the support group
            http://groups.google.com/group/mongodb-user
    &gt; db.version()
    3.2.10

未分类

CentOS 7配置并更换为本地或网络yum源

一、目的

为了在没网的情况下或体验更快的速度及更好的体验。毕竟自带yum源在国外。(本例用的是阿里yum源,其他的也可以)

二、yum机制简介

引用百度百科及一些个人见解

Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

yum的关键之处是要有可靠的repository,顾名思义,这是软件的仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的header,header包括了rpm包的各种信息,包括描述,功能,提供的文件,依赖性等.正是收集了这些 header并加以分析,才能自动化地完成余下的任务。

三、搭建本地源(利用ISO镜像)

1、拷贝iso镜像文件解压指/media/cdrom文件夹

shou cp -r /xxxx/CentOSxxx/* /media/cdrom

2、配置/etc/yum.repos.d/CentOS-Media.repo

    [c6-media]
    name=CentOS-$releasever - Media
    baseurl=file:///media/CentOS/   #镜像文件路径
            file:///media/cdrom/
            file:///media/cdrecorder/
    gpgcheck=1    #标志开启key验证,开启必须要有gpgkey文件,也可以选择关闭
    enabled=1       #标志开启此yum源
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

3、重命名默认的网络源CentOS-Base.repo,避免冲突。

$ sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

4、重置yum

$ yum clean all   #清理yum缓存
$ yum list    #显示yum列表

三、更换网络源

1、备份系统自带yum源

$ sudo mv /etv/yum.repos.d/CentOS-Base.repo /etv/yum.repos.d/CentOS-Base.repo.bk

目的:其他yum源(这里是阿里yum源)出错时,可以恢复系统自带yum源

2、下载阿里yum源到/etc/yum.repos.d

  • 切换路径 $ cd /etc/yum.repos.d
  • 下载 $ sudo wget -nc http://mirrors.aliyun.com/repo/Centos-7.repo

备注:

  • 阿里yum源:http://mirrors.aliyun.com/repo/
  • 163(网易)yum源: http://mirrors.163.com/.help/
  • 中科大的Linux安装镜像源:http://centos.ustc.edu.cn/
  • 搜狐的Linux安装镜像源:http://mirrors.sohu.com/
  • 北京首都在线科技:http://mirrors.yun-idc.com/

3、更改阿里yum源为系统默认yum源

$ sudo mv CentOS-7.repo CentOS-Base.repo

4、清除yum机制的本地缓存

$ sudo yum clean all   #一股脑全部清除
$ sudo yum  list

目的:避免更换源后出现HTTP ERORR 404-Not Found Trying othermirror的bao报错

5、生成yum机制的本地缓存

$ sudo yum makecache

yum makecache目的:将服务器上的软件包信息在本地缓存,以提高搜索安装软件的速度。

Vi/Vim全局替换基本语法

在vim编辑中,编辑器使用指定的字符模式对文件中的每行进行检查,使用新字符串来替换模式。
全局替换使用命令 :g(global全局)和:s(switch替换)。

单个字符替换:

:s/old/new/

未分类

这将把光标所在行old的第一次出现修改为new。

/(斜杠)是该条命令不同部分之间的分隔符(当斜杆为该行的最后一个字符时,可不写)

单个字符多个替换:

:s/old/new/g

未分类

把当前行old的每次出现改为new,而不只是该行的第一个old。

:s命令允许替换串后面带有选项,上面语法中的g代表全局(g选项影响一行中的每个模式,不要把它与影响文件中所有行的:g命令混淆)

通过在:s命令前加上地址前缀,可以把它的范围扩展到多行。例如下面命令把50行到100行的old的每次出现都改为new:

:50,100 s/old/new/g 

下面的命令把整个文件中的old的每次出现都改为new:

:1,$ s/old/new/g

确认替换:

使用搜索替换命令有时候会出错,而得到不想要的结果。在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:

:1,30 s/old/new/gc

未分类

将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)?
y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,^E和^Y是提示你用Ctrl+e或Ctrl+y来滚动屏幕的。

上下文相关替换:

除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,我们把这种替换叫做上下文相关替换。

语法格式:

:g/pattern/s/old/new/g

未分类

将会把包含pattern的行中,把所有old替换为new

第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。在那些包含模式pattern的行上,将把old替换(s)为new,最后的g表示在该行上进行全部替换。

如果用来进行搜索的模式与想要修改的模式相同,就不必重复:

:g/string/s//new/g 等价于 :g/string/s/string/new/g

注意:

:g/string/s//new/g 也等价于 :% s/string/new/g

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 &gt;&gt;
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 =&gt; {
 "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` &gt; /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 =&gt; {
 "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 &gt;&gt;

拷贝文件

[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 =&gt; {
 "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 =&gt; {
 "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 =&gt; {
 "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 =&gt; {
 "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界面了

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%