登陆云服务器
方式一:用户名
在Terminal使用ssh登陆远程服务器,终端输入ssh 用户名@云服务器ip
,然后输入密码就行。
所有的用户,登录进去后都是有~表示这是当前用户的home目录,如果使用change directory命令cd /
,就可以进入系统根目录。
~在Linux中代表用户主目录,对一般用户,~表示/home/(用户名),对于root用户,~表示/root。如果要查看~的真实面貌,可以先进入~目录
cd ~
,然后用print working directory命令pwd -P
命令查看~的绝对路径。
方式二:密钥
首先在腾讯云的页面创建密钥,生成并下载的密钥文件保存在本地。将云服务器关机后在腾讯云中绑定云服务器实例。
然后,在本地Terminal中进行登录信息的配置。输入vim ~/.ssh/config
,进入编辑模式,添加如下信息:
1 | Host sweetsweetcloud |
如果要查看密钥文件的绝对路径,可以拖动文件到Terminal中直接查看。
再次确认输入无误后保存并退出。
终端输入ssh sweetsweetcloud
,随后可能会有一个确认连接的消息弹出,输入yes并回车即可连接。
同样的ftp,sftp,也可以直接使用这些配置登陆。如果要进行sftp连接,输入sftp sweetsweetcloud
即可。
方式三:PyCharm连接
版本PyCharm 2020.3 Professional,软件语言为英文。
第一步是先找到Tools>Deployment>Configuration。
第二步,添加一个配置。输入的new server name知识这个配置的名称,没有其他实际意义。
第三步,填写具体配置。注意到最上面有三个分页,connection、mappings、excluded paths。
在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(自定义数值)。
连接远程服务器时提示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)
写在最前面安装包的一些建议
- 安装任何东西的时候一定要看清楚这个东西是否是支持操作系统版本的,比如有些包就分CentOS8的和CentOS7的。
- 如果国内服务器,如腾讯云服务器,使用wget下载国外ftp服务器的文件过慢,有两种方式。第一,找镜像网站。第二,曲线救国,先在本地用终端代理命令走proxy下载到本机,然后和用sftp上传到服务器,我就这么干了好多回。
升级gcc到8.2.0
不建议使用scl方法。这篇文章介绍了使用scl安装的方式,确实很快,但是有一个问题,就是安装并切换了目标版本的gcc后发现无法通过
find / -name "libstdc++.so.6"
找到动态库(也有可能是我的方式不对)。
建议根据centos6升级gcc、centos7升级gcc、glibc报错解决这三篇文章做升级。因为编译很慢,我的服务器是1核2G内存的,make花了将近三个小时,每一步都仔细检查,谨慎执行。
1 | yum update -y |
配置编译选项,此处没有指定路径,默认安装到/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 | make |
gcc升级后的系统路径配置
1 | 环境变量path |
这里的路径都是基于刚才我们../configure
后的—prefix选项生成的。如果没有—-prefix
选项,默认就是PATH=/usr/local/bin,PATH=/usr/local/include/,PATH=/usr/local/lib64
。
在这之后使用gcc -v
查看版本号应该就没有任何问题了。
编译后会生成的文件都长这样。
用命令查找系统中已经存在的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 | sudo cp /usr/local/lib64/libstdc++.so.6.0.25 /usr/lib64 |
之后再次查看glibc动态库就会发现有更高的版本了。
glibc升级过程
一开始我自己选择的glibc2.23进行升级的,编译的时候总有少个括号多个括号的报错,虽然能进入.c文件直接修改,但是问题在于解决了这个出错了那个。报错的一个解决例子可以参考这篇博客。如果在对glibc升级的时候出现错误,建议直接更换glibc的版本。
参考这篇博客,注意博主后来安装的是gcc8.2.0,因为后面glibc编译报错了!
在glibc官网下载glibc2.28版本,glibc官网地址:http://ftp.gnu.org/gnu/glibc/。
1 | 解压、进入目录、创建build目录并进入 |
如果先前没有编译安装升级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 | 解压 |
glibc升级成功查看结果
成功编译glibc会出现这样的结果。
1 | 查看动态库 |
手动安装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 | cd /home |
解压缩之后,home文件夹下会有一个Python-3.7.4.tgz压缩包、Python-3.7.4文件夹,编译源文件与安装都在Python-3.7.4下进行。
2. 安装Python编译环境
建议编译环境的安装宁可多不可少。
1 | sudo yum -y install gcc gcc-c++ |
之前就是因为没有安装libffi-devel这个模块,导致后面在使用pip安装bert4keras的时候已知报错ModuleNotFoundError: No module named '_ctypes'
,解决方法参考了make install fails: no module _ctypes和Python3: ImportError: No module named ‘_ctypes’ when using Value from module multiprocessing。尽量一次编译一次成功,编译环境齐全太重要了,重新编译好浪费时间,一次花半个小时的那种浪费。
3. 开始编译
先进入Python3源文件的文件夹。
1 | cd Python-3.7.4 |
然后配置安装目录,编译,安装。
1 | ./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl |
关于make altinstall与make install的区别,就是altinstall省去了make install之后配置软连接的过程。默认altinstall会在系统环境中创建和版本号相同的python环境变量。不要随意去删除本来就存在的指向系统自带Python的软连接,亲测会报错!
终端输入python3.7
与pip3.7 --version
能给出正确回应就说明安装没问题。通过在终端输入which python3.7
或whereis python3.7
可以查找到路径。
参考
强烈建议找教程一定要找最新发布的,文章,能够明确系统版本的更好。虽然跟着结合这两个教程做了,还是出了问题重新编译了多次。
virtualenv管理虚拟环境
在使用pip安装包之前先查看这个pip对应的是哪个Python解释器。像这样,pip3和pip对应的其实都是CentOS自带的Python解释器,而pip3.7 install
才会对应到真正的我们想要安装的python版本去。
首先使用pip3.7安装virtualenv:pip3.7 install virtualenv
。
进入项目根目录,创建一个名为venv的虚拟环境。进入虚拟环境所在文件夹,激活虚拟环境后回到项目根目录,安装requirements.txt文件中的库。
1 | cd myChatbot |
如果想要删除虚拟环境,直接删除虚拟环境的venv文件夹即可。
git
安装
1 | sudo yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm # 使用endpoint安装 |
服务器git clone过慢
使用国内镜像,目前已知Github国内镜像网站有github.com.cnpmjs.org和git.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 | vim ~/.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 许可协议。转载请注明出处!