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

 

使用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');

编译安装php5.6或php7

下载源码

php官网下载地址

安装php依赖包

#Centos
yum install libjpeg libjpeg-devel libpng libpng-devel curl autoconf automake libtool re2c flex bison libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl curl-devel freetype freetype-devel libmcrypt libmcrypt-devel libXpm* freetype* libjpeg* libpng*
#ubuntu
apt-get install gcc libxml2-dev make automake autoconf libtool bison flex libbz2-dev  curl libcurl4-gnutls-dev libjpeg-dev libpng-dev libtool-bin libcurl3-dev libmcrypt-dev libmysql++-dev libxslt1-dev

开始编译

./configure --prefix=/work/app/php5.6  --with-config-file-path=/work/app/php5.6  --with-mysql  --with-pdo-mysql --enable-mysqlnd --with-mysqli --enable-dba --with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm --enable-zip --with-zlib --with-bz2 --with-mcrypt --enable-pcntl --enable-mbstring --enable-bcmath --enable-xml --with-mhash --with-xsl --with-gettext --with-gd --with-png-dir  --with-freetype-dir  --with-jpeg-dir --with-xpm-dir --with-pear --enable-opcache --enable-sockets  --with-xmlrpc --enable-soap --with-curl  --with-openssl
 
#mysql与数据库
--with-mysql  --with-pdo-mysql --enable-mysqlnd --with-mysqli --enable-dba

#fpm
--with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm

#文件与字符串数字数组处理
--enable-zip
--with-zlib
--with-bz2 
--with-mcrypt
--enable-pcntl
--enable-mbstring
--enable-bcmath
--enable-xml
--with-mhash
--with-xsl
--with-gettext

#图片处理
--with-gd
--with-png-dir 
--with-freetype-dir 
--with-jpeg-dir 
--with-xpm-dir

#其他
--with-pear
--enable-opcache
--enable-sockets  
--with-xmlrpc

#加密与请求
--enable-soap   #xml通信协议
--with-curl 
--with-openssl

ubuntu上curl依赖安装后还是提示安装,此时可能需要手动创建一个软连接

#ubuntu
cd /usr/include
sudo ln -s x86_64-linux-gnu/curl

php7或者低版本php编译可能会遇到openssl相关错误,处理方式为编译openssl并手动指定目录,注意在编译的时候其实无需替换系统openssl,流程如下

#主要命令
wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
tar zxvf openssl-1.1.0g.tar.gz
cd openssl-1.1.0g
./config --prefix=/work/app/openssl shared
make && make install
#只为编译php不用替换系统的openssl,只需要--with-openssl=/work/app/openssl

其中实测php5.6.0和以下版本需要使用低版本的openssl(openssl-1.0.2.tar.gz)

执行make

# make && make install  //开始编译,如果编译失败使用 make clean,然后再重新编译
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod u+x /etc/init.d/php-fpm

配置

#修改php-fpm的配置文件,位于/work/app/php5.6/etc
mv php-fpm.conf.default  php-fpm.conf
#修改php.ini ,取消date.timezone 注释,并修改为
date.timezone = PRC

启动

systemctl enable php-fpm.service
systemctl start php-fpm.service

安装或编译php扩展

有两种方式可以安装php扩展,第一种是使用pecl install xxx 的方式, 第二种是下载扩展源码然后通知执行phpize后比编译获得.so文件

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

vim php.ini
extension = "gettext.so"