linux虚拟机网卡配置

linux虚拟复制后经常会出现无法获取ip或网卡无法启动等问题,处理过程如下:

1.在虚拟机网卡设置界面重新生成MAC地址

2.修改对应网卡硬件配置文件

#将网卡编号修改为对应的编号,如eth0,MAC地址修改为生成的MAC地址
vim /etc/udev/rules.d/*-net.rules

3.修改网卡启动参数

#将网卡编号修改为对应的编号,如eth0,MAC地址修改为生成的MAC地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0

 

修改centos6源,添加Atomic源

Atomic源支持Fedora,RHEL和CentOS的YUM包管理。这里系统是CentOS6.2。

安装方法很简单:

wget -q -O – http://www.atomicorp.com/installers/atomic | sh

在导入key的界面等待几秒会自动导入,  然后输入yes可以设置成默认源

安装完后在/etc/yum.repos.d/目录会有一个atomic.repo文件。

Golang学习笔记

Go安装

1.linux下编译安装

安装gcc等工具

sudo apt-get install gcc libc6-dev

下载源码,运行all.bash即可

hg clone -u release https://code.google.com/p/go
cd go/src
./all.bash

2.windows下安装

下载.msi文件安装即可

3.环境变量配置

  1. 添加C:Go\bin目录到path (直接使用命令调用go)
  2. 添加C:Go\目录到GOROOT (配置Go安装目录,编译时需要调用扩展包)
  3. 添加C:\Users\wang\Desktop\golang (项目地址,底下包含三个目录bin,pkg,src, src存放源代码)

linux 使用export GOPATH=/home/apple/mygo  添加,或者加入~/.bash_profile(单一用户)

信号处理

通常程序需要监听系统信号来实现平稳退出等操作,golang可以很方便的处理系统信号

import (
	"os/signal"
	"syscall"
	"os"
)

func main() {
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	<-sigs //阻塞等待信号
}

可以将<-sigs 这一步单独交给一个线程来监控

linux信号列表

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

其中SIGINT 一般为Ctrl+C

参考linux信号列表

Golang原子操作

golang提供了sync/*原子操作方法,其中常用的包括:

只执行一次某个函数Once

package main
import (
    "sync"
)
var once sync.Once
onceFunc(){
    //todo....
}
func main(){
    go  once.Do(onceFunc)
    go  once.Do(onceFunc)
    //sleep ..
}

原子计数操作atomic

package main
import (
    "sync/atomic"
)
var count int32 = 0
func add(){
    atomic.AddInt32(&count, 1)
    Println("count:", atomic.LoadInt32(&count))
}
func main(){
    go add()
    go add()
    //sleep ..
}

等待一组线程结束WaitGroup

package main
import (
    "sync"
)
var count int32 = 0
func EchoNumber(n int){
    Println(n)
}
func main(){
    var wg sync.WaitGroup
	for i := 0; i < 5; i = i + 1 {
		wg.Add(1)
		go func(n int) {
			defer wg.Add(-1)
			EchoNumber(n)
		}(i)
	}
    wg.Wait()
}

 

 

Beanstalkd任务列队/消息列队

简介

Beanstalkd是一个轻量级高性能的任务列队系统,主要特性有优先级设置,持久化,分布式容错,超时控制

安装

sudo yum install beanstalkd

启动

sudo beanstalkd -d ./DIR

常用的启动参数

  • -d  指定binlog路径,用于断电后自动恢复
  • -f  同步时间 -f0为实时同步
  • -F  不同步 默认

使用简介

生产者通过put命令将一个job推动到一个指定的tube列队中,消费者从指定的tube列队中获取job通过通过reserve/release/bury/delete进行操作,改变job状态

如果有多个消费者在同一个tube不会收到相同的任务请求

发送任务

<?php
//发送任务
require_once 'Client.php';
//实例化beanstalk
$beanstalk = new \Beanstalk\Client();
$beanstalk->connect();
//选择使用的tube
$beanstalk->useTube('test');
//往tube中增加数据
$put = $beanstalk->put(
    23, // 任务的优先级.
    0,  // 不等待直接放到ready队列中.
    60, // 处理任务的时间.
    'hello, beanstalk'  // 任务内容
);
if (!$put) {
    exit('commit job fail');
}
$beanstalk->disconnect();

处理任务

<?php

require_once 'Client.php';
//实例化beanstalk
$beanstalk = new \Beanstalk\Client();
$beanstalk->connect();

//查看beanstalkd状态
//var_dump($beanstalk->stats());
//查看有多少个tube
//var_dump($beanstalk->listTubes());
$beanstalk->useTube('test');
//设置要监听的tube
$beanstalk->watch('test');
//取消对默认tube的监听,可以省略
$beanstalk->ignore('default');
//查看监听的tube列表
//var_dump($beanstalk->listTubesWatched());
//查看test的tube当前的状态
//var_dump($beanstalk->statsTube('test'));

while (true) {
//获取任务,此为阻塞获取,直到获取有用的任务为止
    $job = $beanstalk->reserve(); //返回格式array('id' => 123, 'body' => 'hello, beanstalk')
    //处理任务
    $result = ($job['body']);
    if ($result) {
        //删除任务
        $beanstalk->delete($job['id']);
    } else {
        //休眠任务
        $beanstalk->bury($job['id']);
    }
    //跳出无限循环
    if (file_exists('shutdown')) {
        file_put_contents('shutdown', 'beanstalkd在' . date('Y-m-d H:i:s') . '关闭');
        break;
    }
}
$beanstalk->disconnect();

 

继续阅读“Beanstalkd任务列队/消息列队”

Linux服务器配置PPTP类型VPN

步骤

  1. 安装PPTP
  2. 配置客户端IP地址
  3. 配置客户端DNS
  4. 添加VPN账号
  5. 开放端口,添加流量转发规则
  6. 启动服务

一 安装PPTP

yum install pptpd

如果提示未找到相关软件,添加软件源参考链接

二 配置客户端IP地址

修改/etc/pptpd.conf 文件,去掉如下两行的注释

localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

localip表示分配给服务器的内部网关地址,remoteip 为分配给客户端的地址段

三 配置客户端DNS

查看/etc/pptpd.conf中指定的option文件(默认为/etc/ppp/options.pptpd ),修改文件中的ms-dns 记录

ms-dns 114.114.114.114
ms-dns 8.8.8.8

四 添加VPS账号

编辑/etc/ppp/chap-secrets 文件,添加账号配置,格式为账号 协议 密码 ip地址 ,ip填*为自动分配

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
username pptpd password *

启动服务

service pptpd restart

查看服务是否监听了1723端口

[root@localhost ~]# netstat -antp |grep 1723
tcp        0      0 0.0.0.0:1723                0.0.0.0:*                   LISTEN      1586/pptpd          
[root@localhost ~]# 

五 开放端口,添加流量转发

开放需要使用的端口

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p 47 -j ACCEPT

现在的VPN服务可以连上,但是不能通过VPN服务器进行转发,也就是不能够上网或者访问其他服务器等,需要开启系统转发和NAT。编辑系统配置文件/etc/sysctl.conf,设置如下值为

net.ipv4.ip_forward = 1

使配置生效

sysctl -p

添加流量转发规则,后面的ip为服务器外网ip

iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -j SNAT --to-source 45.78.40.111

保存设置

service iptables save

重启服务

service iptables restart
service pptpd start

连接说明

经实测,windows10 下和ios下只需选择连接类型为pptp,然后配置vpn地址和用户名密码即可连接成功,其他配置均为默认即可。

开启日志

  1. 取消/etc/pptpd.conf下的 debug注释
  2. /etc/ppp/options.pptpd 配置文件添加 logfile /var/log/ppp.log

centos7 开放端口

centos使用了firewalld

 

禁用

# systemctl mask firewalld

停用

# systemctl stop firewalld

 

查询是否开启80端口则:

# firewall-cmd --query-port=80/tcp

开启80端口:

# firewall-cmd --add-port=80/tcp

 

使用CentOS链接VPN,共享成HTTP代理(搭建HTTP代理)

开始

一,安装相关软件包

# yum install ppp pptp pptp-setup

二,创建VPN链接

# pptpsetup --create vpnname --server hostname --username xxxxx --password xxxx --encrypt  --start

使用–encrypt启用数据加密

断开VPN   # killall pppd

三,设置路由

1.先添加一条 本机 10.0.14.242 可以访问虚拟机CentOS的 路由

# route add -net 10.0.14.0 netmask 255.255.255.0 gw 10.0.18.254

2.CentOS其他所有流量走 VPN

# route add -net 0.0.0.0 dev ppp0

设置后路由表如下

[root@localhost ~]# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.4        *               255.255.255.255 UH    0      0        0 ppp0
106.186.127.186 10.0.18.254     255.255.255.255 UGH   0      0        0 eth0
li817-61.member 10.0.18.254     255.255.255.255 UGH   0      0        0 eth0
10.0.18.0       *               255.255.255.0   U     0      0        0 eth0
10.0.14.0       10.0.18.254     255.255.255.0   UG    0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         *               0.0.0.0         U     0      0        0 ppp0
default         10.0.18.254     0.0.0.0         UG    0      0        0 eth0

 

四,搭建HTTP代理

tinyproxy 是一个小型的基于GPL的HTTP/SSL代理程序,非常适合小型网络而且便于快速部署。这个代理程序最大的优点就是占用系统资源比较少。

1.安装tinyproxy

# yum install tinyproxy

2.编辑配置文件

# vim /etc/tinyproxy/tinyproxy.conf

注释 # Allow 127.0.0.1    允许所有ip访问

3.启动tinyproxy,设置开机启动

# service tinyproxy restart
# chkconfig --level 345 tinyproxy on

 

docker 容器安装与使用

参考书籍

Docker安装

daocloud国内镜像仓库

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

 安装docker

# yum install docker docker-io

查看是否安装成功,启动docker

# docker version
Client version: 1.6.0
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 8aae715/1.6.0
OS/Arch (client): linux/amd64
Server version: 1.6.0
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 8aae715/1.6.0
OS/Arch (server): linux/amd64

# service docker start

安装镜像

可用的镜像地址

搜索可用镜像

# docker search 镜像名字

下载运行镜像

docker pull library/ubuntu
docker run learn/tutorial apt-get install -y ping #使容器执行指定的命令,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,docker无法响应这种交互
docker run -t -i ubuntu /bin/bash  #运行容器的bash 并进入命令行交互

exit退出容器后使用docker ps -l 来获取最后一次修改之后的容器id

修改/保存镜像

exit  #退出当前镜像
#首先使用docker ps -l命令获得安装完nginx命令之后容器的id。然后把这个镜像保存为nginx
docker commit -m "new_action" -a "author_name" f14a647c64e2 new_image_name:tagname
docker images

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息(–author);之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

外部访问容器

参考文档

通过 -P-p 参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
使用 docker ps 可以看到配置后的映射状态

docker run -d -p 5000:5000 training/webapp #-d 守护进程执行

常用列表

docker images   #显示本地已有的镜像
docker ps #列出当前所有正在运行的container
docker attach CID #进入一个正在运行的容器   exit; 退出并结束.  ctrl+p ctrl+q 返回宿主机
docker ps -a  # 列出所有的container  
docker ps -l  #列出最近一次启动的container
docker rm ID #删除单个容器
docker rm `docker ps -a -q`  #删除所有容器(container)
docker rmi ID  删除images镜像
docker -d #已守护进程运行

说明

image并不等于container只有commit后才会产生一个images

使用mkdocs实时发布项目文档

MkDocs


 

MkDocs 是一个用于创建项目文档的 快速, 简单 , 完美华丽 的静态站点生成器. 文档源码使用 Markdown 来撰写, 用一个 YAML 文件作为配置文档。

虽然mkdocs现在还处于开发阶段,但是他所展现出来的特色确实很有吸引力,特别是他的实时发布功能。

官方文档

MkDocs的安装

MkDocs需要python和 Python package manager pip 环境,并且版本2.6以上,但是在2.6.6版本下安装时会提示缺少扩展包,升级到2.10后解决,所以建议尽量使用更新版本的python

#安装依赖
yum install openssl openssl-devel zlib zlib-devel -y

$ wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2  
$ tar -jxvf Python-2.7.3.tar.bz2 
$ cd Python-2.7.3
$ make && make install

$ ./Python-2.7.3/python --version
Python 2.7.2
$ wget https://bootstrap.pypa.io/get-pip.py
$ ./Python-2.7.3/python get-pip.py
$ pip --version
pip 1.5.2
$ pip install mkdocs

安装完mkdocs后使用 mkdocs –help 以检查是否正确安装

开始使用

新建项目

$ mkdocs new my-project
$ cd my-project

有一个配置文件 mkdocs.yml, 和一个包含文档源码的 docs 文件夹. 在 docs 文件夹里包含了一个名为 index.md 的文档.

MkDocs 包含了一个内建的服务器以预览当前文档. 控制台切换当前目录到 mkdocs.yml 配置文件相同文件夹, 输入 mkdocs serve 命令以启动内建服务器:

$ mkdocs serve
Running at: http://127.0.0.1:8000/

在浏览器中打开 http://127.0.0.1:8000/ , 可以看到结果页面screenshot

 

如果需要用到时时发布只需把mkdocs serve运行于后台即可,通过–dev-addr来指定ip和端口

nohup mkdocs serve --dev-addr 10.0.18.19:8000

也可以通过mkdocs build 来生成静态html页面

自定义模板

参考官方文档

Mkdocs支持中文搜索

1.下载支持中文的lunr.js替换mkdocs自带的lunr.js

cp ./lunr.js /usr/local/lib/python2.7/site-packages/mkdocs/assets/search/mkdocs/js/lunr-0.5.7.min.js

2.修改search.py ,添加ensure_ascii=False 禁止将中文字符串转为ascii编码,修改完之后,使用python -m py_compile search.py 命令编译一下search文件,然后将新的search.pysearch.pyc(编译文件)替换掉旧的即可

vim /usr/local/lib/python2.7/site-packages/mkdocs/search.py

修改如下一行为:

 return json.dumps(page_dicts, sort_keys=True,ensure_ascii=False, indent=4)

 

 

P.s Linx下如果遇到忘记命令怎么使用或者不熟悉的情况,学会使用 man 或者   –help   常常会用意外收获

安装redis-servier 与 phpredis,memcached安装与此类似

php使用redis服务需要安装redis服务端与phpredis扩展

一 . redis-server 的两种安装方式

  1. 使用yum install redis
  2. 从源码编译

1.1 直接使用yum 安装

yum install redis
service redis start

1.2 从源码编译安装

下载源码包  http://redis.io/download,解压缩后进入目录,redis-server的安装不需要执行./configure 和make install 命令只需要输入:

make

安装完成后输入 make test 测试,如果出现“Cleanup: may take some time… OK” 则安装成功,如果出错可能是未安装tcl依赖包,使用yum  或者从源码 ./configure make && make install。

二 . phpredis 扩展安装

phpredis 扩展安装也分为两种

  1. 使用php提供的pecl install redis 安装
  2. 从源码编译安装

2.1 使用php提供的pecl安装

/usr/local/php/bin/pecl install redis

安装完成后在php.ini 添加 extension = “redis.so”

2.2 从源码编译安装

首先下载phpredis源码包

wget https://github.com/nicolasff/phpredis/archive/master.zip
unzip master
cd phpredis-master/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
vi /usr/local/php/etc/php.ini
增加:extension = "redis.so"

如果运行phpize出错查看openssl目录下有个config.w32和config0.m4,把config0.m4改名为config.m4。完成后使用phpinfo();查看phpredis是否安装成功

使用redis

        // $_rd = new Memcached(); //使用memcached
        // $_rd->addServer('127.0.0.1', 11211);
        $_rd = new Redis();
        $_rd->connect('127.0.0.1', 6379);
        $_rd->set('key', 'hello', 60);
        echo $_rd->get('key');