Ubuntu下RabbitMQ的安装与配置

最近在研究RabbitMQ,本文简单记录了如何搭建与配置一个RabbitMQ服务器。

安装RabbitMQ

rabbitmq-server是可以在Ubuntu系统与Debian系统中使用的RabbitMQ服务器。在Ubuntu标准的repositories中,其实包含了rabbitmq-server,但是标准仓库中的版本往往非常的老旧,直接安装的话会得到的可能不是你想要的版本,所以想安装新版本,我们需要一些额外的工作。这里主要介绍了Ubuntu下通过apt-get的方法安装最新版本,如果想了解更多的安装方法,可以看这里

安装前提

由于RabbitMQ需要基于Erlang/OTP,所以在安装RabbitMQ之前需要先安装Erlang/OTP。同样的,在Ubuntu标准的repositories中,Erlang/OTP的版本很老,推荐不要直接安装在Ubuntu标准的repositories中Erlang/OTP,而是安装新版本。

安装Erlang

添加地址

首先执行下面两个命令,添加Erlang自己的仓库地址到你本地。

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

或者你可以手动添加仓库地址至本地。 添加下面代码至你本地/etc/apt/sources.list中,注意把下面的{distribution}(包括大括号)替换成你自己系统的distribution。

deb https://packages.erlang-solutions.com/ubuntu {distribution} contrib

如果不知道自己系统的distribution是什么,可以输入lsb_release -c查看,我自己的系统是Ubuntu16.04,对应的distribution是xenial,所以我添加进/etc/apt/sources.list的命令是

deb https://packages.erlang-solutions.com/ubuntu xenial contrib

下一步用下面的命令来添加Erlang公钥

wget https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
sudo apt-key add erlang_solutions.asc

开始安装Erlang

用下面的命令刷新本地apt-get仓库的缓存,然后安装Erlang。

sudo apt-get update
sudo apt-get install erlang

至此,Erlang安装完毕,如果想了解更多Erlang/OTP的安装方法,可以看这里

安装rabbitmq-server

添加rabbitmq仓库地址

同样的下面的像上文所说的一样将下面的{distribution}(包括大括号)替换成你自己系统的distribution。

echo "deb https://dl.bintray.com/rabbitmq/debian {distribution} main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list

添加rabbitmq仓库公钥

wget -O- https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc | sudo apt-key add -

用下面的命令刷新本地apt-get仓库的缓存,然后安装rabbitmq-server。

sudo apt-get update
sudo apt-get install rabbitmq-server

至此rabbitmq-server安装完毕。

运行与配置RabbitMQ

运行RabbitMQ

在RabbitMQ安装包安装完后,服务器默认是会在后台通过一个没有特权的用户rabbitmq来运行的,想要手动启动或者停止重启服务器,只需要像系统中别的启动命令一样就可以了

service rabbitmq-server start

常用端口

以下是官网上常用端口的介绍:

  • 4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
    5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS

  • 25672: used for inter-node and CLI tools communication (Erlang distribution server port) and is allocated from a dynamic range (limited to a single port by default, computed as AMQP port + 20000). See networking guide for details.

  • 35672-35682: used by CLI tools (Erlang distribution client ports) for communication with nodes and is allocated from a dynamic range (computed as Erlang dist port + 10000 through dist port + 10010). See networking guide for details.

  • 15672: HTTP API clients and rabbitmqadmin (only if the management plugin is enabled)

  • 61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)

  • 1883, 8883: (MQTT clients without and with TLS, if the MQTT plugin is enabled

  • 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)

  • 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)

其中5672, 5671为消息队列常用的端口,15672为网页可视化管理所用的端口。

开启网页可视化管理

开启网页可视化管理很简单,首先需要开启RabbitMQ可视化管理插件,通过如下命令开启

“`
rabbitmq-plugins enable rabbitmq_management
““

然后访问http://server-name:15672/可以进入管理页面,默认账号密码都为guest,里面可以管理像创建用户,维护队列之类的功能,非常好用。 详细信息可以看https://www.rabbitmq.com/management.html

CentOS 6.9/7通过yum安装指定版本的Nginx

说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql nginx可以知道全部文件的地方等等。

Nginx(1.12.2)

一、安装和配置

1、安装

# rpm -ivh http://nginx.org/packages/centos/6/x86_64/RPMS/nginx-1.12.2-1.el6.ngx.x86_64.rpm

备注:其实根据上面这个网址(http://nginx.org/packages/)可以进去其nginx官方的的包管理列表,选择合适的系统和包

2、启动

# nginx
// 验证是否启动成功
# curl http://127.0.0.1:80
// 正常会返回html代码

3、设置开机启动服务

# chkconfig nginx on

4、服务常用操作

// 服务状态
# service nginx status
// 服务启动
# service nginx start
// 服务停止
# service nginx stop
// 服务重启
# service nginx restart

CentOS 7:

1、安装

# rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.12.2-1.el7_4.ngx.x86_64.rpm

2、启动

# systemctl start nginx
// 验证是否启动成功
# curl http://127.0.0.1:80
// 正常会返回html代码

3、设置开机启动服务

# systemctl enable nginx

4、服务常用操作

// 服务状态
# systemctl status nginx
// 服务启动
# systemctl start nginx
// 服务停止
# systemctl stop nginx
// 服务重启
# systemctl restart nginx

CentOS 7.x安装搭建Zabbix3.0环境

1、安装数据库mariadb

[root@node1 ~]# yum install -y mariadb mariadb-server
[root@node1 ~]# systemctl start mariadb
[root@node1 ~]# systemctl enable mariadb
[root@node1 ~]# vi /etc/my.cnf
[root@node1 ~]# cat /etc/my.cnf
[mysqld]
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[root@node1 ~]#

2、下载(Choose your platform for Zabbix server)

https://www.zabbix.com/

未分类

未分类

未分类

3、Install and configure Zabbix server

(1)Install Repository with MySQL database

[root@node1 ~]# rpm -i http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.IcrMTU: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY

(2)Install Zabbix server, frontend, agent

[root@node1 ~]# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent
...
Installed:
  zabbix-agent.x86_64 0:3.0.16-1.el7          zabbix-server-mysql.x86_64 0:3.0.16-1.el7          zabbix-web-mysql.noarch 0:3.0.16-1.el7         

Dependency Installed:
  OpenIPMI-libs.x86_64 0:2.0.19-15.el7         OpenIPMI-modalias.x86_64 0:2.0.19-15.el7        apr.x86_64 0:1.4.8-3.el7_4.1                     
  apr-util.x86_64 0:1.5.2-6.el7                dejavu-fonts-common.noarch 0:2.33-6.el7         dejavu-sans-fonts.noarch 0:2.33-6.el7            
  fping.x86_64 0:3.10-4.el7                    httpd.x86_64 0:2.4.6-67.el7.centos.6            httpd-tools.x86_64 0:2.4.6-67.el7.centos.6       
  iksemel.x86_64 0:1.4-6.el7                   libXpm.x86_64 0:3.5.12-1.el7                    libtool-ltdl.x86_64 0:2.4.2-22.el7_3             
  libxslt.x86_64 0:1.1.28-5.el7                libzip.x86_64 0:0.10.1-8.el7                    mailcap.noarch 0:2.1.41-2.el7                    
  mariadb-libs.x86_64 1:5.5.56-2.el7           net-snmp-libs.x86_64 1:5.7.2-28.el7_4.1         php.x86_64 0:5.4.16-43.el7_4.1                   
  php-bcmath.x86_64 0:5.4.16-43.el7_4.1        php-cli.x86_64 0:5.4.16-43.el7_4.1              php-common.x86_64 0:5.4.16-43.el7_4.1            
  php-gd.x86_64 0:5.4.16-43.el7_4.1            php-ldap.x86_64 0:5.4.16-43.el7_4.1             php-mbstring.x86_64 0:5.4.16-43.el7_4.1          
  php-mysql.x86_64 0:5.4.16-43.el7_4.1         php-pdo.x86_64 0:5.4.16-43.el7_4.1              php-xml.x86_64 0:5.4.16-43.el7_4.1               
  t1lib.x86_64 0:5.1.2-14.el7                  unixODBC.x86_64 0:2.3.1-11.el7                  zabbix-web.noarch 0:3.0.16-1.el7                 

Complete!
[root@node1 ~]#

(3)Create initial database

[root@node1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit
Bye
[root@node1 ~]# 

Import initial schema and data. You will be prompted to enter your newly created password.

[root@node1 ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Enter password: 
[root@node1 ~]# mysql -uzabbix -pzabbix
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 6
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| zabbix             |
+--------------------+
2 rows in set (0.01 sec)

MariaDB [(none)]> use zabbix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [zabbix]> 

(4)Configure the database for Zabbix server

[root@node1 ~]# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

(5)Configure PHP for Zabbix frontend

[root@node1 ~]# vi /etc/php.ini
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
date.timezone = Asia/Shanghai

(6)Start Zabbix server and agent processes

[root@node1 ~]# systemctl restart zabbix-server zabbix-agent httpd
[root@node1 ~]# systemctl enable zabbix-server zabbix-agent httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@node1 ~]# 

4、Configure Zabbix frontend

未分类

https://www.zabbix.com/documentation/3.0/manual/installation/install#installing_frontend

http://node1/zabbix/

未分类

未分类

未分类

未分类

未分类

未分类

未分类

未分类

临时解决 LDAP 导致 GitLab Members Blocked 问题

类似 GitLab 上 Members Blocked 状态如下图所示,(当然由于用户离职或者其他原因账户注销导致的 Blocked 不在本次谈论范围内)

未分类

这里要提一下背景,公司 GitLab 系统是统一使用 LDAP 邮箱认证,中间有一次邮箱的后缀归属更改,比如用户 zhangsan1 原账户邮箱为 [email protected],更改后账户邮箱为 [email protected],切换后,两个邮箱后缀的用户都可以正常使用 LDAP 认证,这就导致了上边问题的出现。zhangsan1 账户已经使用过 GitLab,其信息已经存储在 GitLab 数据库中,登录 Gitlab 时 LDAP 也是可以认证成功的,切换后,新的邮箱账户 [email protected] 登录以后, GitLab 又存储了一次该账户信息,但是不知道为什么新账户信息中用户名称变成了 zhangsan11 (莫非是 GitLab 查询数据库已存在 zhangsan1 账户,就会自动尾数追加 1 么?有待考证!),这就导致了与本地 git 账户不统一而 Clone 不了代码问题的出现。

好了,既然大概知道了原因,那么接下来就需要想办法解决掉这个问题。我们知道,GitLab 使用 PostgreSQL 数据库存储用户等相关数据,那么在不删除账户信息的原则上,尝试以下临时解决方案:

修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,然后登录 GitLab 在个人设置页更新 username,将 zhangsan11 修改为 zhangsan1,看是否可行。
修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,同时强制修改 zhangsan11( [email protected]) 用户名为 zhangsan1。
接下来,我们来验证一下方案一,是否可行。首先,登录 GitLab 所在服务器,查看 GitLab 服务(这里我是使用 Docker 启动的 GitLab 服务),并进入到容器内部。

# 查看 gitlab docker 容器服务
$ docker ps
CONTAINER ID        IMAGE                                                COMMAND             CREATED             STATUS                 PORTS                                                 NAMES
0a06dfd99823        <Domain_Name>/gitlab_ce/gitlab-ce:10.6.0-ce.0        "/assets/wrapper"   5 weeks ago         Up 5 weeks (healthy)   443/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   omnibus_gitlab

# 进入 gitlab 容器
$ docker exec -it 0a06dfd99823 /bin/bash
root@git:/#

接下来,查看一下 GitLab 数据库 PostgreSQL 的配置文件,看下相关的配置信息,一般来说,GitLab 服务会专门创建一个系统用户来管理该数据库服务。

# 查看 postgresql database 配置文件
root@git:/# cat /var/opt/gitlab/gitlab-rails/etc/database.yml
# This file is managed by gitlab-ctl. Manual changes will be
# erased! To change the contents below, edit /etc/gitlab/gitlab.rb
# and run `sudo gitlab-ctl reconfigure`.

production:
  adapter: postgresql
  encoding: unicode
  collation:
  database: gitlabhq_production        # 数据库名称
  pool: 10                             # 池子数
  username: "gitlab"                   # 用户名
  password:
  host: "/var/opt/gitlab/postgresql"   # 主机地址
  port: 5432                           # 端口号
  socket:
  sslmode:
  sslrootcert:
  sslca:
  load_balancing: {"hosts":[]}
  prepared_statements: false
  statements_limit: 1000
  fdw:

我们可以看到 username: “gitlab,那么查看下容器内当前系统有哪些跟 gitlab 相关的用户。

# 查看 /etc/passwd 文件里边 gitlab 对应的系统用户
root@git:/# cat /etc/passwd | grep 'gitlab-'
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh

可以看到 gitlab-psql 账户就是我们要使用的用户,接下来就切换到该用户,并连接到 gitlabhq_production 数据库。

# 切换到 gitlab-psql 用户登录
root@git:/# su - gitlab-psql

# 连接到 gitlabhq_production 库
$ psql -h /var/opt/gitlab/postgresql -d gitlabhq_production
psql (9.6.8)
Type "help" for help.

# 查看命令行帮助命令
gitlabhq_production=# h
Available help:
  ABORT                            COMMENT                          DECLARE                          EXECUTE
  ALTER AGGREGATE                  COMMIT                           DELETE                           EXPLAIN
  ALTER COLLATION                  COMMIT PREPARED                  DISCARD                          FETCH
  ALTER CONVERSION                 COPY                             DO                               GRANT
  ALTER DATABASE                   CREATE ACCESS METHOD             DROP ACCESS METHOD               IMPORT FOREIGN SCHEMA
  ALTER DEFAULT PRIVILEGES         CREATE AGGREGATE                 DROP AGGREGATE                   INSERT
  ......

# l 列举所有的数据库列表,相当于 mysql 的 show databases
# 因为连接时指定了 -d gitlabhq_production,默认进去的就是 gitlabhq_production 数据库,不需要切换。
gitlabhq_production=# l
                                         List of databases
        Name         |    Owner    | Encoding | Collate |  Ctype  |        Access privileges
---------------------+-------------+----------+---------+---------+---------------------------------
 gitlabhq_production | gitlab      | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres            | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 |
 template0           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | =c/"gitlab-psql"               +
                     |             |          |         |         | "gitlab-psql"=CTc/"gitlab-psql"
 template1           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | "gitlab-psql"=CTc/"gitlab-psql"+
                     |             |          |         |         | =c/"gitlab-psql"
(4 rows)

# 列举当前数据库所有表,相当于 mysql 的 show tables
gitlabhq_production=# dt
                         List of relations
 Schema |                   Name                   | Type  | Owner
--------+------------------------------------------+-------+--------
 public | abuse_reports                            | table | gitlab
 public | appearances                              | table | gitlab
 public | application_settings                     | table | gitlab
 public | audit_events                             | table | gitlab
 public | award_emoji                              | table | gitlab
 public | badges                                   | table | gitlab
 public | boards                                   | table | gitlab
 ......

# 查看单表结构,相当于 desc tblname, show columns from tbname
gitlabhq_production=# d users
                                                      Table "public.users"
                    Column                    |            Type             |                     Modifiers
----------------------------------------------+-----------------------------+----------------------------------------------------
 id                                           | integer                     | not null default nextval('users_id_seq'::regclass)
 email                                        | character varying(510)      | not null default ''::character varying
 encrypted_password                           | character varying(510)      | not null default ''::character varying
 reset_password_token                         | character varying(510)      | default NULL::character varying
 reset_password_sent_at                       | timestamp with time zone    |
 remember_created_at                          | timestamp with time zone    |
 sign_in_count                                | integer                     | default 0
 current_sign_in_at                           | timestamp with time zone    |
 last_sign_in_at                              | timestamp with time zone    |
 current_sign_in_ip                           | character varying(510)      | default NULL::character varying
 last_sign_in_ip                              | character varying(510)      | default NULL::character varying
 created_at                                   | timestamp with time zone    |
 updated_at                                   | timestamp with time zone    |
 name                                         | character varying(510)      | default NULL::character varying
 admin                                        | boolean                     | not null default false
 ......

# 退出 psql
gitlabhq_production-# q

这里详细的 PostgreSQL 操作命令就不在描述了,具体可以参考 PostgreSQL Docs 官网文档说明。这里着重看下 users 表,这里面存储的就是所有的用户信息,接下来,我们可以查看验证一下 zhangsan1 和 zhangsan11 用户信息。

# users 表查看用户信息
gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan1';
 id |          email       |   name   | username
----+----------------------+----------+----------
 92 | [email protected] | 张三 | zhangsan1
(1 row)

gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan11';
  id  |          email        |   name   | username
------+-----------------------+----------+----------
 2877 | [email protected] | 张三 | zhangsan11
(1 row)

果然如我们所料,存在两个账户,接下来修改 zhangsan1 用户名为 zhangsan1222。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1222' WHERE id = 92;
(1 row)

修改完毕后,登录 GitLab 点击 “Setting” —> “User Settings” —> “Account” —> “Change username” —> Path 输入框修改用户名为 zhangsan1 —> 点击 “Update username” 执行更新操作。

未分类

不过很遗憾,修改失败,提示消息为 Username change failed – Username has already been taken,修改的用户名已存在。。。 上边我们不是已经在数据库将 zhangsan1 改成了 zhangsan1222 了吗?

未分类

初步怀疑可能是 GitLab 缓存时效性问题,不知重启是否可以解决 (有待考证)。不过线上 GitLab 正在运行,暂时还没法立刻重启,怕影响用户使用,那就只能尝试方案二啦,强制将 zhangsan11 用户名修改为 zhangsan1。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1' WHERE id = 2877;
(1 row)

修改完毕,用户退出并重新登录 GitLab,就会发现账户名称已经修改过来啦,本地 Clone 也是没有问题的,当然以上只是简单的临时处理下,直接去线上服务器修改数据库数据,该方式比较暴力,不太友好,建议大家如果修改 GitLab 数据库,可以提前备份数据库,然后在 database 配置中开启客户端连接 IP,用本地客户端工具连接,那样比较直观方便。

手把手教你CentOS 7.x下安装网络流量实时监控工具iftop的两种方法

在类Unix系统中可以使用top查看系统资源,进程,内存占用等信息,查看网络状态可以使用netstat、nmap等工具,若要查看实时的网络流量,监控TCP/IP连接,反向解析IP,显示端口信息等,则可以使用iftop,关于centos上安装iftop有两种方法,一种是直接yum安装,一种是自己编译安装,下面我们一起来看下吧!

yum方式安装比较简单,直接以下命令即可:

yum -y install iftop

一般情况下这样就可以安装好了,但是有的小伙伴会遇到以下问题:

# yum install iftop //用命令直接安装

Loaded plugins: fastestmirror  

Loading mirror speeds from cached hostfile

 * base: mirrors.skyshe.cn  

 * extras: centos.ustc.edu.cn  

 * updates: mirrors.skyshe.cn  

Setting up Install Process  

No package iftop available. //没有可用的安装包  

Error: Nothing to do //什么都没干  

出现这种情况,我们就需要自己下载iftop,然后解压,配置,编译安装了,

我们先去iftop的官网上下载,官网链接:http://www.ex-parrot.com/pdw/iftop/download/,选择最新版本(当前最新版iftop-1.0pre4.tar.gz),

开始之前,我们先安装iftop所需的依赖软件,

# yum install -y flex byacc libpcap ncurses-devel libpcap-devel //先要安装必需的软件  

接下来就可以创建目录并下载、配置、编译安装了,

# mkdir iftop  

# cd iftop/ 

# wget http://www.ex-parrot.com/pdw/iftop/download/iftop-1.0pre4.tar.gz //下载

# tar zxvf iftop-1.0pre4.tar.gz //解压

# cd iftop-1.0pre4  

# ./configure //配置  

# make && make install //编译安装  

OK,安装完成,关于iftop的使用命令,大家自行百度、谷歌一下,一搜一大把,下面以一个示例来简单说明下:

iftop -i netcard -B -n

netcard是网卡名称,可以通过ifconfig命令查看得到,- i netcard是指定网卡,-B是以byte显示网速,默认是以bit显示的,-n是直接显示IP而不是显示主机名。

CENTOS 7上PHP-FPM无法启动的问题处理

缘由:

现在自用的Linux主机系统我都是选的CentOS 7,用的PHP版本也升级到了PHP 7。在之前的主机、博客维护过程中已经出过不少问题,这次又碰到了一个问题——在主机因维护而重启后php-fpm没有正确启动导致博客无法正常访问,解决办法和之前的不太一样,所以在此记录一下,方便以后查阅、参考。

正文:

参考解答:

0、一些辅助命令

# ls -lt /etc/systemd/system/multi-user.target.wants/

# find / -type f -iname "php-fpm.conf" | xargs ls -lt
# grep -v '^;' /etc/opt/remi/php71/php-fpm.d/www.conf | grep 'listen'

# nginx -t
# grep "fastcgi_pass" /etc/nginx/nginx.conf

1、systemd的系统启动项

应该是从CentOS 7开始,Linux服务管理器开始用systemd来替换之前的SysVinit,很多命令和之前不太一样,具体的可以参考之前记录的一篇文章「Linux的systemd相关知识学习」,这里只提一点:

# systemd里面的.service文件一般是放在下面这个目录下,当不记得服务名称了,可以去目录里看看
# ls -lt /usr/lib/systemd/system/
# cat /usr/lib/systemd/system/php71-php-fpm.service

&

# 查看当前系统上现在有哪些开机启动项,如果不在的话使用enable进行添加
# ls -lt /etc/systemd/system/multi-user.target.wants/
# systemctl enable nginx
# systemctl enable php71-php-fpm
# systemctl enable mysqld

2、php-fpm启动失败的原因

● php71-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php71-php-fpm.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2018-05-05 10:38:32 CST; 36s ago
  Process: 5500 ExecStart=/opt/remi/php71/root/usr/sbin/php-fpm --nodaemonize (code=exited, status=78)
 Main PID: 5500 (code=exited, status=78)

May 05 10:38:32 ixyzero-centos systemd[1]: Starting The PHP FastCGI Process Manager...
May 05 10:38:32 ixyzero-centos php-fpm[5500]: [02-May-2018 10:38:32] ERROR: unable to bind listening socket for address '/var/run/php-fpm/php-fpm.sock': No such file or directory (2)
May 05 10:38:32 ixyzero-centos php-fpm[5500]: [02-May-2018 10:38:32] ERROR: FPM initialization failed
May 05 10:38:32 ixyzero-centos systemd[1]: php71-php-fpm.service: main process exited, code=exited, status=78/n/a
May 05 10:38:32 ixyzero-centos systemd[1]: Failed to start The PHP FastCGI Process Manager.
May 05 10:38:32 ixyzero-centos systemd[1]: Unit php71-php-fpm.service entered failed state.
May 05 10:38:32 ixyzero-centos systemd[1]: php71-php-fpm.service failed.

即,没有 /var/run/php-fpm/php-fpm.sock 这个文件,导致无法绑定监听端口/文件,初始化失败。

之前出现这种问题,一般是以下原因之一:

  • php-fpm的配置文件里的listen.owner/group和Nginx配置文件里的user/group不匹配,导致权限不够;
  • php-fpm的配置文件里的listen和Nginx配置文件里的fastcgi_pass不匹配,导致监听和读取的不是同一个socket文件;

3、临时解决办法

但这次不是,这次的上面2个配置都是对的,但就是 /var/run/php-fpm/php-fpm.sock 这个文件不存在,解决办法也很简单,就是:

# sudo mkdir -p /var/run/php-fpm/
# sudo touch /var/run/php-fpm/php-fpm.sock

# sudo systemctl start php71-php-fpm

不过,一旦机器重启,/var/run/php-fpm/php-fpm.sock 这个文件就又没了,而且 /var/run/php-fpm/ 这个目录也没了,所以,这种手工创建目录、文件的方式只能临时生效。

4、长期解决办法

如果想要找到一个长期有效的办法,那就需要定位问题以及其背后的原因,否则问题还是会一直存在。

# 看 /var/run/ 目录权限
[zero@ixyzero-centos ~]$ ls -lt /var/ | grep "run"
lrwxrwxrwx.  1 root root   11 2月   3 2017 lock -> ../run/lock
lrwxrwxrwx.  1 root root    6 2月   3 2017 run -> ../run
[zero@ixyzero-centos ~]$
[zero@ixyzero-centos ~]$ ls -lt / | grep "run"
drwxr-xr-x  22 root root   620 5月   2 16:30 run

# 从上面的信息可以看出, /var/run 这个目录只有root才有「写」权限,而php-fpm的执行用户是和Nginx一样的低权限用户,所以无法创建 /var/run/php-fpm/ 子目录,从而也就无法创建 /var/run/php-fpm/php-fpm.sock 文件

# 目录 /var/run 有点「内存盘」的感觉,就是说它不是一直稳定存在的,而是只存在于内存中(网上有说法是这样会提高速度),当系统重启时,/var 下的目录便会消失,需要重新创建

综上,我将原先php-fpm的配置文件里的listen和Nginx配置文件里的fastcgi_pass都改成了 /var/run/php-fpm.sock ,然后将php-fpm和Nginx服务都加入系统启动项,重启系统,一切OK。

如何使用 Ansible 创建和删除 AWS ec2 密钥?

未分类

我想使用 Ansible 工具创建 Amazon EC2 密钥对。不想使用 AWS CLI 来创建。可以使用 Ansible 来创建 AWS ec2 密钥吗?

你需要使用 Ansible 的 ec2_key 模块。这个模块依赖于 python-boto 2.5 版本或者更高版本。 boto 是亚马逊 Web 服务的一个 Python API。你可以将 boto 用于 Amazon S3、Amazon EC2 等其他服务。简而言之,你需要安装 Ansible 和 boto 模块。我们一起来看下如何安装 boto 并结合 Ansible 使用。

第一步 – 在 Ubuntu 上安装最新版本的 Ansible

你必须给你的系统配置 PPA 来安装最新版的 Ansible。为了管理你从各种 PPA(Personal Package Archives)安装软件的仓库,你可以上传 Ubuntu 源码包并编译,然后通过 Launchpad 以 apt 仓库的形式发布。键入如下命令 apt-get 命令或者 apt 命令:

    $ sudo apt update 
    $ sudo apt upgrade 
    $ sudo apt install software-properties-common

接下来给你的系统的软件源中添加 ppa:ansible/ansible。

    $ sudo apt-add-repository ppa:ansible/ansible

更新你的仓库并安装 Ansible:

    $ sudo apt update 
    $ sudo apt install ansible

安装 boto:

$ pip3 install boto3

关于在CentOS/RHEL 7.x上安装 Ansible 的注意事项

你需要在 CentOS 和 RHEL 7.x 上配置 EPEL 源和 yum命令

    $ cd /tmp 
    $ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
    $ ls *.rpm 
    $ sudo yum install epel-release-latest-7.noarch.rpm 
    $ sudo yum install ansible

安装 boto:

$ pip install boto3

第二步 2 – 配置 boto

你需要配置 AWS credentials/API 密钥。参考 “AWS Security Credentials” 文档如何创建 API key。用 mkdir 命令创建一个名为 ~/.aws 的目录,然后配置 API key:

    $ mkdir -pv ~/.aws/ 
    $ vi ~/.aws/credentials
    [default]
    aws_access_key_id = YOUR-ACCESS-KEY-HERE
    aws_secret_access_key = YOUR-SECRET-ACCESS-KEY-HERE

还需要配置默认 AWS 区域:

    $ vi ~/.aws/config

输出样例如下:

    [default]
    region = us-west-1

通过创建一个简单的名为 test-boto.py 的 Python 程序来测试你的 boto 配置是否正确:

    #!/usr/bin/python3
    # A simple program to test boto and print s3 bucket names
    import boto3
    t = boto3.resource('s3')
    for b in t.buckets.all():
     print(b.name)

按下面方式来运行该程序:

    $ python3 test-boto.py

输出样例:

    nixcraft-images
    nixcraft-backups-cbz
    nixcraft-backups-forum

上面输出可以确定 Python-boto 可以使用 AWS API 正常工作。

第三步 3 – 使用 Ansible 创建 AWS ec2 密钥

创建一个名为 ec2.key.yml 的剧本,如下所示:

    ---
    - hosts: local
      connection: local
      gather_facts: no
      tasks:

     - name: Create a new EC2 key
       ec2_key:
       name: nixcraft-key
       region: us-west-1
       register: ec2_key_result

     - name: Save private key
       copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600
       when: ec2_key_result.changed

其中,

  • ec2_key: – ec2 密钥对。
  • name: nixcraft_key – 密钥对的名称。
  • region: us-west-1 – 使用的 AWS 区域。
  • register: ec2_key_result – 保存生成的密钥到 ec2keyresult 变量。
  • copy: content=”{{ ec2_key_result.key.private_key }}” dest=”./aws.nixcraft.pem” mode=0600 – 将 ec2_key_result.key.private_key 的内容保存到当前目录的一个名为 aws.nixcraft.pem 的文件中。设置该文件的权限为 0600 (unix 文件权限)。
  • when: ec2_key_result.changed – 仅仅在 ec2_key_result 改变时才保存。我们不想覆盖你的密钥文件。

你还必须创建如下 hosts 文件:

    [local]
    localhost

如下运行你的剧本:

    $ ansible-playbook -i hosts ec2.key.yml

最后你应该有一个名为 `aws.nixcraft.pem 私钥,该私钥可以和 AWS EC2 一起使用。使用 cat 命令查看你的密钥:

    $ cat aws.nixcraft.pem

如果你有 EC2 虚拟机,请按如下方式使用:

    $ ssh -i aws.nixcraft.pem user@ec2-vm-dns-name

未分类

查看有关 python 数据结构变量名的信息,比如
ec2keyresult.changed 和 ec2keyresult.key.private_key
你一定在想我是如何使用变量名的,比如 ec2_key_result.changed 和 ec2_key_result.key.private_key。它们在哪里定义过吗?变量的值是通过 API 调用返回的。简单地使用 -v 选项运行 ansible-playbook 命令来查看这样的信息:

    $ ansible-playbook -v -i hosts ec2.key.yml

未分类

我该如何删除一个密钥?

使用如下 ec2-key-delete.yml:

    ---
    - hosts: local
      connection: local
      gather_facts: no
      tasks:

     - name: Delete a EC2 key
       ec2_key:
       name: nixcraft-key
       region: us-west-1
    # absent means delete keypair
       state: absent

按照如下方式运行:

    $ ansible-playbook -i hosts ec2-key-delete.yml

gitlab搭建与基本使用

一、git、github、gitlab的区别

Git是版本控制系统,Github是在线的基于Git的代码托管服务。
GitHub是2008年由Ruby on Rails编写而成。GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,只有付费账户可以创建私有的代码仓库。
Gitlab解决了这个问题, 可以在上面创建免费的私人repo。

二、gitlab server搭建过程

[root@vm1 ~]#  yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python
//10.x以后开始依赖policycoreutils-python
[root@vm1 ~]# systemctl start postfix
[root@vm1 ~]# systemctl enable postfix

gitlab的下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

安装gitlab:

[root@vm1 ~]# rpm -ivh gitlab-ce-10.7.2-ce.0.el7.x86_64.rpm 
warning: gitlab-ce-10.7.2-ce.0.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID f27eab47: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:gitlab-ce-10.7.2-ce.0.el7        ################################# [100%]
It looks like GitLab has not been configured yet; skipping the upgrade script.

       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.

     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ 
  / /_/ / / /_/ /___/ /_/ / /_/ /
  ____/_/__/_____/__,_/_.___/

Thank you for installing GitLab!
GitLab was unable to detect a valid hostname for your instance.
Please configure a URL for your GitLab instance by setting `external_url`
configuration in /etc/gitlab/gitlab.rb file.
Then, you can start your GitLab instance by running the following command:
  sudo gitlab-ctl reconfigure

For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md

[root@vm1 ~]#

gitlab的配置文件 /etc/gitlab/gitlab.rb, 编辑如下:

[root@vm1 ~]# vim /etc/gitlab/gitlab.rb 
[root@vm1 ~]# grep "^external_url" /etc/gitlab/gitlab.rb
external_url 'http://192.168.60.119'   绑定监听的域名或IP
[root@vm1 ~]# 

使用gitlab-ctl reconfigure 自动配置,并安装数据库,初始化信息,如下所示(第一次使用配置时间较长):

[root@vm1 ~]# gitlab-ctl reconfigure   
.....

使用gitlab-ctl start 启动gitlab服务,如下所示:

[root@vm1 ~]# gitlab-ctl start
ok: run: gitaly: (pid 22896) 2922s
ok: run: gitlab-monitor: (pid 22914) 2921s
ok: run: gitlab-workhorse: (pid 22882) 2922s
ok: run: logrotate: (pid 22517) 2987s
ok: run: nginx: (pid 22500) 2993s
ok: run: node-exporter: (pid 22584) 2974s
ok: run: postgres-exporter: (pid 22946) 2919s
ok: run: postgresql: (pid 22250) 3047s
ok: run: prometheus: (pid 22931) 2920s
ok: run: redis: (pid 22190) 3053s
ok: run: redis-exporter: (pid 22732) 2962s
ok: run: sidekiq: (pid 22472) 3005s
ok: run: unicorn: (pid 22433) 3011s
[root@vm1 ~]# 
[root@vm1 ~]# lsof -i:80
COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   22500       root    7u  IPv4  50923      0t0  TCP *:http (LISTEN)
nginx   22501 gitlab-www    7u  IPv4  50923      0t0  TCP *:http (LISTEN)
[root@vm1 ~]# 

修改配置文件,添加smtp邮件功能

[root@vm1 ~]# vim /etc/gitlab/gitlab.rb
[root@vm1 ~]# grep -P "^[^#].*smtp_|user_email|gitlab_email" /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'Admin'
gitlab_rails['gitlab_email_reply_to'] = '[email protected]'
gitlab_rails['gitlab_email_subject_suffix'] = '[gitlab]'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 25 
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "domain.cn"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
user['git_user_email'] = "[email protected]"

[root@vm1 ~]# gitlab-ctl reconfigure
......

[root@vm1 ~]# gitlab-ctl stop
ok: down: gitaly: 0s, normally up
ok: down: gitlab-monitor: 1s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: logrotate: 1s, normally up
ok: down: nginx: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 0s, normally up
ok: down: redis-exporter: 1s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 1s, normally up

[root@vm1 ~]# gitlab-ctl start
ok: run: gitaly: (pid 37603) 0s
ok: run: gitlab-monitor: (pid 37613) 0s
ok: run: gitlab-workhorse: (pid 37625) 0s
ok: run: logrotate: (pid 37631) 0s
ok: run: nginx: (pid 37639) 1s
ok: run: node-exporter: (pid 37644) 0s
ok: run: postgres-exporter: (pid 37648) 1s
ok: run: postgresql: (pid 37652) 0s
ok: run: prometheus: (pid 37660) 1s
ok: run: redis: (pid 37668) 0s
ok: run: redis-exporter: (pid 37746) 0s
ok: run: sidekiq: (pid 37750) 1s
ok: run: unicorn: (pid 37757) 0s

使用gitlab-rails console命令进行发送邮件测试,如下所示:

[root@vm1 ~]# gitlab-rails console 
Loading production environment (Rails 4.2.10)
irb(main):001:0>  Notify.test_email('[email protected]', 'Message Subject', 'Message Body').deliver_now

Notify#test_email: processed outbound mail in 2219.5ms

Sent mail to [email protected] (2469.5ms)
Date: Fri, 04 May 2018 15:50:10 +0800
From: Admin <[email protected]>
Reply-To: Admin <[email protected]>
To: [email protected]
Message-ID: <[email protected]>
Subject: Message Subject
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Message Body</p></body></html>

=> #<Mail::Message:70291731344240, Multipart: false, Headers: <Date: Fri, 04 May 2018 15:50:10 +0800>, <From: Admin <[email protected]>>, <Reply-To: Admin <[email protected]>>, <To: [email protected]>, <Message-ID: <[email protected]>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
irb(main):002:0>quit
[root@vm1 ~]# 

三、gitlab的使用

在浏览器中输入 http://192.168.60.119/ ,然后 change password: ,并使用root用户登录 即可 (后续动作根据提示操作)

修改密码也可以:gitlab-rails console production

irb(main):001:0> user = User.where(id: 1).first // id为1的是超级管理员
irb(main):002:0>user.password = 'yourpassword' // 密码必须至少8个字符
irb(main):003:0>user.save! // 如没有问题 返回true
exit // 退出

未分类

如果需要手工修改nginx的port ,可以在gitlab.rb中设置 nginx[‘listen_port’] = 8000 ,然后再次 gitlab-ctl reconfigure即可

登录gitlab 如下所示:

未分类

创建 group ,组名为plat-sp ,如下所示:

未分类

未分类

去掉用户的自动注册功能:
admin are -> settings -> Sign-up Restrictions 去掉钩钩,然后拉到最下面保存,重新登录

未分类

创建用户Tompson如下所示:

未分类

同样的方法,再创建Eric 、Hellen 用户。用户添加完毕后,gitlab会给用户发一封修改密码的邮件,各用户需要登录自己的邮箱,并点击相关的链接,设置新密码。

将用户添加到组中,并指定Tompson为本组的owner:

未分类

同样的方法将用户Eric、Hellen也添加到组中,并指定他们为Developer:

未分类

使用Tompson用户的身份与密码登录到gitlab界面中,并创建Project ,如下所示:

未分类

指定项目的存储路径和项目名称,如下所示

未分类

未分类

为项目创建Dev分支,如下所示:

未分类

未分类

在 client 上添加Tompson的用户:

[root@vm2 ~]# useradd Tompson
[root@vm2 ~]# useradd Eric
[root@vm2 ~]# useradd Hellen
[root@vm2 ~]# su - Tompson
[Tompson@vm2 ~]$ ssh-keygen -C [email protected]
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Tompson/.ssh/id_rsa): 
Created directory '/home/Tompson/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/Tompson/.ssh/id_rsa.
Your public key has been saved in /home/Tompson/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SAoAH2zSxqEJqVgKKrxM5XMi6tKe61JMRdwMhwBNIrE [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|XX==o=.          |
|*BOo+.o          |
|E*=.  .          |
|*+.= + .         |
|=oo = . S        |
|.oo              |
|.o               |
|o...             |
|.+=.             |
+----[SHA256]-----+
[Tompson@vm2 ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ8cRGHej+sZzlmK36W5MUXMLOGdTwFI9Jj44mGuabZCrlYW4GDpL6ppezN+Sur0wHtnKonYJzm8ntqS0S0UHyaPPQPl9Mrs/6Z4VrXZ/4RlqHdWeSrmOwCBQld0l8HvrmP4TyGHrOreO8uZqimd/Z+OiMqnYRZzENX11Pti/Px5g1MtJcoCi9uLtF42QYrt1X/fzAyPU9C5/5ZUq4Jln3EF20bzcA52oAzZIl0jrhI0TeTeW6zYq+KxdHGshL+qG7+Ne+akPOe4Ma5BQjcMZ2dQ2kbGuozXmLT8RDcj9YRKceQsUdTI71lJpwrWKGn8Vhra0EaK3hgoTuvMYaGfOF [email protected]

将Tompson的公钥复制到gitlab中: 使用Tompson用户的身份与密码登录到gitlab界面中,然后在ssh-key中添加 相关的key ,如下所示:

未分类

未分类

为Tompson用户配置git ,如下所示:

[Tompson@vm2 ~]$ git config --global user.email "[email protected]"
[Tompson@vm2 ~]$ git config --global user.name "Tompson"

[Tompson@vm2 ~]$ git clone [email protected]:plat-sp/chathall.git
Cloning into 'chathall'...
The authenticity of host '192.168.60.119 (192.168.60.119)' can't be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.60.119' (ECDSA) to the list of known hosts.
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
[Tompson@vm2 ~]$ 
[Tompson@vm2 ~]$ cd chathall/
[Tompson@vm2 chathall]$ ls
Readme.txt
[Tompson@vm2 chathall]$

创建一下新文件,添加内容,并提交到master分支:

[Tompson@vm2 chathall]$ vim test.sh
[Tompson@vm2 chathall]$ cat test.sh 
#!/bin/bash
echo "gitlab test"
[Tompson@vm2 chathall]$ git add . 
[Tompson@vm2 chathall]$ git commit -m '201805101649'
[master 80edf6b] 201805101649
 1 file changed, 2 insertions(+)
 create mode 100644 test.sh
[Tompson@vm2 chathall]$ 
[Tompson@vm2 chathall]$ git push -u origin master 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:plat-sp/chathall.git
   4611654..80edf6b  master -> master
Branch master set up to track remote branch master from origin.
[Tompson@vm2 chathall]$ 

使用Eric用户登录,并clone 项目,如下所示:

[root@vm2 ~]# su - Eric
[Eric@vm2 ~]$ ssh-keygen -C [email protected]
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Eric/.ssh/id_rsa): 
Created directory '/home/Eric/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/Eric/.ssh/id_rsa.
Your public key has been saved in /home/Eric/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:VZaJvjA5SJZEB+yuRpDBNHCECCZ5R8X0DYcNE0f1B6E [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|*O=..B*o**+o+oo. |
|*.+.. *o.*oooo . |
| . + + ..oo E . .|
|  o   o =..    . |
|   . .  S+ .     |
|    . .   .      |
|   . .           |
|    o            |
|   .             |
+----[SHA256]-----+

[Eric@vm2 ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxQcn4UjRW/5PT5witeV9+S2w8WK5ouawHxEF7s9wuWsT4pqhcu5BN74NG3CPaq1jJZnkV+aQsTw+60BAd1gOK0FBbKWxmohmE61n9vfpUT5igJ72t2jpXjfKwLIHw+Iq5yM4yUhkwSsoBuZkxYSEltnj8OvXaOlCDYnXuGBa9+xO8f5yVIcOtiwRvv+Y1PRRzSIcazPVZax9FLK26t1R4NPiY4xWkIJyK2OrKMeiaBBzyMfWzHdmsCWa51oSrYSmz3PDBXpzIBs3OdKxcaJs9Lc5u87YCV5RMUjLrPcA7nPK6crOabLXhz3d5GSYggMTOByQkyKOo7WlYpARCHOt/ [email protected]
[Eric@vm2 ~]$ 

同样需要使用Eric用户登录gitlab web 界面,并添加相应的ssh-key。然后设置git ,并clone项目:

[Eric@vm2 ~]$ git config --global user.email "[email protected]"
[Eric@vm2 ~]$ git config --global user.name "Eric"
[Eric@vm2 ~]$ git clone [email protected]:plat-sp/chathall.git
Cloning into 'chathall'...
The authenticity of host '192.168.60.119 (192.168.60.119)' can't be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[Eric@vm2 ~]$ 

切换到dev分支,修改文件内容,并将新code提交到dev分支(Developer角色默认并没有提交master的权限):

[Eric@vm2 chathall]$ git checkout dev 
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
[Eric@vm2 chathall]$ ls
Readme.txt  test.sh
[Eric@vm2 chathall]$ vim test.sh 
[Eric@vm2 chathall]$ cat test.sh 
#!/bin/bash
echo "gitlab test"
echo "brahch test"
[Eric@vm2 chathall]$ git add . 
[Eric@vm2 chathall]$ git commit -m '201805101658'
[dev 6687039] 201805101658
 1 file changed, 1 insertion(+)
[Eric@vm2 chathall]$ git push -u origin dev 
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for dev, visit:
remote:   http://192.168.60.119/plat-sp/chathall/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To [email protected]:plat-sp/chathall.git
   80edf6b..6687039  dev -> dev
Branch dev set up to track remote branch dev from origin.
[Eric@vm2 chathall]$
[Eric@vm2 chathall]$ git checkout master 
Switched to branch 'master'
[Eric@vm2 chathall]$ git branch 
  dev
* master
[Eric@vm2 chathall]$

使用Eric 用户登录gitlab web,在界面中 创建一个合并请求:

未分类

提×××并请求:

未分类

然后使用Tompson用户登录 gitlab web ,找到“合并请求” ,然后将dev分支合并到master分支,如下所示:

未分类

未分类

大部分公司的处理流程如下:

  • PM在gitlab创建任务,分配给开发人员
  • 开发人员领取任务后,在本地使用git clone拉取代码库
  • 开发人员创建开发分支(git checkout -b dev),并进行开发
  • 开发人员完成之后,提交到本地仓库(git commit )
  • 开发人员在gitlab界面上申请分支合并请求(Merge request)
  • PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master)
  • 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提×××并请求时可以通过描述中填写”close #1″等字样,可以直接关闭issue

Centos 6/7 升级 PHP 5.6 到 7.1/7.2

本站使用的是 WordPress 搭建,刚开始搭建的时候吧,没啥经验,网上搜一搜,就用了 PHP 5.6 版本,然后网站速度这个慢啊,虽然用了各种方法已经很快了,但是当时搜出来的使用 PHP 7 这个方法一直没试,心里痒,这回终于升级了一下。

1. 检查当前安装的 PHP

查看当前 PHP 版本

php -v

查看当前 PHP 相关的安装包

yum list installed | grep php

2. 更换 RPM 源

#Centos 5.X:
rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm

#CentOs 6.x:
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm

#CentOs 7.X:
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

3. 停止相关服务

关闭 php-fpm 和 nginx 服务

service php-fpm stop
/usr/local/nginx/sbin/nginx -s stop
BashCopy

4. 删除已经安装的 PHP 相关包

yum remove php*
BashCopy

5. 安装新版本 PHP

php 7.0/7.1/7.2 分别表示为 70w/71w/72w

目前(2018-5-4)

CentOs 6.x 的 RPM 源中最高只有 7.1

CentOs 7.x 的 RPM 源中有 7.2

yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml php71w-ldap php71w-mcrypt
BashCopy

6. 重新启动相关服务

service php-fpm start
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
BashCopy

7. 再次检查版本

php -v

CentOS 7.4 安装python3及虚拟环境

由于写了个爬虫脚本,需要放到服务器中运行。之前一直在Ubuntu系统中安装多Python环境,而CentOS系统的安装步骤略微有些出入,故详细记录下这几天趟过的坑。

说明

1.本文的系统命令一般会在语句前加上#号,以区分系统命令及其他内容。输入命令时,无需输入#号。

# yum install vim

2.本文系统输出的信息,会在前面加上>>号。

# which python
>> /usr/bin/python    # 系统输出的信息

3.本文的系统命令都是在root账号下执行的,假如非root账号执行,提示没有权限,可在命令前加sudo。

# yum install vim    #root账号下执行命令
# sudo yum install vim    #非root账号下执行管理员权限命令,需在命令前加`sudo`

4.安装环境

系统版本:CentOS 7.4(自带Python2.7)
安装版本:Python3.6
安装插件:virtualenv、virtualenvwrapper

一、安装Python3

由于CentOS7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。所以我们要额外安装Python3,而且系统一般允许多个版本的python同时存在。

我们先来查看python安装位置,一般是位于/usr/bin/python目录下。

# which python
>> /usr/bin/python

下面介绍安装Python3的方法:

1. 安装依赖包(切记安装)

# yum -y groupinstall "Development tools"
# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

2.下载Python3安装包

大家可根据自己需求下载不同版本的Python3,我下载的是Python3.6.2

# wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz

3. 新建python3存放目录

# mkdir /usr/local/python3 

4. 安装Python3

解压压缩包,进入解压目录,指定安装目录,安装Python3。

# tar -xvJf  Python-3.6.2.tar.xz
# cd Python-3.6.2
# ./configure --prefix=/usr/local/python3
# make && make install

安装Python3时,会自动安装pip。假如没有,需要自己手动安装。

# yum -y install python-pip

5. 创建软链接

# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

6. 安装完成,输入python3测试

未分类

二、创建虚拟环境

virtualenv是一个可以在同一计算机中隔离多个python版本的工具。有时,两个不同的项目可能需要不同版本的python,如 python2.7 / python3.6 ,但是如果都装到一起,经常会导致问题。virtualenv能够用于创建独立的Python虚拟环境,多个Python相互独立,互不影响。
virtualenvwrapper这个软件包可以让我们管理虚拟环境变得更加简单。不用再跑到某个目录下通过virtualenv来创建虚拟环境,并且激活的时候也要跑到具体的目录下去激活。

下面介绍安装python虚拟环境的方法:

使用pip安装包前,先更新pip。

# pip3 install --upgrade pip

1. 安装virtualenv、virtualenvwrapper

# pip3 install virtualenv
# pip3 install virtualenvwrapper

2. 进入.bashrc文件中,定义virtualenvwrapper路径

使用vim编辑.bashrc文件

# vim ~/.bashrc

在文末填入以下代码并保存

VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/bin/python3    # 指定virtualenvwrapper执行的python版本
export WORKON_HOME=$HOME/.virtualenvs    # 指定虚拟环境存放目录,.virtualenvs目录名可自拟
source /usr/local/bin/virtualenvwrapper.sh    # virtualenvwrapper.sh所在目录

3. 运行.bashrc文件

# source ~/.bashrc

4. 创建虚拟环境

# mkvirtualenv py3-env

也可指定虚拟环境的python版本

# mkvirtualenv --python=/usr/bin/python3 py3-env  

5. 进入虚拟环境中,然后进入到项目所在目录,安装好相应的包(如无需要,可跳过此步)

#  pip install -r requirements.txt

虚拟环境搭建完成!

常见的virtualenvwrapper命令

  • 创建虚拟环境
# mkvirtualenv my_env
  • 切换到某个虚拟环境
# workon my_env
  • 退出当前虚拟环境
# deactivate
  • 删除某个虚拟环境
# rmvirtualenv my_env
  • 列出所有虚拟环境
# lsvirtualenv
  • 进入到虚拟环境所在的目录
# cdvirtualenv

三、异常情况

  • 假如source ~/.bashrc时,提示以下错误
# source ~/.bashrc
>> -bash: /usr/local/bin/virtualenvwrapper.sh: No such file or directory

【原因】
.bashrc文件中的virtualenvwrapper.sh所在目录错误。

【解决方案】
①查找virtualenvwrapper.sh所在目录

# find / -name "virtualenvwrapper.sh"
>> /usr/local/python3/bin/virtualenvwrapper.sh

②把.bashrc文件的virtualenvwrapper.sh目录更改为实际所在目录

source /usr/local/python3/bin/virtualenvwrapper.sh    # virtualenvwrapper.sh实际所在目录
  • 假如创建虚拟环境时,提示以下错误
# mkvirtualenv my_env
>> ERROR: virtualenvwrapper could not find virtualenv in your path

【解决方案】
①查找virtualenv所在目录

# find / -name "virtualenv"
>> /usr/local/python3/bin/virtualenv

②创建软链接

#  ln -s /usr/local/python3/bin/virtualenv /usr/local/bin/virtualenv