腾讯云使用踩坑记录
徐徐 抱歉选手

登陆云服务器

方式一:用户名

在Terminal使用ssh登陆远程服务器,终端输入ssh 用户名@云服务器ip,然后输入密码就行。

所有的用户,登录进去后都是有~表示这是当前用户的home目录,如果使用change directory命令cd /,就可以进入系统根目录。

~在Linux中代表用户主目录,对一般用户,~表示/home/(用户名),对于root用户,~表示/root。如果要查看~的真实面貌,可以先进入~目录cd ~,然后用print working directory命令pwd -P命令查看~的绝对路径。

方式二:密钥

首先在腾讯云的页面创建密钥,生成并下载的密钥文件保存在本地。将云服务器关机后在腾讯云中绑定云服务器实例。

然后,在本地Terminal中进行登录信息的配置。输入vim ~/.ssh/config,进入编辑模式,添加如下信息:

1
2
3
4
Host sweetsweetcloud
HostName ip或者是域名
User ubuntu或root或其他账户
IdentityFile 密钥文件所在的绝对路径,例如 ~/.ssh/qcloud

如果要查看密钥文件的绝对路径,可以拖动文件到Terminal中直接查看。

再次确认输入无误后保存并退出。

终端输入ssh sweetsweetcloud,随后可能会有一个确认连接的消息弹出,输入yes并回车即可连接。

同样的ftp,sftp,也可以直接使用这些配置登陆。如果要进行sftp连接,输入sftp sweetsweetcloud即可。

方式三:PyCharm连接

版本PyCharm 2020.3 Professional,软件语言为英文。

第一步是先找到Tools>Deployment>Configuration。

deployment-image

第二步,添加一个配置。输入的new server name知识这个配置的名称,没有其他实际意义。

new-server-name-image

第三步,填写具体配置。注意到最上面有三个分页,connection、mappings、excluded paths。

deployment-config

在connection mappings中,传输类型Type选择SFTP,ssh configuration点击三个小点,会弹出一个新的页面。

Host部分就填写服务器的公网IP,User name与password就相当于使用用户名登陆云服务器,也可以改变Authentication type选择用key pair来验证。输入之后Test Connection成功就说明配置成功。

继续回到Deployment页面中,Root Path就是传输文件的最初始路径,后面mappings也有一个路径,那个mappings路径是基于这里的root path的。

Web Server继续填写http前缀+服务器的公网IP。最后保存即可。

在刚填写完没多久,Tools>Deployment>Configuration>Upload to…选项可能是灰色的,等过了五六分钟大概就会能够让你上传。也可以在Tools>Deployment>Options中设置自动上传。

Tools>start SSH session可以在Pycharm中连接远程终端,就和在自己的Terminal中连接远程终端一个道理。

登陆云服务器报错及解决

ECSDA host key报错

如果像我一样重置了系统,并且重新绑定了密钥到云服务器上,或报错诸如:Warning: the ECDSA host key for 'myserver' differs from the key for the IP address '192.168.1.123',只需要在Terminal中移除为该ip缓存的密钥即可,ssh-keygen -R 你的服务器ip

连接时发生broken pipe错误

以sudo模式修改服务器端ssh配置文件sudo vim /etc/ssh/sshd_config

找到TCPKeepAlive,ClientAliveInterval,ClientAliveCountMax选项,分别uncomment,并且修改为yes,300,10(自定义数值)。

sshd-config

连接远程服务器时提示Permission denied (publickey,password)

因为默认使用了ssh密钥进行连接,所以用户名、密码的方式不可行,并且一开始也没有设置密码。如果想要使用用户名密码登陆,需要修改sshd的配置。

进入sudo vim /etc/ssh/sshd_config,修改为PermitRootLogin yes, PubkeyAuthentication no,PasswordAuthentication yes几项,有的可能被comment了,仔细找找。

保存后重启sshd服务,systemctl sshd restart

网上提供的解决办法也有单改PermitRootLogin的,没效果。

如果一开始就没有设置密码或者忘记密码了,登陆后使用sudo passwd root改一下密码。

解决方法了这篇文章

在mac终端使用sftp向服务器传输文件也是使用sftp root@ip-address,然后会要求输入密码,正确后就能传输文件了。如果要传输整个文件夹,记得使用put -r local-file remote-file,否则没有-r会报错non-regular file。

CentOS

由于一开始选择的系统是CentOS,后来感觉找教程都不太方便,就改成了ubuntu了。虽然后来又因为Ubuntu下安装python不带pip的bug重返了CentOS。

参考的文章是这一篇:半小时搞会 CentOS 入门必备基础知识,里面涉及CentOS根目录文件说明,目录相关命令,Vim编辑器使用方法,进程管理,ssh登陆与上传文件。

创建新的用户使用adduser username创建用户名为username的用户,命令行不会有输出,但继续使用passwd username可以在出现的响应栏中设定username的用户密码。参考CentOS 7中添加一个新用户并授权

gcc与动态库升级

为什么需要gcc升级

无力吐槽了,本意是想在云服务器上跑个RESTful API供前端调用的,因为项目用到了tensorflow以及bert4keras等库,这些库对底层gcc的动态库(如glibc,libstdc++,libm等)的要求较高,而centos7.6自带的gcc版本是4.8.5的,动态库根本不能支持python的依赖库,一直一直报错,一定要手动编译升级gcc还有glibc动态库。

至今为止遇到的错误包括但不限于一下几个,按出现先后顺序排列:

  • 报错信息ImportError: /lib64/libstdc++.so.6: version CXXABI_1.3.9' not found

  • ImportError: /lib64/libm.so.6: version GLIBC_2.23' not found

  • 加载共享库时发生Linux错误:cannot open shared object file: No such file or directory

一般遇到上面三个报错,搜索出来的教程都是和你说gcc动态库过老,要你查找编译gcc时生成的最新动态库。但这一切都基于一个前提,你必须编译gcc了。如果没有编译过高版本的gcc,单纯连接动态库的操作还是会报错。所以解决上面两个问题的核心办法就是先升级gcc后更新动态库。

  • 编译glibc :LD_LIBRARY_PATH shouldn't contain the current directory
  • glicc2.23编译错误setenv.c:279:6: error: suggest explicit braces to avoid ambiguous 'else' [-Werror=parentheses] if (ep != NULL)
  • glicc2.23[Bug build/23883] error: '__EI___errno_location' specifies less restrictive attributes than its target '__errno_location':

接下来主要分为两个部分,第一个部分是升级gcc,第二个部分是更新动态库。

建议升级的版本匹配方案

  • CentOS7.6,运行基于Tensorflow1.14,bert4keras0.7,flask1.1,numpy1.16,scipy1.6,pandas1.2等模块的Python项目。
  • GCC 8.2.0(原4.8.5)
  • GNU Make 4.2.1(原3.8.2)
  • glibc 2.28(原2.17)

写在最前面安装包的一些建议

  1. 安装任何东西的时候一定要看清楚这个东西是否是支持操作系统版本的,比如有些包就分CentOS8的和CentOS7的。
  2. 如果国内服务器,如腾讯云服务器,使用wget下载国外ftp服务器的文件过慢,有两种方式。第一,找镜像网站。第二,曲线救国,先在本地用终端代理命令走proxy下载到本机,然后和用sftp上传到服务器,我就这么干了好多回。

升级gcc到8.2.0

不建议使用scl方法。这篇文章介绍了使用scl安装的方式,确实很快,但是有一个问题,就是安装并切换了目标版本的gcc后发现无法通过find / -name "libstdc++.so.6"找到动态库(也有可能是我的方式不对)。

建议根据centos6升级gcccentos7升级gccglibc报错解决这三篇文章做升级。因为编译很慢,我的服务器是1核2G内存的,make花了将近三个小时,每一步都仔细检查,谨慎执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
yum update -y
yum install -y gcc-c++ glibc-static gcc bzip2 wget tmux

cd ~
wget http://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.gz
tar -xzf gcc-8.2.0.tar.gz
cd gcc-8.2.0

./contrib/download_prerequisites
# gmp-6.1.0.tar.bz2: OK
# mpfr-3.1.4.tar.bz2: OK
# mpc-1.0.3.tar.gz: OK
#isl-0.18.tar.bz2: OK
# All prerequisites downloaded successfully.

# 创建一个存放编译后文件的目录,并进入该目录编译
mkdir gcc-build-4.8.5
cd gcc-build-4.8.5

配置编译选项,此处没有指定路径,默认安装到/usr/local中。

1
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

如果希望指定目录,建议这么做:../configure --prefix=/usr/local/gcc-8.2.0 -enable-checking=release -enable-languages=c,c++ -disable-multilib这会将编译生成的文件自动放置到/usr/local/gcc-8.2.0,强烈建议带版本号,不然多个gcc会很麻烦。

开始编译并安装。

1
2
make
make install

gcc升级后的系统路径配置

1
2
3
4
5
6
7
8
9
10
11
# 环境变量path
echo "export PATH=/usr/local/gcc-8.2.0/bin:$PATH" >> /etc/profile.d/gcc.sh
source /etc/profile.d/gcc.sh

# 头文件
ln -sv /usr/local/gcc-8.2.0/include/ /usr/include/gcc

# 库文件
echo "/usr/local/gcc-8.2.0/lib64" >> /etc/ld.so.conf.d/gcc.conf
ldconfig -v
ldconfig -p |grep gcc

这里的路径都是基于刚才我们../configure后的—prefix选项生成的。如果没有—-prefix选项,默认就是PATH=/usr/local/bin,PATH=/usr/local/include/,PATH=/usr/local/lib64

在这之后使用gcc -v查看版本号应该就没有任何问题了。

编译后会生成的文件都长这样。

image-20210328231903237

用命令查找系统中已经存在的gcc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
find /usr -name gcc

# 返回如下内容

# 这是之前按照掘金上那一篇教程安装的路径--prefix为/usr/local/gcc的gcc9.1.0,因为版本太高仍然在python中报错
/usr/local/gcc
/usr/local/gcc/lib/gcc
/usr/local/gcc/bin/gcc
/usr/local/gcc/libexec/gcc

# 这是后来没有指定--prefix的gcc8.2.0,默认直接安装到了/usr/local下,后来我觉得移动一下这些文件,于是就有了上面那张截图
/usr/local/lib/gcc
/usr/local/bin/gcc
/usr/local/libexec/gcc

# 这是系统自带的gcc4.8.5
/usr/lib/gcc
/usr/bin/gcc
/usr/libexec/gcc
/usr/include/gcc

之前我还用scl安装了gcc,但是并没有显示在这里。可能是因为那个安装的是预编译的gcc编译器?不太懂这其中的关系。

libstdc++动态库连接

查看当前系统的glibc动态库。

1
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

查找编译gcc后的生成动态库。

1
find / -name "libstdc++.so*"

选择新生成的动态库、复制到/usr/lib64下,建立软连接。

1
2
3
4
sudo cp /usr/local/lib64/libstdc++.so.6.0.25 /usr/lib64
cd /usr/lib64
sudo rm -rf libstdc++.so.6
sudo ln -s libstdc++.so.6.0.25 libstdc++.so.6

之后再次查看glibc动态库就会发现有更高的版本了。

glibc升级过程

一开始我自己选择的glibc2.23进行升级的,编译的时候总有少个括号多个括号的报错,虽然能进入.c文件直接修改,但是问题在于解决了这个出错了那个。报错的一个解决例子可以参考这篇博客。如果在对glibc升级的时候出现错误,建议直接更换glibc的版本。

参考这篇博客,注意博主后来安装的是gcc8.2.0,因为后面glibc编译报错了!

在glibc官网下载glibc2.28版本,glibc官网地址:http://ftp.gnu.org/gnu/glibc/。

1
2
3
4
5
6
7
8
9
# 解压、进入目录、创建build目录并进入
tar -xf glibc-2.28.tar.gz
cd glibc-2.28
mkdir build; cd build
# 编译配置
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
# 开始编译并安装
make
make install # 这一步的2个问题可以忽略

如果先前没有编译安装升级gcc到8.2.0,就可能报错these critical programs are missing or too old: make。我是只出现了make的报错,但是参考博客的博主既有bison又有make,所以大家一定要结合自己的情况。

GNU Make升级过程

因为在升级glibc的过程中我有make版本过低的报错,因此从3.82升级gnu make到4.2.1。

从GNU Make官网下载对应版本的GNU Make:https://ftp.gnu.org/gnu/make/。过程与博客分享的一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 解压
tar -zxvf make-4.2.1.tar.gz

# 安装
cd make-4.2.1
# 建立编译目录
mkdir build
cd build
# 执行
../configure --prefix=/usr

# 执行完,这里需要编译,会生成build.sh文件,然后执行这个文件
sh build.sh
# 然后安装
make install

# 然后就安装完成了,查看版本
make -v
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 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.

glibc升级成功查看结果

成功编译glibc会出现这样的结果。

1
2
3
4
5
6
7
8
9
10
# 查看动态库
ls -l /lib64/libc.so.6

# glibc2.28的意思就是在动态库中查找glibc会有一直到2.28版本
strings /lib64/libc.so.6 | grep GLIBC
.....
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE

手动安装Python

本文主要是在CentOS 7.6的腾讯云服务器尝试安装Python3.7,以及pip、virtualenv。

Ubuntu下安装请谨慎,因为我自己重新编译了好多次,发现依然安装的Python不自带pip,十分麻烦,原因想不出来,但是网络上也有提出相同问题的人。

如果是CentOS 8的系统,安装Python3源文件的编译环境的时候会报错无法安装该编译模块!

安装过程

1. 从Python官方网站下载python

所有Python的版本都可以在这个网站找到,点击对应的版本号,会给出一系列安装包,把安装包的名字拼接到网址后面就是我们使用wget获取的文件对象。

如,对于网址https://www.python.org/ftp/python/3.7.4/,选取Python-3.7.4.tgz安装包,所以目标网址为https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz

在使用wget之前,先进入某个目录,后续下载wget与解压tar都会在这个目录进行。全部过程如下:

1
2
3
cd /home
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
tar -zxvf Python-3.7.4.tgz

解压缩之后,home文件夹下会有一个Python-3.7.4.tgz压缩包、Python-3.7.4文件夹,编译源文件与安装都在Python-3.7.4下进行。

2. 安装Python编译环境

建议编译环境的安装宁可多不可少。

1
2
3
4
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel
sudo 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

之前就是因为没有安装libffi-devel这个模块,导致后面在使用pip安装bert4keras的时候已知报错ModuleNotFoundError: No module named '_ctypes',解决方法参考了make install fails: no module _ctypesPython3: ImportError: No module named ‘_ctypes’ when using Value from module multiprocessing。尽量一次编译一次成功,编译环境齐全太重要了,重新编译好浪费时间,一次花半个小时的那种浪费。

3. 开始编译

先进入Python3源文件的文件夹。

1
cd Python-3.7.4

然后配置安装目录,编译,安装。

1
2
3
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
make
make altinstall

关于make altinstall与make install的区别,就是altinstall省去了make install之后配置软连接的过程。默认altinstall会在系统环境中创建和版本号相同的python环境变量。不要随意去删除本来就存在的指向系统自带Python的软连接,亲测会报错!

终端输入python3.7pip3.7 --version能给出正确回应就说明安装没问题。通过在终端输入which python3.7whereis python3.7可以查找到路径。

参考

强烈建议找教程一定要找最新发布的,文章,能够明确系统版本的更好。虽然跟着结合这两个教程做了,还是出了问题重新编译了多次。

腾讯云服务器Linux系统—安装python3.7.6

linux安装Python3

virtualenv管理虚拟环境

在使用pip安装包之前先查看这个pip对应的是哪个Python解释器。像这样,pip3和pip对应的其实都是CentOS自带的Python解释器,而pip3.7 install才会对应到真正的我们想要安装的python版本去。

versions-of-pip

首先使用pip3.7安装virtualenv:pip3.7 install virtualenv

进入项目根目录,创建一个名为venv的虚拟环境。进入虚拟环境所在文件夹,激活虚拟环境后回到项目根目录,安装requirements.txt文件中的库。

1
2
3
4
5
6
cd myChatbot
virtualenv venv
cd ./venv
source bin/activate
cd ../
pip intsall -r requirements.txt

如果想要删除虚拟环境,直接删除虚拟环境的venv文件夹即可。

git

安装

1
2
3
sudo yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm # 使用endpoint安装
sudo yum install git
git --version # 查看版本

服务器git clone过慢

使用国内镜像,目前已知Github国内镜像网站有github.com.cnpmjs.orggit.sdut.me/。速度根据各地情况而定,在clone某个项目的时候将github.com替换为github.com.cnpmjs.org即可。

pyenv管理python版本

安装pyenv

正常步骤是使用git clone https://github.com/yyuu/pyenv.git ~/.pyenv,但是腾讯云实在是……git clone太慢了,于是就用了镜像网站下载.

1
git clone https://github.com.cnpmjs.org/yyuu/pyenv.git ~/.pyenv

接下来配置环境变量即可。

1
2
3
4
5
6
7
8
vim ~/.bash_profile

## pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

source ~/.bash_profile

使用pyenv安装特定版本的python

正常步骤是使用pyenv install 版本号,但是实在是太慢了!无语!这辈子没这么无语过!

使用国内镜像下载。下面的命令的意思是从镜像网站huaweicloud下载版本为3.7.3的python压缩包,并放置在~/.pyenv/cache文件下,并使用pyenv安装压缩包。

1
v=3.7.3;wget https://mirrors.huaweicloud.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
  • 本文标题:腾讯云使用踩坑记录
  • 本文作者:徐徐
  • 创建时间:2021-03-13 15:01:18
  • 本文链接:https://machacroissant.github.io/2021/03/13/qcloud-use/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论