初始化的阿里云ECS是没有Python开发环境的,为了使用Jupyter等工具,需要对ECS进行初始化配置。
若无特殊说明,下文中的所有命令都是在命令行中使用。

hostnamectl set-hostname {NAME}    # 修改主机名称为{NAME}

安装Python3.8.5

# 安装依赖包
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel libffi-devel

# 安装Python3.8.5
## 获取安装包,也可手动下载。
wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
## 解压缩
tar -zxvf Python-3.8.5.tgz
## 进入目录
cd Python-3.8.5
## 配置安装位置
./configure --prefix=/usr/local/python
## 编译并安装
make && make install
## 建立Python软连接
ln -s /usr/local/python/bin/python3.8 /usr/bin/python
## 建立Pip软连接
ln -s /usr/local/python/bin/pip3.8 /usr/bin/pip
## 添加到PATH
echo 'export PATH=/usr/local/python/bin:$PATH' >>~/.bashrc
source ~/.bashrc
## 安装成功后查看python和pip版本
python -V
pip -V
## 升级Pip版本
python -m pip install --upgrade pip

## 删除安装包
rm -f Python-3.8.5.tgz
rm -rf Python-3.8.5

## 删除Python
# rm -rf /usr/local/python

运行Jupyter Notebook

jupyter notebook --generate-config --allow-root

此时,一般会在/root/.jupyter目录下创建名为jupyter_notebook_config.py的配置文件。打开配置文件,在文件末尾添加以下几个条目:

c.NotebookApp.notebook_dir = '/opt'    # 默认工作目录
c.NotebookApp.ip='*'   # 允许所有IP地址访问
c.NotebookApp.password = 'sha1:xxxxxx:xxxxxxxxxxxxxxxxxx'    # SHA1后的密码,具体见下文
c.NotebookApp.open_browser = False    # 启动时打开浏览器
c.NotebookApp.port = 8888    # 端口号

SHA1密码生成,只需要把下面代码中的*********替换为明文密码,然后再命令行中运行,把可以得到的结果完整地复制到上文密码处。
当然,还可以不添加password那行,然后直接在命令行中使用$ jupyter notebook password直接设置密码。

python -c "from notebook.auth import passwd; print(passwd(passphrase='*********', algorithm='sha1'))"

然后同jupyter notebook --allow-root启动Notebook服务即可。需要停止时,按下Ctrl+C即可停止。
此时,关闭xShell后,Jupyter Notebook也会停止,所以需要不挂断地运行进程,使用命令行nohup jupyter lab --allow-root > jupyter.log 2>&1 &
想要终止这类进程,只需要ps -a查看jupyter进程号pid,然后kill -9 pid杀死进程。

安装Jupyter Lab

Jupyter Lab是Jupyter Notebook的升级版,过程类似,只是把上文中的Notebook换为Lab即可。

jupyter lab --generate-config

此时,一般会在/root/.jupyter目录下创建名为jupyter_lab_config.py的配置文件。打开配置文件,在文件末尾添加以下几个条目:

c.ServerApp.notebook_dir = '/opt'    # 默认工作目录
c.ServerApp.ip='*'   # 允许所有IP地址访问
c.ServerApp.password = 'sha1:xxxxxx:xxxxxxxxxxxxxxxxxx'    # SHA1后的密码,具体见下文
c.ServerApp.open_browser = False    # 启动时打开浏览器
c.ServerApp.port = 8889    # 端口号

其余内容基本相似,只是把上文中的Notebook换为Lab即可。

开放端口

上述过程只是运行了jupyter服务,想要实现客户端的访问,还需要开放服务器的端口,如8888。
首先查看端口是否开放:

firewall-cmd --query-port=8888/tcp

提示yes表示已开通,提示no表示未开通。

firewall-cmd --add-port=8888/tcp --permanent    # 开放8888号端口
firewall-cmd --add-port=8000-9999/tcp --permanent    # 开放8000~9999号端口

提示success表示成功。
注意,此时必须重载以生效

firewall-cmd --reload

若要关闭端口

firewall-cmd --permanent --remove-port=8888/tcp

防火墙相关指令

systemctl status firewalld    # 查看防火墙状态
systemctl start firewalld    # 开启防火墙
systemctl stop firewalld    # 关闭防火墙

安装nginx

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx
service nginx start

修改/etc/nginx/下的nginx.conf配置文件

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  47.116.135.220;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass    http://127.0.0.1:5000;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
# 重新载入配置文件
nginx -s reload
# 重启nginx
nginx -s reopen 
# 停止nginx
nginx -s stop

Pip的一些问题

由于众所周知的原因,国内使用pip的官方源速度比较慢,所以很多人使用阿里源,清华源等等,也能应付绝大部分包的安装,但是镜像源与官方源还是有一定的差别的,阿里云ECS默认使用阿里源,对有些包的安装不友好,例如有些包会出现这样的报错

distutils.errors.DistutilsError: Command '['/root/.virtualenvs/music/bin/python', '-m', 'pip', '--disable-pip-version-check', 'wheel', '--no-deps', '-w', '/tmp/tmpmlr7fab1', '--quiet', '--index-url', 'http://mirrors.cloud.aliyuncs.com/pypi/simple/', 'pytest-runner']' returned non-zero exit status 1.

此时,需要使用官方源安装pytest-runner这个包。

云服务器搭建跳板机

有云服务器A,一台运行Jupyter Lab的台式机B,一台笔记本C。当B和C处于同一局域网下,C可以通过 B的内网地址:port 来访问 B主机,但是当B和C不位于同一局域网时,需要使用云服务器A作为跳板机实现对B的访问。这里使用frp。
分别在A和B上安装frp

服务器端A

配置文件为frps.ini

[common]
# 下面端口在云端主机均要开通
bind_port = 7600
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin
max_pool_count = 20
# 下面这个配置访问jupyter很重要。
vhost_http_port = 80

客户端B

[common]
server_addr = XX.XX.XX.XX #云端的公网ip
server_port = 7600

[ssh]
# ssh或者windows mstsc 远程访问服务器端
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7200
use_compression = true
use_encryption = true

[jyputer]
type = http
local_ip = 127.0.0.1
local_port = 8888    # jupyter port
use_encryption = true
use_compression = true
custom_domains = XX.XX.XX.XX #云端的公网ip

主要注意几点:A的bind_port 需要和 B 的server_port 相同。

./frps -c ./frps.ini        % 运行服务端程序
./frpc -c ./frpc.ini        % 运行客户端

运行之后,使用 云服务器IP:vhost_http_port端口号,即可远程访问jupyter lab。

需要注意的是,部分电脑c.NotebookApp.ip不可设置为'*',或者'0.0.0.0',可能导致报错。最好都设置为'127.0.0.1'。

VS code 远程连接 云服务器 (ssh-remote)

### 生成公私密钥对
$ ssh-keygen

会在~/.ssh目录下生成公钥id_rsa.pub和私钥id_rsa。私钥留在本地主机,公钥上传到云主机~/.ssh目录下,同时使用命令cat id_rsa.pub >> authorized_keys生成authorized_keys文件。
在vscode中添加IdentityFile

Linux 常用命令

pwd
ls
cd

free -h    
du -sh *
df -h
kill -9 pid