在使用Aliyun ECS中,关于pip的一些问题

Aliyun会对于你的ECS中的pip仓库进行手动配置,使其使用Aliyun官方的pip仓库,而其仓库并比不上官方的仓库的更新速度(在写下这篇记录时,pip已更新到18.0而阿里云官方的仍保持在8.0),这会导致相当多基于python的需要pip安装的软件在安装时出现报错,解决办法为删除 ~/.pip/pip.conf,令其使用官方仓库。

在迁移时发现的letsencrypt的认证问题

在通常情况下本站使用letsencrypt的自动部署脚本进行认证,但是在此次迁移中发现letsencrypt的认证出现了问题。
具体表现为在certbot对本站进行认证时,http://www.corpama.com/.well-known/achmeacme-challenge/**************************, 对该网址的认证出现404报错,无法访问该网址,最后可发现问题出在/etc/apache2/sites-availble/000-default.conf的配置上,该项虚拟主机的名称中,我将*替换为www.corpama.com, 结果出现了404报错,将其保持默认不变,便没再出现报错。这是一个典型的错误的配置办法,正确的配置办法为设置SeverName项。

pyhton之面向对象(class)

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
Python 区分面向对象和面向类
对象:根据模板创建的实例,通过实例对象可以执行类中的函数
类:就是一个模板,模板里可以包含多个函数,函数里实现一些功能 

#创建类
Class Foo:  #class是关键字(表示要开始创建类了);Foo是新建的类名称
Def bar(self):  #self特殊参数(必填)
pass 
Obj = Foo 

面向对象的三大特性是指:封装、继承和多态。

  • 封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
obj1 = Foo('chengd', 18) #此处的obj1就是self,“chengd”和“18”就是name和age属性
obj2 = Foo('python', 99) #此处的obj2就是self,“pyhton”和“99”就是name和age属性
调用被封装的内容时,有两种情况:
通过对象直接调用
class Foo:
   def __init__(self, name, age):
     self.name = name
     self.age = age
obj1 = Foo('chengd', 18)
Print (obj1.name)
Print (obj1.age)
通过self间接调用
class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
 
  def detail(self):
    print(self.name,self.age)  
obj1 = Foo('chengd', 18)
obj1.detail()  
# Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 chengd ;self.age 是 18
  • 继承

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法
 

class Animal:
     def eat(self):
         print ("%s 吃饭 " %self.name)
 
     def drink(self):
         print ("%s 喝奶 " %self.name)
  
      def shit(self):
          print ("%s 拉 " %self.name)
  
      def pee(self):
          print ("%s 撒" %self.name)
 
class Cat(Animal):
     def __init__(self, name):
         self.name = name
    def cry(self):
         print ('%s喵喵叫'%(self.name))
 
class Dog(Animal):
     
     def __init__(self, name):
          self.name = name       
     def cry(self):
         print ('%s汪汪叫'%(self.name))
文本内容主要转自:https://www.cnblogs.com/chengd/articles/7287528.html

关于在一些运行在Virtual Box中的稍旧版本的Cent OS与VB Tools的安装问题

稍旧版本的Centos7在安装VB Tools时会报错并提示安装kernel-devel

解决办法:
首先确保安装了gcc、make、perl:

yum install gcc make perl -y

其次在安装报错后更新一下系统中所有的软件:

yum upgrade -y

在更新了软件后重启就会发现问题神奇的解决了
PS:
报错信息大致如下:

This system is currently not set up to build kernel modules.
Please install the Linux kernel “header” files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
kernel-devel kernel-devel-3.10.0-693.11.1.el7.x86_64

Ubuntu_LAMP_NextCloud(普通版_Ver1.0)

Ubuntu 16.04 LTS部署基础LAMP及NextCloud 13.0.1

##1.LAMP部分
(一)安装语言编码冲突解决模块

apt install language-pack-en-base -y
locale-gen en_US.UTF-8

(二)添加ppa源,本次安装使用ppa方式

apt install -y software-properties-common
LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php

使用 apt-cache madison php 来查询php版本

apt install php=version
apt install php-fpm7.2

(三)安装apache2与相应连接模块

apt install -y apache2
apt install -y libapache2-mod-php7.2

(四)安装mysql-server及相应连接模块

apt install -y mysql-server (ubuntu在安装过程中便会出现root密码设置环节)
apt install -y libapache2-mod-auth-mysql php- mysql(如出现未找到包等报错,可略过)

(五)安装phpmyadmin,方便后续后台数据库管理

apt install -y phpmyadmin (安装过程中会出现选择,选apache2即可)

建议在LAMP安装完成后从let’s encrypt获取ssl证书来部署HTTPS

git clone https://github.com/letsencrypt/letsencrypt ,随后根据提示完成部署

至此,LAMP的基本安装完成

2.NextCloud部分

(一)从官网下载nextcloud项目包,并安装unzip以解压项目包

cd /var/www
apt install -y unzip
wget https://download.nextcloud.com/server/releases/nextcloud-13.0.1.zip
unzip nextcloud*.zip
chown -R www-data:www-data nextcloud/

(二)根据官网教程(English)更改相应的php模块设置与nextcloud的项目配置
官网配置教程:
https://docs.nextcloud.com/server/13/admin_manual/installation/source_installation.html#ubuntu-installation-label
完整安装nextcloud需要的所有php-moudle包:

apt install -y php-gd php-zip php-curl php-bz2 php-intl php-mcrypt openssl php-ldap php-smbclient php-imap php-gmp php-apcu php-memcached php-redis libcurl4-openssl-dev libssl-dev

创建/etc/apache2/sites-available/nextcloud.conf文件,并编辑:

(请参照官方教程)

使nextcloud.conf启用:

ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf

启用各个模块:

a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod setenvif

至此,NextCloud已可通过 www.corpama.com/nextcloud 进入,随后将完善nextcloud的安全与实用性配置
启用.htaccess文件,将此加入/nextcloud/config/config.php:

‘overwrite.cli.url’ => ‘https://example.org/nextcloud’,
‘htaccess.RewriteBase’ => ‘/nextcloud’,

随后完善HTTPS的安全设置,编辑/etc/apach2/sites-available/000-default-le-ssl.conf,在文件最后追加ifmoudle模块:


Header always set Strict-Transport-Security “max-age=15552000; includeSubDomains”

配置php.ini(在php-fpm之下)中的:
upload_max_filesize:
post_max_size:
memory_limit:
max_file_uploads =
注意:memory_limit > post_max_size > upload_max_filesize

参考:http://fjanchen.blogspot.com/2013/10/phpini.html

至此,nextcloud的所有安全性与实用性配置完成(最后可自行添加memcached完善性能)

openstack-nova

openstack–nova

一、在controller122节点上的操作

登录MySQL创建数据库,建立Nova用户并赋权。

mysql -u root -p
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;

#nova_api权限

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
 IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
 IDENTIFIED BY '000000';

#nova权限

GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
 IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
 IDENTIFIED BY '000000';

#nova_cell0权限

GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
 IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
 IDENTIFIED BY '000000';

4.命令. admin-openrc
5.#nova

openstack user create --domain default --password 000000 nova
openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute
openstack endpoint create --region RegionOne compute public http://controller122:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://controller122:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

#plancement

openstack user create --domain default --password 000000 placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "Placement API" placement
openstack endpoint create --region RegionOne placement public http://controller122:8780
openstack endpoint create --region RegionOne placement internal http://controller122:8780
openstack endpoint create --region RegionOne placement admin http://controller122:8780

6.安装Nova相关包

yum install openstack-nova-api openstack-nova-scheduler \
 openstack-nova-conductor openstack-nova-consoleauth \
 openstack-nova-novncproxy openstack-nova-placement-api \
 iptables

7.修改Nova服务的配置文件/etc/nova/nova.conf

[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:[email protected]
my_ip = 192.168.1.122 #controller122的IP
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api_database]
connection = mysql+pymysql://nova:[email protected]/nova_api
[database]
connection = mysql+pymysql://nova:[email protected]/nova
[api]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://controller122:5000
auth_url = http://controller122:35357
memcached_servers = controller122:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 000000
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
[glance]
api_servers = http://controller122:9292
[oslo_concurrency]
lock_path = /var/run/nova
[placement]
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller122:35357/v3
username = placement
password = 000000

8.添加信息到配置文件/etc/httpd/conf.d/00-nova-placement-api.conf

<Directory /usr/bin>
 <IfVersion >= 2.4>
 Require all granted
 </IfVersion>
 <IfVersion < 2.4>
 Order allow,deny
 Allow from all
 </IfVersion>
</Directory>

9.重启服务并验证

systemctl restart httpd
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
nova-manage cell_v2 list_cells
systemctl enable openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
二、在computer节点上的操作

1.下载Nova

yum install openstack-nova-compute

2.修改配置文件/etc/nova/nova.conf
快捷方式:传送controller122节点上的nova.conf文件
compute122节点上操作

1>scp [email protected]:/etc/nova/nova.conf /etc/nova/nova.conf
2>chown .nova /etc/nova/nova.conf

**注意:传送文件夹后openstack-nova-compute服务起不来有三种原因
1.查看防火墙是否关闭
2.主机名和域名一直,不要乱改域名
3.因为远程传送查看/etc/nova/nova.conf文件夹的权限
-rw-r—–. 1 root nova 990 May 9 19:18 nova.conf
所有者为:root 所属组:nova

openstack-glance

一、登录数据库建立glance数据库和glance用户并赋权

mysql -u root -p
MariaDB [(none)]> CREATE DATABASE keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';

KEYSTONE_DBPASS==000000
在这之前keystone最后两步创建admin-openrc、demo-openrc文件
vim admin-openrc

 export OS_PROJECT_DOMAIN_NAME=Default
 export OS_USER_DOMAIN_NAME=Default
 export OS_PROJECT_NAME=admin
 export OS_USERNAME=admin
 export OS_PASSWORD=000000
 export OS_AUTH_URL=http://controller122:5000/v3
 export OS_IDENTITY_API_VERSION=3
 export OS_IMAGE_API_VERSION=2

##controller == controller122
##ADMIN_PASS == 000000
vim demo-openrc

export OS_PROJECT_DOMAIN_NAME=Default
 export OS_USER_DOMAIN_NAME=Default
 export OS_PROJECT_NAME=demo
 export OS_USERNAME=demo
 export OS_PASSWORD=000000
 export OS_AUTH_URL=http://controller122:5000/v3
 export OS_IDENTITY_API_VERSION=3
 export OS_IMAGE_API_VERSION=2

##controller == controller122
##ADMIN_PASS == 000000

二、引入环境管理员环境变量

. admin-openrc

三、创建glance用户密码为000000

openstack user create –domain default –password 000000 glance
1.赋予glance用户admin角色加入service project

openstack role add --project service --user glance admin

2.创建名为glance的服务类型为image

openstack service create --name glance --description "OpenStack Image" image

3.创建image API接口

openstack endpoint create --region RegionOne image public http://controller122:9292
openstack endpoint create --region RegionOne image internal http://controller122:9292
openstack endpoint create --region RegionOne image admin http://controller122:9292

2.安装glance软件并配置相关文件

yum install openstack-glance -y

v2ray与openvpn配置过程中的心得与记录

v2ray与openvpn配置过程中的心得与记录:

1.关于v2ray之动态端口:

 经观察,v2ray的动态端口是十分有必要开启的.GFW对于单ip,单端口,同时未加入白名单的ip,将会进行重点探测,并进行限制.当然,越长时间的大流量使用单个ip更加容易造成GFW的”重点关照”,所以,这样看来,动态端口可以在一定的时间内另服务的ip的存活时间更长点,以下是v2ray白话文教程中对于动态端口的描述:

 通常情况下,V2Ray 的服务器端使用一个固定的端口来接收客户端的数据。这个端口由配置文件中的 port 属性指定如果同一端口通信时间过长,或流量过大,则有可能被服务商限速。于是V2Ray 提供了一个功能来动态调整通信端口。
 在新的配置中,V2Ray 服务器端依然使用一个主端口(即上文的 port)接收请求,但可以配置一个绕路(detour)的特性。配置之后,服务器会主动告诉客户端,使用一个新的端口 X 来通信,X 是一个范围(可配置)内随机选取的值。此端的有效期为 Y 分钟,客户端和服务器都会遵守这个时间,到期之后,客户端会继续向服务器请求新的端口来通信。以此循环。

 以下为corpama_HK服务器中v2ray配置的参照样例:
配置文件样例

2.关于v2ray与shadowsocks的性能比较:

 早在我的shaowsocks被封之后,我便在各大论坛上搜索过各个协议,方案的速度与性能比较,现贴出我找到的评测文章中最详细的一篇:

引用于:https://thinkgust.blogspot.hk/

V2Ray 和 Shadowsocks 的比较也是一个常见问题。既然我们有了一个性能测试的工具,那就一起测一下吧。
V2Ray SS CFB: V2Ray 中的 Shadowsocks 实现,AES-128-CFB 加密方式;
SS-Libev CFB: Shadowsocks libev 2.5.6,AES-128-CFB 加密方式,客户端 ss-tunnel,服务器端 ss-server;
SSR-PY CFB: ShadowsocksR 最新的代码(2017-01-20),AES-128-CFB 加密方式。其它的参数都是默认的:auth_aes128_md5、tls1.2_ticket_auth_compatible。
OTA 在所有 Shadowsocks 中都启用了。
实验结果(数据量:10 GB / 连接):
实验数据
解读如下:
VMess 的速度优于 Shadowsocks;
比起 ss-libev 和 ssr-python,V2Ray 在多并发连接的场景中更有优势

3.关于gfw的屏蔽方式:

引用于:https://thinkgust.blogspot.hk/

 GFW的应对措施是三步中最明显的,因为它最直接。GFW的重建过程和协议分析的过程需要耐心的试探才能大概推测出GFW是怎么实现的。但是GFW的应对手段我们每天都可以见到,比如连接重置。GFW的应对目前可以感受到的只有一个目的就是阻断。但是从广义上来说,应对方式应该不限于阻断。比如说记录下日志,然后做统计分析,秋后算账什么的也可以算是一种应对。就阻断方式而言,其实并不多,那么我们一个个来列举吧。

 -封IP

 一般常见于人工检测之后的应对。还没有听说有什么方式可以直接使得GFW的机器检测直接封IP。一般常见的现象是GFW机器检测,然后用TCP RST重置来应对。过了一段时间才会被封IP,而且没有明显的时间规律。所以我的推测是,全局性的封IP应该是一种需要人工介入的。注意我强调了全局性的封IP,与之相对的是部分封IP,比如只对你访问那个IP封个3分钟,但是别人还是可以访问这样的。这是一种完全不同的封锁方式,虽然现象差不多,都是ping也ping不通。要观摩的话ping twitter.com就可以了,都封了好久了。
 其实现方式是把无效的路由黑洞加入到主干路由器的路由表中,然后让这些主干网上的路由器去帮GFW把到指定IP的包给丢弃掉。路由器的路由表是动态更新的,使用的协议是BGP协议。GFW只需要维护一个被封的IP列表,然后用BGP协议广播出去就好了。然后国内主干网上的路由器都好像变成了GFW的一份子那样,成为了帮凶。
方式1
如果我们使用traceroute去检查这种被全局封锁的IP就可以发现,IP包还没有到GFW所在的国际出口就已经被电信或者联通的路由器给丢弃了。这就是BGP广播的作用了。

 -DNS劫持

 这也是一种常见的人工检测之后的应对。人工发现一个不和谐网站,然后就把这个网站的域名给加到劫持列表中。其原理是基于DNS与IP协议的弱点,DNS与IP这两个协议都不验证服务器的权威性,而且DNS客户端会盲目地相信第一个收到的答案。所以你去查询facebook.com的话,GFW只要在正确的答案被返回之前抢答了,然后伪装成你查询的DNS服务器向你发错误的答案就可以了.
方式2

 -TCP RST阻断

 TCP协议规定,只要看到RST包,连接立马被中断。从浏览器里来看就是连接已经被重置。我想对于这个错误大家都不陌生。据我个人观感,这种封锁方式是GFW目前的主要应对手段。大部分的RST是条件触发的,比如URL中包含某些关键字。目前享受这种待遇的网站就多得去了,著名的有facebook。还有一些网站,会被无条件RST。也就是针对特定的IP和端口,无论包的内容就会触发RST。比较著名的例子是https的wikipedia。GFW在TCP层的应对是利用了IPv4协议的弱点,也就是只要你在网络上,就假装成任何人发包。所以GFW可以很轻易地让你相信RST确实是Google发的,而让Google相信RST是你发的。
方式3

 -封端口

 GFW除了自身主体是挂在骨干路由器旁路上的入侵检测设备,利用分光技术从这个骨干路由器抓包下来做入侵检测 (所谓 IDS),除此之外这个路由器还会被用来封端口 (所谓 IPS)。GFW在检测到入侵之后可以不仅仅可以用TCP RST阻断当前这个连接,而且利用骨干路由器还可以对指定的IP或者端口进行从封端口到封IP,设置选择性丢包的各种封禁措施。可以理解为骨干路由器上具有了类似“iptables”的能力(网络层和传输层的实时拆包,匹配规则的能力)。这个iptables的能力在CISCO路由器上叫做ACL Based Forwarding (ABF)。而且规则的部署是全国同步的,一台路由器封了你的端口,全国的挂了GFW的骨干路由器都会封。一般这种封端口都是针对翻墙服务器的,如果检测到服务器是用SSH或者VPN等方式提供翻墙服务。GFW会在全国的出口骨干路由上部署这样的一条ACL规则,来封你这个服务器+端口的下行数据包。也就是如果包是从国外发向国内的,而且src(源ip)是被封的服务器ip,sport(源端口)是被封的端口,那么这个包就会被过滤掉。这样部署的规则的特点是,上行的数据包是可以被服务器收到的,而下行的数据包会被过滤掉。
 如果被封端口之后服务器采取更换端口的应对措施,很快会再次被封。而且多次尝试之后会被封IP。初步推断是,封端口不是GFW的自动应对行为,而是采取黑名单加人工过滤地方式实现的。一个推断的理由就是网友报道,封端口都是发生在白天工作时间。
在进入了封端口阶段之后,还会有继发性的临时性封其他端口的现象,但是这些继发性的封锁具有明显的超时时间,触发了之后(触发条件不是非常明确)会立即被封锁,然后过了一段时间就自动解封。目前对于这一波封SSH/OPENVPN采用的以封端口为明显特征的封锁方式研究尚不深入.
方式4

 -HTTPS间歇性丢包

 对于Google的HTTPS服务,GFW不愿意让其完全不能访问。所以采取的办法是对于Google的某些IP的443端口采取间歇性丢包的措施。其原理应该类似于封端口,是在骨干路由器上做的丢包动作。但是触发条件并不只是看IP和端口,加上了时间间隔这样一个条件。

4.关于OpenVPN在国内的使用:

 经过多次的实验,openvpn以及它的附属衍生项目softether均不可在国内正常使用,使用时间只要超过十分钟便会触发GFW的检测机制,进而导致服务器的ip被封,所以,在国内使用单纯的openvpn是绝对不可行的,即使你是在国内两台服务器之间建立加密隧道也会被掰,其原因已在之前引用的文段中说明,同时因为省级骨干网络也部署有GFW,所以这导致即使是国内的服务器间的加密通讯也是不可的,所以,openvpn在国内的使用时必须对其进行魔改,而其基本思路便是利用v2ray的加密与混淆功能为openvpn流量套上一层外壳,并混淆后再发出,以增加GFW的检测难度,较详细的配置过程已放在:利用V2Ray混淆加密OpenVPN流量以规避GFW的干扰与探测中.