Ubuntu下Aria2搭建下载机:Aria2图形管理

Aria2作为一款Linux下的下载神器,很多极客都在使用,可以下载http资源、种子文件、磁力链接等,功能强大,而且整合Chrome插件可以摆脱百度云盘的速度限制。

  • 高速,自动多线程下载;
  • 断点续传;
  • 轻量占用内存非常少,通常情况平均4~9MB内存占用(官方介绍);
  • 多平台。支援 Win/Linux/OSX/Android 等操作系统下的部署;
  • 模块化。分段下载引擎,文件整合速度快;
  • 支持RPC界面远程;
  • 全面支持BitTorrent协议;

Aria2官方项目页面:https://aria2.github.io/

下面介绍Aria2在Ubuntu的搭建方法

1. 搭建Aria2

wget https://github.com/aria2/aria2/releases/download/release-1.22.0/aria2-1.22.0.tar.gz
tar xzvf aria2-1.22.0.tar.gz
cd aria2-1.22.0
./configure
make
make install
man aria2c // 查看aria2c manual

2. 配置Aria2

创建配置文件 参考文档:https://aria2c.com/usage.html

mkdir /etc/aria2/
vim /etc/aria2/aria2.conf
直接进行下一步,不要填写,博主会提供一个配置文件下载
:wq!  //保存

下载博主配置好的conf文件:https://www.buguai.cc/wp-content/uploads/2017/07/aria2.zip

再使用SFTP客户端连接服务器,传到/etc/aria2 文件夹下替换即可。

3. 命令直接调用

直接在命令行下载

aria2c "download.url"

下载完成后自动退出,就和wget 的工作方式一样。

4. RPC Server模式(推荐)

aria2c --conf-path=

Aria2作为后台常驻程序,监测rpc端口的活动情况,添加并下载文件。完成后继续在后台运行。

涉及到命令输入,力求简化,第二种模式明显更省事。

5. 启动Aria2 RPC模式

命令行启动

aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all -c  --dir /root/downloads -D (-D daemon模式,用于后台执行)
##开始监听RPC

命令行的模式无疑使用有些麻烦,而且SSH客户端不可能我们一直连接着,我们需要一个WebUI管理监测。

推荐两个:Aria2 Web UI或者YAAW。

Web UI是MD界面的,界面好看,但是因为未知原因博主未能成功使用,所以转而使用YAAW,YAAW相对更简单,基本功能都有,例如添加任务、设置下载目录、设置下载客户端UA、删除、暂停等。

未分类

6. webui-aria2

git clone https://github.com/ziahamza/webui-aria2

如果你不想搭建可使用https://ziahamza.github.io/webui-aria2/,配置数据是存在本地浏览器的,不需要注册。

注意:需要根据情况设置一下Aria2 RPC的地址,一般为Aria2后台进程运行的ip:port,例如192.168.119.100:6800。

YAAW

git clone https://github.com/binux/yaaw

YAAW也有线版本

https://aria2c.com/
https://binux.github.io/yaaw/demo/

注意:需要根据情况设置一下Aria2 RPC的地址,一般为Aria2后台进程运行的ip:port,例如192.168.119.100:6800。

其他版本:方便我们使用Aria2

7. Windows下图形版本

Aria2c Remote Control

https://sourceforge.net/projects/aria2cremote/

8. 给jsonrpc加上验证

使用token验证(建议使用)
需要1.18.4以上版本,帐号密码方式将在后续版本中停用!

配置文件

# token验证
rpc-secret=secret

命令行

使用--rpc-secret=xxxxxx选项

启用验证后,使用https://token:secret@hostname:port/jsonrpc的地址格式设置secret。

使用密码验证

需要1.15.2以上,1.18.6以下版本
1.18.4新增了--rpc-secret ,设置的RPC授权令牌, 取代--rpc-user--rpc-passwd选项

配置文件

#用户名
rpc-user=username
#密码
rpc-passwd=passwd

命令行

使用 --rpc-user=user --rpc-passwd=pwd 选项

启用验证后,使用https://username:passwd@hostname:port/jsonrpc的地址格式设置密码。

对于RPC模式来说, 界面和后端是分离的, 只要给后端设置密码即可. 前端认证什么的是毫无意义的。

9. 其它相关

YAAW搭配脚本

迅雷离线(需会员账号)

Chrome Extension: ThunderLixianAssistant
UserScript: ThunderLixianExporter

旋风离线

UserScript: XuanFengEx
UserScript: LixianExporter

百度网盘

Chrome Extension: BaiduExporter
Firefox Addons: BaiduExporter
UserScript: BaiduPanDownloadHelper

115网盘

Chrome Extension: 115exporter

其他脚本

Chrome Extension

添加到aria2

Chrome Download Helper

在阿里云上Ubuntu环境通过nginx+uwsgi部署Django项目

年前阿里云打折,1核1G的云服务器一年只要300多块,果断就租了1年的。既然服务器已经到手,怎么能不把自己写的项目部署上去呢,其实网上关于nginx+uwsgi部署Django项目的文章有很多,但是这些文章要不就是很久之前的,要不就是互相抄袭,一路过来都是坑,这里重点吧在部署时候遇到的坑着重介绍一下:

1. 首先部署django项目

首先是django项目,由于我是使用Anaconda来进行版本控制的,而django项目是在Python2.7环境下开发的,首先是新建一个Python2.7的环境:

#创建python27环境
conda create --name python27 python=2.7
#激活该环境
source activate python27
#通过conda安装django
conda install django

环境准备好后,从GitHub上将项目拉取下来

git clone https://github.com/sunny0826/xxx

修改setting.py文件

#debug模式默认开启,这里要关闭
DEBUG = False
#这里将外网IP配置进来
ALLOWED_HOSTS = ['127.0.0.1','xx.xx.xx.xx']

启动项目:

#来项目目录下执行
python manage.py runserver 8000

然后在外网ip:8000路径下查看项目启动情况

2. 阿里云配置安全组

由于是服务器在阿里云上,所以直接访问时访问不到的,所以要在阿里云平台配置安全组(类似于防火墙)

首先打开阿里云平台,登录,点击安全组配置:

未分类

点击配置规则

未分类

点击添加安全组规则

未分类

按要求填写安全组规则

未分类

优先级1位最高优先级,端口可以设置范围,并且可以设置授权访问的对象
设置完之后,就可以在公网IP访问到我们的django项目了

3. 安装配置uwsgi

确定django项目可以正常运行了,ctrl+c停止项目,下面我们来安装uwsgi:
在安装uwsgi非常简单,只需要pip安装即可,但是由于之前使用的是Python27环境,这里记得要激活Python27环境,否则就安装到默认的Python路径了

#uWSGI 是一个(巨大的) C 应用,所以你需要一个 C 编译器(比如 gcc 或者 clang)和 Python 开发版头文件
apt-get install build-essential python-dev
#安装uwsgi
pip install uwsgi

按照官网介绍,写已经Python脚本进行测试,test.py(在任意路径都可以,不过测完要记得删掉)

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

然后输入命令进行测试

uwsgi --http :8000 --wsgi-file test.py

这里是8000端口,因为之前测试django的时候打开的8000端口,这里偷懒就不去配置新的安全组了
那么问题就来了,在启动的时候报错了….=。=

未分类

出现的这个错误,经过测试只会在Python2.7的环境发生,在Python3+就没有发生了,辗转百度和Google,都没有找到这个问题的解决办法且这个问题一般发生在nginx上…
但这个报错问题还是很明显,就是libpcre.so.1这个文件找不到,初步推测为版本问题
首先要咱们搜索一下这个文件,看看本机有没有

未分类

发现本机是有这个文件的,那就好办了,将他链接到相应位置就好

未分类

执行这条语句之后就可以uwsgi就可以正常启动了

在跳过这个坑之后,就可以正式来配置我们的项目了
首先修改自己项目中的wsgi.py文件,添加两行代码

未分类

然后在django项目根目录创建uwsgi.ini文件

uwsgi.ini文件配置

# uwsgi.ini file
[uwsgi]

# Django-related settings

socket = 127.0.0.1:8000            #与nginx通信的地址和端口

# the base directory (full path)
chdir           = /apps/xxxx        #django项目绝对路径

# Django s wsgi file
module          = xxxx.wsgi    #wsgi文件所在的相对于项目的路径

# the virtualenv (full path)
home            =  /root/anaconda3/envs/python27/lib/python2.7/site-packages        #python环境的路径

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

plugins=python
#log文件
daemonize=/apps/uwsgi/uwsgi.log
#pid文件
pidfile=/apps/uwsgi/uwsgi.pid

这里配置日志文件和pid文件,方便之后的重启

关于uwsgi的重启问题:

每次项目有代码更新的话,都需要重启uwsgi,如果没有配置pid文件的话,重启需要使用:

#查看uwsgi进程号
ps aux | grep uwsgi
#关闭进程号为0的进程
kill -9 主进程号

未分类

来停止uwsgi,然后才能重启,注意这里的主进程是pid为1的进程,而配置了pid文件的,只需要进行如下方法来重启即可

#重载(一般修改参数,或者修改py文件经常用到)
uwsgi --reload uwsgi.pid
#重启(一般系统环境变化会用到)
uwsgi --stop uwsgi.pid

最后在项目根目录下运行uwsgi命令,载入配置文件

uwsgi --ini uwsgi.ini

然后在后面的日志中要注意环境是否为之前配置,如果不是请激活激活之前创建的Python环境再进行操作

4. 安装配置nginx

最后来安装nginx

sudo apt-get install nginx

修改nginx配置

cd /etc/nginx/sites-enabled    #Ubuntu中nginx配置文件所在路径
vim default

配置文件

server {
        listen 80 default_server;            #监听端口,将来访问的端口
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;


        server_name _;

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;    #uwsgi中配置的路径
        }

        location /static {
                alias /apps/xxx/static;       #静态资源路径
        }

        location /resume.ico  {
                alias /apps/xxx/static/resume.ico;    #网页图标路径
        }
}

uwsgi启动后,再启动nginx

基础命令

/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启

启动之后,访问外网IP:80,查看是否可以通过nginx访问django

在 CentOS 7 平台使用 cnpmjs.org 搭建 npm 私有仓储

一、安装系统并配置编译环境

1、下载 CentOS 7 系统镜像并安装,选择基本开发环境。

2、修改默认 yum 源为阿里云源,并添加 EPEL 源。

# 如提示 wget 不存在,可使用 curl 下载
# 备份默认源
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 修改为阿里源
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 添加 EPEL 源
sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

3、安装 gcc 编译环境

sudo yum install gcc-c++ make

4、验证安装结果

# 验证 g++ 版本
g++ -v

使用内建 specs。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)

# 验证 make 版本
make -v

GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

二、监测环境并安装 node.js

1、执行环境检测脚本,下载 node 在相应环境的已编译包

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

2、安装 node 和 npm

sudo yum -y install nodejs

3、验证安装结果

# 验证 node 版本
node -v
v8.9.4

# 验证 npm 版本
npm -v
5.6.0

三、安装并配置 cnpmjs.org

1、安装 cnpmjs.org依赖

# 安装 cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 安装 node-pre-gyp
cnpm install -g node-pre-gyp
# 安装 sqlite3 直接安装会报错 node-pre-gyp: 未找到命令
cnpm install -g sqlite3
# 安装 cnpmjs.org
cnpm install -g cnpmjs.org
# 创建配置目录 ~/.cnpmjs.org
cnpmjs.org start

2、验证安装结果

# 验证 cnpm 版本
cnpm -v

[email protected] (/usr/lib/node_modules/cnpm/lib/parse_argv.js)
[email protected] (/usr/lib/node_modules/cnpm/node_modules/npm/lib/npm.js)
[email protected] (/usr/bin/node)
[email protected] (/usr/lib/node_modules/cnpm/node_modules/npminstall/lib/index.js)
prefix=/usr 
linux x64 3.10.0-327.el7.x86_64 
registry=https://registry.npm.taobao.org

# 验证 node-pre-gyp 版本
node-pre-gyp -v
v0.6.39

# 验证 sqlite3 版本
sqlite3 -version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

# 验证 cnpmjs.org 版本
cnpmjs.org --version
2.19.4

3、添加防火墙例外

# 检查防火墙状态
systemctl status firewalld
# 启动防火墙,未启动会报错 FirewallD is not running
systemctl start firewalld
# 添加 7001 端口
firewall-cmd --zone=public --add-port=7001/tcp --permanent
# 添加 7002 端口
firewall-cmd --zone=public --add-port=7002/tcp --permanent
# 根据需要,关闭防火墙
systemctl stop firewalld

四、修改 cnpmjs.org 配置

1、修改 /root/.cnpmjs.org/config.json (实际使用中必须删除注释,否则 json 格式错误)

{
  "registryPort": 7001, // cnpmjs.org web 站点端口
  "webPort": 7002, // cnpmjs.org register 端口
  "bindingHost": "0.0.0.0", // 允许外部访问
  "handleSyncRegistry": "http://127.0.0.1:7001", // 同步源
  "registryHost": "registry.npm.xxxxxx.work", // cnpmjs.org register 域名
  "scopes": [
    "@xxxxxx" // 私有包 scope 名称
  ],
  "enablePrivate": false, // 允许所有登录用户发布私有包
  "syncModel": "none", // 不同步公共包
  "alwaysAuth": false, // 不强制用户认证
  "customReadmeFile": "/root/.cnpmjs.org/docs/web/readme.md", // 自定义首页
  "userService": "/root/.cnpmjs.org/services/custom_user_service.js", // 自定义用户认证
  "admins": {
    "admin": "[email protected]" // cnpmjs.org 管理员
  },
  "database": { // cnpmjs.org 数据库
    "db": "cnpmjs_test", // 数据库名称
    "username": "root", // 数据库用户名
    "password": "", // 数据库密码
    "dialect": "sqlite", // 数据库类型
    "host": "127.0.0.1", // 数据库 IP
    "port": 3306, // 数据库端口
    "storage": "/root/.cnpmjs.org/data.sqlite" // sqlite 数据库位置
  }
}

2、修改 cnpmjs.org 源码
/usr/lib/node_modules/cnpmjs.org/services/user.js

11 +  if(typeof(config.userService) === 'string') {
12 +    var CustomUserService = require(config.userService);
13 +    config.userService = new CustomUserService();
14 +  }

3、自定义首页 /root/.cnpmjs.org/docs/web/readme.md

# 公司 npm 私有仓储

[npm.xxxxxx.work](http://npm.xxxxxx.work) 基于 [cnpmjs.org](https://github.com/cnpm/cnpmjs.org) 搭建,使用 @xxxxxx 作为私有仓储的 [scope](https://docs.npmjs.com/getting-start)  
仅用于托管公司私有包,不同步公共包,可使用 npm 或 cnpm 客户端。  

## npm 或 cnpm 客户端配置

1. 拦截 @xxxxxx 作用域下所有操作至私有仓储,可安装公司私有包。  
``bash
# 或替换为 cnpm 命令
$ npm config set @xxxxxx:registry http://registry.npm.xxxxxx.work
``

2. 使用 [git.xxxxxx.work](http://git.xxxxxx.work) 用户名和[个人访问令牌](http://git.xxxxxx.work/profile/personal_access_tokens)登录,可发布公司私有包。  
``bash
# 或替换为 cnpm 命令
$ npm login --scope=@xxxxxx --registry=http://registry.npm.xxxxxx.work

Username: zhangsan # 用户名
Password: xxxxxxxxxxxxxxxxxxxx # 个人访问令牌(需勾选 Scopes 中 api 选项)
Email: (this IS public) [email protected] # 邮箱
``

## 更多信息请查看[使用说明](http://xxxxxx.wiki/pages/viewpage.action?pageId=8524381)

**此处粘贴 /usr/lib/node_modules/cnpmjs.org/docs/web/readme.md 文件内容**

4、自定义用户认证 /root/.cnpmjs.org/services/custom_user_service.js

const http = require('http');
const isAdmin = require('cnpmjs.org/lib/common').isAdmin;
const config = require('cnpmjs.org/config');

// User: https://github.com/cnpm/cnpmjs.org/wiki/Use-Your-Own-User-Authorization#user-data-structure
// {
//   "login": "fengmk2",
//   "email": "[email protected]",
//   "name": "Yuan Feng",
//   "html_url": "http://fengmk2.github.com",
//   "avatar_url": "https://avatars3.githubusercontent.com/u/156269?s=460",
//   "im_url": "",
//   "site_admin": false,
//   "scopes": ["@org1", "@org2"]
// }

const emailDomain = '@xxxx.com';
const defaultToken = 'xxxxxxxxxxxxxxxxxxxx';

function convertToUser(gitUser) {
  let user = {
    login: gitUser.username,
    email: gitUser.email || `${gitUser.username}${emailDomain}`,
    name: gitUser.name,
    html_url: gitUser.web_url,
    avatar_url: gitUser.avatar_url,
    im_url: '',
    site_admin: isAdmin(gitUser.username),
    scopes: config.scopes,
  };

  return user;
}

function gitHttp(api, token) {
  return new Promise((resolve, reject) => {
    let options = {
      method: 'GET',
      port: 80,
      hostname: 'git.xxxxxx.work',
      path: `/api/v4${api}`,
      headers: {
        'PRIVATE-TOKEN': token
      }
    };

    let req = http.request(options, (res) => {
      if (res.statusCode === 200) {
        res.setEncoding('utf8');

        let rawData = '';
        res.on('data', (chunk) =&gt; {
          rawData += chunk;
        });

        res.on('end', () => {
          try {
            let parsedData = JSON.parse(rawData);
            console.log(`[CustomUserService] [${api}] [${token}] JSON.parse: success`, parsedData);

            resolve(parsedData);
          } catch (e) {
            reject(`[CustomUserService] [${api}] [${token}] JSON.parse: ${e.message}`, e);
          }
        });
      }
      else {
        reject(`[CustomUserService] [${api}] [${token}] statusCode: ${res.statusCode}`);
      }
    });

    req.on('error', (e) => {
      reject(`[CustomUserService] [${api}] [${token}] error: ${e.message}`, e);
    });

    req.end();
  });
}

function* gitAuth(username, token) {
  let data = yield gitHttp('/user', token);

  let gitUser = null;
  if (data && data.username === username) {
    gitUser = data;
  }

  return gitUser;
}

function* gitGet(username) {
  let data = yield gitHttp(`/users?username=${encodeURIComponent(username)}`, defaultToken);

  let gitUser = null;
  if (data && data.length > 0 && data[0].username === username) {
    gitUser = data[0];
  }

  return gitUser;
}

function* gitList(usernames) {
  let gitUsers = [];

  if (usernames && usernames.length > 0) {
    for (let i = 0; i < usernames.length; i++) {
      let username = usernames[i];
      let gitUser = yield gitGet(username);
      if (gitUser) {
        gitUsers.push(gitUser);
      }
    }
  }

  return gitUsers;
}

function* gitSearch(query, limit) {
  let data = yield gitHttp(`/users?search=${encodeURIComponent(query)}&per_page=${limit}`, defaultToken);

  let gitUsers = [];
  if (data && data.length > 0) {
    gitUsers = data;
  }

  return gitUsers;
}

function CustomUserService() { }
const proto = CustomUserService.prototype;

/**
 * Auth user with login name and password
 * @param  {String} login    login name
 * @param  {String} password login password
 * @return {User}
 */
proto.auth = function* (login, password) {
  console.log(`[CustomUserService] [auth]`, login, password);

  let user = null;

  try {
    let gitUser = yield gitAuth(login, password);

    if (gitUser) {
      user = convertToUser(gitUser);
    }
  }
  catch (e) {
    console.log(`[CustomUserService] [auth]`, e);
  }

  return user;
};

/**
 * Get user by login name
 * @param  {String} login  login name
 * @return {User}
 */
proto.get = function* (login) {
  console.log(`[CustomUserService] [get]`, login);

  let user = null;

  try {
    let gitUser = yield gitGet(login);

    if (gitUser) {
      user = convertToUser(gitUser);
    }
  }
  catch (e) {
    console.log(`[CustomUserService] [get]`, e);
  }

  return user;
};

/**
 * List users
 * @param  {Array<String>} logins  login names
 * @return {Array<User>}
 */
proto.list = function* (logins) {
  console.log(`[CustomUserService] [list]`, logins);

  let users = [];

  try {
    let gitUsers = yield gitList(logins);

    gitUsers.forEach((gitUser) => {
      users.push(convertToUser(gitUser));
    });
  }
  catch (e) {
    console.log(`[CustomUserService] [list]`, e);
  }

  return users;
};

/**
 * Search users
 * @param  {String} query  query keyword
 * @param  {Object} [options] optional query params
 *  - {Number} limit match users count, default is `20`
 * @return {Array<User>}
 */
proto.search = function* (query, options) {
  console.log(`[CustomUserService] [search]`, query, options);

  let users = [];

  try {
    options = options || {};
    options.limit = parseInt(options.limit);
    if (!options.limit || options.limit < 0) {
      options.limit = 20;
    }

    let gitUsers = yield gitSearch(query, options.limit);

    gitUsers.forEach((gitUser) => {
      users.push(convertToUser(gitUser));
    });
  }
  catch (e) {
    console.log(`[CustomUserService] [search]`, e);
  }

  return users;
};

module.exports = CustomUserService;

5、验证自定义配置

export NODE_PATH=/usr/lib/node_modules && /usr/bin/cnpmjs.org start

Starting cnpmjs.org ...
cluster: false
admins: {"admin":"[email protected]"}
scopes: ["@xxxxxx"]
sourceNpmRegistry: https://registry.npm.taobao.org
syncModel: none
[Tue Mar 06 2018 17:05:20 GMT+0800 (CST)] [worker:8004] Server started, registry server listen at 0.0.0.0:7001, web listen at 0.0.0.0:7002, cluster: false

五、开机启动 cnpmjs.org 并配置域名和定期备份

1、创建服务并开机自启 /usr/lib/systemd/system/cnpmjs.org.service

[Unit]
Description=cnpmjs.org
After=network.target

[Service]
Type=simple
User=root
Environment=NODE_PATH=/usr/lib/node_modules
ExecStart=/usr/bin/cnpmjs.org start
ExecStop=/usr/bin/cnpmjs.org stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

2、应用并启动 cnpmjs.org 服务

# 刷新服务守护进程
systemctl daemon-reload
# 启动 cnpmjs.org 服务
systemctl start cnpmjs.org.service
# 设置开机启动
systemctl enable cnpmjs.org.service
# 查看启动日志
journalctl -u cnpmjs.org.service

3、配置 nginx 反向代理

# cnpmjs.org registry
server {
    listen       80;
    server_name  registry.npm.xxxxxx.work;
    location / {
        #proxy_redirect off;
        proxy_pass http://192.168.21.23:7001;
    }
}

# cnpmjs.org web
server {
    listen       80;
    server_name  npm.xxxxxx.work;
    location / {
        #proxy_redirect off;
        proxy_pass http://192.168.21.23:7002;
    }
}

4、验证域名配置

curl npm.xxxxxx.work
curl registry.npm.xxxxxx.work

5、创建备份脚本 /root/.cnpmjs.org/backup/backup.sh
由于 cnpmjs.org 使用文件方式存放已发布的包,因此只用备份 sqlite 数据库即可。

#!/bin/sh

# 当前时间
var_dateTime=$(date +%Y%m%d%H%M)
# cnpmjs.org 配置目录
var_workDir="/root/.cnpmjs.org"
# 备份目录
var_backupDir=${var_workDir}"/backup/"${var_dateTime}
# 创建备份目录
mkdir -p ${var_backupDir}
# 数据库源位置
var_dataSource=${var_workDir}"/data.sqlite"
# 数据库目标位置
var_dataTarget=${var_backupDir}"/data.sqlite"
# 备份数据库
sqlite3 ${var_dataSource} ".backup ${var_dataTarget}"

6、验证备份脚本

# 修改备份脚本执行权限
chmod a+x /root/.cnpmjs.org/backup/backup.sh

# 执行备份脚本
/root/.cnpmjs.org/backup/backup.sh

# 检查是否已经生成备份
ls -l /root/.cnpmjs.org/backup/

7、配置定时任务

# 编辑定时任务文件 /var/spool/cron/root
crontab -e

# 每周日 00:00 执行备份
0 0 * * 0 /root/.cnpmjs.org/backup/backup.sh

# 如果未正常进行,检查以下文件
cat /var/log/cron
cat /var/spool/mail/root

六、【非服务端】npm 或 cnpm 客户端配置

1、拦截 @xxxxxx 作用域下所有操作至私有仓储,可安装公司私有包。

# 或替换为 cnpm 命令
npm config set @xxxxxx:registry http://registry.npm.xxxxxx.work

2、使用 git.xxxxxx.work 用户名和个人访问令牌登录,可发布公司私有包。

# 或替换为 cnpm 命令
npm login --scope=@xxxxxx --registry=http://registry.npm.xxxxxx.work

Username: zhangsan # 用户名
Password: xxxxxxxxxxxxxxxxxxxx # 个人访问令牌(需勾选 Scopes 中 api 选项)
Email: (this IS public) [email protected] # 邮箱

nginx+uwsgi在centos上部署Django应用

背景介绍:

之前做完一个Django项目,打算部署在自己的centos服务器上,可以远程访问,于是命令行上输入

python manage.py runserver 0:8000

就成功运行了,可惜,django自带的web服务器并不稳定,经常无缘无故断掉,于是想到

使用主流的uwsgi+nginx来部署项目,

至于Nginx+uWSGI+Django原理可参考http://www.cnblogs.com/Xjng/p/aa4dd23918359c6414d54e4b972e9081.html

此处就不赘述了,下面介绍下具体部署步骤

1. 安装uwsgi

pip install uwsgi

此时可以尝试使用uwsgi来启动应用,其中wsgi.py在mysite文件夹下

uwsgi --http :8000 --module mysite.wsgi

在浏览其中输入127.0.0.1:8080 能够成功访问,说明你的应用服务器部署成功,已经可以对外提供服务。

2. 安装nginx

yum install nginx

在/etc/nginx/conf.d文件夹下新建nginx启动的配置文件mysite.conf,输入以下信息

server {
  listen 8000;  #启动的nginx进程监听请求的端口
  server_name localhost;   #域名
  location / {
    include /etc/nginx/uwsgi_params;
    uwsgi_pass 127.0.0.1:8001;  #对于动态请求,转发到本机的8001端口,也就是uwsgi监听的端口
  }

  location /static/ {
    alias /home/Maximum/vacancy/static/;    #设定静态文件所在目录
  }
}

3. 同步静态文件到nginx设置的目录下

在django项目setting.py中增加

BASE_DIR = os.path.dirname(__file__)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'..','vacancy','static')
然后在命令行行下执行

python manage.py collectstatic

4. 配置uwsgi

项目根目录下创建uwsgi.ini文件

vi uwsgi.ini
uwsgi.ini内容

[uwsgi]
# Django's wsgi file
module = mysite.wsgi
pythonpath = /usr/local/lib/python3.5/site-packages
socket = 127.0.0.1:8001
pidfile = /home/Maximum/uwsgi.pid    
daemonize = /home/Maximum/uwsgi.log

介绍下uwsgi和nginx相关命令

启动uwsgi:uwsgi --ini uwsgi.ini
停止uwsgi:uwsgi --stop uwsgi.pid
重新加载配置:uwsgi --reload uwsgi.pid
启动nginx:service nginx start
停止nginx:service nginx stop
重启nginx:service nginx restart

接下来启动uwsgi:

uwsgi --ini uwsgi.ini

启动nginx

service nginx start

此时没问题的话就大功告成了,访问173.199.118.8:8000/vacancies即可看到我们运行的项目了

遇到的坑

1、启动nginx时出现以下错误,可知端口已被占用

[gaarai@linode /etc/nginx]$ service nginx restart
 * Restarting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

解决方法:

netstat -ntpl

查看当前运行的端口以及程序,内容类似如下:

[root@vultr mysite]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1502/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      461/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      677/master
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      1502/nginx: master
tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN      1475/uwsgi
tcp6       0      0 :::3306                 :::*                    LIS

将使用进程端口80,8000,8001的进程PID关闭,uwsgi的进程需要强制关闭

[root@vultr mysite]# kill -9 1475
[root@vultr mysite]# kill 1502

重新启动uwsgi和nginx

[root@vultr mysite]# uwsgi --ini uwsgi.ini
[root@vultr mysite]# service nginx start

2、访问网站出现Internal Server Error错误

查看uwsgi.log日志文件

tail -30 uwsgi.log

日志里出现

unable to load app 0 (mountpoint='') (callable not found or import error)

错误,

尝试执行

uwsgi --http :8000 --module mysite.wsgi

访问173.199.118.8:8000/vacancies运行正常,可知是uwsgi.ini配置文件有误

参考链接Setting up django with uwsgi and nginx

解决办法:

修改uwsgi.ini文件为

[uwsgi]
# Django's wsgi file
module = mysite.wsgi
pythonpath = /usr/local/lib/python3.5/site-packages
socket = 127.0.0.1:8001
pidfile = /home/Maximum/uwsgi.pid    
daemonize = /home/Maximum/uwsgi.log

之前有一些不太懂的设置加了上去,运行错误,去掉之后重启uwsgi和nginx服务即运行正常,

果然自己不太懂的设置还是不能乱加

以上就是

CentOS 7下安装pptp服务端手记

环境,初装的阿里云ECS最低配机型,CentOS 7 x64 (兼及linode的CentOS 7)

主要配置步骤

1. 安装前检查系统支持

a. 在安装之前查看系统是否支持PPTP

modprobe ppp-compress-18 && echo success

应该输出:success

yum install kernel-devel

b. 是否开启TUN/TAP

cat /dev/net/tun

应该输出:cat: /dev/net/tun: File descriptor in bad state

c. 是否开启ppp

cat /dev/ppp

应该输出:cat: /dev/ppp: No such device or address

如果环境不满足上面3个条件,表示很可能不支持pptp。 例外:linode的xen、kvm服务器,也是支持的pptp的。可能是linode内核是定制的,并不是外部ko模块,与原版CentOS表现有所不一致。

2. 安装必要包

a. 首先安装epel源

yum install epel-release

b. 安装pptp相关包

yum install ppp pptpd net-tools iptables-services

3. 修改相关配置文件

a. 主配置文件 /etc/pptpd.conf

结尾处增加如下两行,分别是pptp服务的虚拟网段网关,及分配给客户端的地址范围。

localip 192.168.9.1
remoteip 192.168.9.101-199

b. pptpd配置文件/etc/ppp/options.pptpd,结尾增加两行,给虚拟网段用的dns服务,可以使用主机商提供的dns服务器地址。

ms-dns 100.100.2.136
ms-dns 100.100.2.138

如果是linode等海外服务器,可以使用谷歌的公共dns服务器地址

ms-dns 8.8.8.8
ms-dns 8.8.4.4

c. 设置pptpd vpn服务器用户名密码,编辑文件 /etc/ppp/chap-secrets, 每行一套帐号,该文件默认有简短说明。一行帐号行示例如下,以空格分隔的4个字段:第1、3是用户名密码,其他两字段是星号

user1 * 111222333 *

d. 服务器允许ip转发内核,编辑配置文件/etc/sysctl.conf,增加如下一行

net.ipv4.ip_forward=1

4. 设置开机自动启动 pptpd, iptables

ln -s /usr/lib/systemd/system/pptpd.service /etc/systemd/system/multi-user.target.wants/
ln -s /usr/lib/systemd/system/iptables.service /etc/systemd/system/multi-user.target.wants

5. iptables配置网络

a. iptables配置,配置虚拟网段NAT支持。如果pptp客户端不需要上网,可以忽略本步骤。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

,注意其中的eth0是本机网卡设备名,按实际情况修改;或按虚拟网段设置NAT,如下

iptables -t nat -I POSTROUTING -s 192.168.9.0/24 -o eth0 -j MASQUERADE

b. 开放pptp端口1723,允许转发

iptables -I INPUT 7 -m state --state NEW -p tcp --dport 1723 -j ACCEPT
iptables -P FORWARD ACCEPT

c. 保存iptables规则

service iptables save

6. 阿里云ECS可能还需要几项特别设置

a. 如果windows下连接pptp,如果遇到519错误,是因为缺少内核模块 ip_nat_pptp ,运行modprobe ip_nat_pptp 即可加载,但最好设置开机自动加载:新建文件 /etc/modules-load.d/ip_nat_pptp.conf 内容为如下一行

ip_nat_pptp

b. 可能还要重建ppp文件:

rm /dev/ppp
mknod /dev/ppp c 108 0

c. 阿里云机器还要修改mtu:修改文件/etc/ppp/ip-up,在exit 0 前加入一行:

ifconfig $1 mtu 1500

d. 阿里云控制台里的安全区域,看上去跟防火墙或iptables类似的东西,要开启相应的端口。

7. 启动服务,加载相关匹配文件等

sysctl -p
systemctl start pptpd

或者单粗暴的reboot重启机器也行

CentOS 安装 node.js

centos 7 安装

  • centos 7 yum
yum install -y epel-release  
/usr/bin/yum install -y nodejs

centos 6安装

  • 由于yum源版本过低,cnpm安装失败,使用nvm管理node包的时候
yum remove nodejs -y  
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash  
  • 安装成功后:一定要重新启动shell
command -v nvm  
  • 查看nvm可安装版本
nvm ls-remote  
  • 安装nodejs
nvm install v6.12.3  

国内安装源

cnpm
/usr/bin/npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 配置文件 ~/.npmrc 文件中写入源地址
registry =https://registry.npm.taobao.org

Centos 7 Chrony 设置服务器集群系统时间同步

何为Chrony?

Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认服务,默认配置文件在 /etc/chrony.conf 它能保持系统时间与时间服务器(NTP)同步,让时间始终保持同步。相对于NTP时间同步软件,占据很大优势。其用法也很简单。

Chrony有两个核心组件,分别是:

chronyd:是守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。

chronyc:提供一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

OS环境:

  • 10.28.204.65 客户端
  • 10.28.204.66 服务端

  • CentOS Linux release 7.4.1708 (Core)

情况说明:两台机器都是内网,将204.66作为NTP时间服务器,204.65到此机器上同步时间。

1. 安装Chrony

系统默认已经安装,如未安装,请执行以下命令安装:

$ yum install chrony -y

2. 启动并加入开机自启动

$ systemctl enable chronyd.service
$ systemctl restart chronyd.service
$ systemctl status chronyd.service

3. Firewalld设置

$ firewall-cmd --add-service=ntp --permanent
$ firewall-cmd --reload
因NTP使用123/UDP端口协议,所以允许NTP服务即可。

4. 配置Chrony

以下是系统默认配置文件,我对此加以说明:

$ cat /etc/chrony.conf
# 使用pool.ntp.org项目中的公共服务器。以server开,理论上你想添加多少时间服务器都可以。
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

# 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。
driftfile /var/lib/chrony/drift

# chronyd根据需求减慢或加速时间调整,
# 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
# 该指令强制chronyd调整时期,大于某个阀值时步进调整系统时钟。
# 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
makestep 1.0 3

# 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
rtcsync

# Enable hardware timestamping on all interfaces that support it.
# 通过使用hwtimestamp指令启用硬件时间戳
#hwtimestamp eth0
#hwtimestamp eth1
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器
#allow 192.168.0.0/16
#deny 192.168/16

# Serve time even if not synchronized to a time source.
local stratum 10

# 指定包含NTP验证密钥的文件。
#keyfile /etc/chrony.keys

# 指定日志文件的目录。
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking

5. 设置时区

查看当前系统时区:

$ timedatectl
      Local time: Fri 2018-2-29 13:31:04 CST
  Universal time: Fri 2018-2-29 05:31:04 UTC
        RTC time: Fri 2018-2-29 08:17:20
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

如果你当前的时区不正确,请按照以下操作设置。

查看所有可用的时区:

$ timedatectl list-timezones

筛选式查看在亚洲S开的上海可用时区:

$ timedatectl list-timezones |  grep  -E "Asia/S.*"

Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk

设置当前系统为Asia/Shanghai上海时区:

$ timedatectl set-timezone Asia/Shanghai

设置完时区后,强制同步下系统时钟:

$ chronyc -a makestep
200 OK

6. 服务器集群之间的系统时间同步

在生产环境中,其网络都是内网结构,那么内网如何保证服务器之间的时间同步呢?其实这个问题很简单,只需要搭建一台内网时间服务器,然后让所有计算机都到服务端(10.28.204.66)去同步时间即可。

具体操作:在服务端注释以下内容:

#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

并添加以下内容:(表示与本机同步时间)

server 10.28.204.66 iburst

这样我们需求的一台内网时间服务器已经配置完毕。

同样在客户端注释掉其他server,并在客户端(10.28.204.65)添加以下:

server 10.28.204.66 iburst

到此已经完成系统时间的同步。如有多台机器,操作也是如此。

7. 常用命令

查看时间同步源:

$ chronyc sources -v

查看时间同步源状态:

$ chronyc sourcestats -v

设置硬件时间

硬件时间默认为UTC:

$ timedatectl set-local-rtc 1

启用NTP时间同步:

$ timedatectl set-ntp yes

校准时间服务器:

$ chronyc tracking

最后需要注意的是,配置完/etc/chrony.conf后,需重启chrony服务,否则可能会不生效。

Centos 下 安装 PHP + Nginx + Sql server

一、安装前必要配置

1.1 安装epel 仓库(因为CentOs6默认的yum源没有libmcrypt-devel这个包)

yum install -y epel-release

1.2 安装必要扩展

sudo yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel gcc libmcrypt-devel

二、安装PHP

2.1 下载PHP-7.1.15

wget -c http://cn2.php.net/get/php-7.1.15.tar.gz/from/this/mirror -O php-7.1.15.tar.gz

2.2 解压 php-7.1.15.tar.gz

tar -zxvf php-7.1.15.tar.gz

2.3 进入 php-7.1.15

cd php-7.1.15

2.4 .编译与安装

sudo make && make install

这里需要一点时间

2.4 .配置php-fpm

sudo cp php.ini-production /etc/php.ini
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod +x /etc/init.d/php-fpm

2.5 .启动php-fpm

···
/etc/init.d/php-fpm start

三、安装Nginx

3.1 下载Nginx

wget http://nginx.org/download/nginx-1.13.9.tar.gz

3.2 安装Nginx

tar -zxvf nginx-1.13.9.tar.gz

cd nginx-1.13.9

./configure --prefix=/usr/local/nginx

3.3 启动Nginx

sudo /usr/local/nginx/sbin/nginx 

sudo /usr/local/nginx/sbin/nginx -s reload

sudo /usr/local/nginx/sbin/nginx -s stop

四、安装FreeTDS

4.1 下载FreeTDS

wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

4.2 安装FreeTDS

需要注意的就是这里的–with-tdsver=7.1,这个非常重要

tar -zxvf freetds-0.91.tar.gz

cd freetds-0.91

./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib

make && make install

4.3 验证FreeTDS

/usr/local/freetds/bin/tsql -C

/usr/local/freetds/bin/tsql -H 数据库服务器IP -p 1433 -U 用户名 -P 密码

4.4 添加PHP扩展pdo_dblib

cd ../php-7.1.15/ext/pdo_dblib

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/

make && make install

4.5 在php.ini中增加pdo_dblib.so

extension ="pdo_dblib.so"

CentOS下使用speedtest.net测速

我们都知道windows下可以直接用浏览器访问www.speedtest.net来进行测速

但是我们从vps上怎么用呢 不要紧speedtest-cli来帮你忙

项目地址 https://github.com/sivel/speedtest-cli 有兴趣可以看一下

先来个一键脚本

wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --no-check-certificate
chmod +x speedtest-cli
./speedtest-cli

安装

1、下载安装

wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --no-check-certificate
chmod +x speedtest-cli

or

curl -Lo speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --no-check-certificate
chmod +x speedtest-cli

pip / easy_install

pip install speedtest-cli

or

easy_install speedtest-cli

Github

pip install git+https://github.com/sivel/speedtest-cli.git

or

git clone https://github.com/sivel/speedtest-cli.git
python speedtest-cli/setup.py install

下面来说使用 使用就更简单了 直接

./speedtest.py

speedtest-cli 会搜索距离你最近的服务器进行测试(物理距离最近)

结果如下 下行33Mbps 上行不到1Mbps

[root@MyServer ~]# ./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from CNISP-Union Technology (Beijing) Co. (42.51.16.74)...
Selecting best server based on latency...
Hosted by China unicom henan branch (Zhengzhou) [14.17 km]: 4.906 ms
Testing download speed........................................
Download: 33.41 Mbit/s
Testing upload speed..................................................
Upload: 0.77 Mbit/s

其实还有一些高级玩法

比如

speedtest-cli [-h] [--bytes] [--share] [--simple] [--list]
[--server SERVER] [--mini MINI] [--source SOURCE]
[--timeout TIMEOUT] [--secure] [--version]

-h, –help 显示帮助
–bytes 生成结果以字节显示(并不影响–share生成的图片)
–share 生成结果保存在speedtest服务器上并保存为图片链接

–simple 禁止详细输出,仅显示基本信息
–list 列出所有服务器ID
–server SERVER 指定一个服务器ID
–mini 指定你自己上传的speedtest mini客户端
–source SOURCE Source IP address to bind to
–timeout TIMEOUT HTTP timeout in seconds. Default 10
–secure Use HTTPS instead of HTTP when communicating with speedtest.net operated servers
–version Show the version number and exit

大多用到的功能就是 –server **** 和–share 了

服务器列表可以访问 https://www.speedtest.net/speedtest-servers-static.php

获取一下 Ctrl+F搜索你想测试的服务器吧 后面有个4位数的是ID

比如用郑州电信服务器测试 ID4595 并且生成图片

./speedtest-cli --server 4595 --share

结果如下

[root@MyServer ~]# ./speedtest-cli --server 4595 --share
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from CNISP-Union Technology (Beijing) Co. (42.51.16.74)...
Hosted by China Telecom HeNan Branch (Zhengzhou) [14.17 km]: 76.243 ms
Testing download speed........................................
Download: 33.25 Mbit/s
Testing upload speed..................................................
Upload: 0.69 Mbit/s
Share results: http://www.speedtest.net/result/5802066888.png

未分类

CentOS网络配置文件中UUID参数释疑

1、VMware中安装多台虚拟机的步骤

VMware中安装多台CentOS可参考如下步骤:

  • 先按照链接安装好CentOS,安装好后会得到一个目录,如下图所示。(注意:目录位置是自己设定的,NAT方式联网,采用dhcp自动获取IP地址)

未分类

  • 在CentOS关机状态下将CentOS 64位拷贝多份。

未分类

  • 在VMware平台界面点击文件—>打开—>转到CentOS 64 位(1)目录下—>选择扩展名为vmx的文件—>打开——>在VMware中运行该虚拟机——>弹出的窗口选择“我已复制该虚拟机”。

2、上述安装过程中存在的问题

A、复制的虚拟机能共存于同一个局域网?Mac地址是否会相同?IP地址会相同?

  • 能共存于同一局域网,Mac地址不同,IP地址不同。
  • 对于复制的虚拟机,在开机时,VMware自动为其分配了不同的Mac地址以及IP地址。

B、为什么拷贝的CentOS系统网络配置文件中的UUID与原系统相同?

  • UUID(Universally Unique Identifier)是系统层面的全局唯一标识符号,Mac地址以及IP地址是网络层面的标识号;
  • 两台不同的Linux系统拥有相同的UUID并不影响系统的使用以及系统之间的通信;

3、UUID号的修改方法

A、可输入如下命令获得新UUID号

[root@localhost ~]# uuidgen ens33
223bdb47-2fed-4773-b984-5f5733e61904

B、将获得的UUID号填入网络配置文件ifcfg-ens33

....
NAME=ens33
DEVICE=ens33
ONBOOT=yes
UUID=223bdb47-2fed-4773-b984-5f5733e61904

C、重启网络,验证新获得的UUID号

[root@localhost ~]# service network restart
Restarting network (via systemctl):  [  确定  ]
[root@localhost ~]# nmcli con | sed -n '1,2p'
名称   UUID                                  类型            设备  
ens33  223bdb47-2fed-4773-b984-5f5733e61904  802-3-ethernet  ens33 

参考:
https://www.jianshu.com/p/ccd40ffc0f7c