文章目录
本文利用云服务器+FRP实现内网穿透,可以远程访问本机的jupyter服务器
写这篇博客的初衷是:台式机上有GPU,想可以远程访问台式机的jupyter服务器,从而可以在笔记本上远程使用台式机的GPU来做深度学习
白嫖阿里云云服务器 (高校学生才能领取)
阿里云云工开物计划可以领取300元优惠券,经过实测,可以免费购买轻量应用服务器中的新加坡服务器1年,如下图所示,这里我选择系统镜像为 Ubuntu20.04
创建新用户(可跳过)
参考链接 ubuntu下添加新用户
启动云服务器,默认使用admin用户,这里新创建一个用户
sudo useradd -r -m -s /bin/bash your_user_name
其中参数的意义如下:
-r:建立系统账号
-m:自动建立用户的登入目录
-s:指定用户登入后所使用的shell
在 Ubuntu20.04 中,不会在创建用户的时候自动提示设置密码,需要使用以下命令来设置
sudo passwd your_user_name
输入 ls /home/
查看用户是否成功创建,输入 su your_user_name
即可切换用户
云服务器端设置
配置frp服务器
- 下载frp并解压,由于云服务器操作系统为
ubuntu20.04
,架构为x86_64
,因此选择frp_0.50.0_linux_amd64
wget https://github.com/fatedier/frp/releases/download/v0.50.0/frp_0.50.0_linux_amd64.tar.gz tar zxvf frp_0.50.0_linux_amd64.tar.gz cd frp_0.50.0_linux_amd64
- 云服务器端只要关注两个文件,即
frps
和frps.ini
,我们可以通过修改frps.ini
来配置功能
vim frps.ini
将该文件内容按照下面的格式修改
[common] bind_port = 7000 dashboard_port = 7500 token = 12345678 dashboard_user = admin dashboard_user = admin vhost_http_port = 10080 vhost_https_port = 10443
- 端口均可使用默认值(也可以自定义),token、dashboard_user 和 dashboard_user 项请自行设置。
- bind_port:表示用于客户端和服务器端连接的端口,这个端口号之后在配置客户端的时候要用到
- dashboard_port:是服务器端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问
x.x.x.x:7500
(其中x.x.x.x
为云服务器的IP)查看frp服务的运行信息- token:是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到
- dashboard_user 和 dashboard_pwd 表示打开仪表板页面登录的用户名和密码,自行设置即可
- vhost_http_port 和 vhost_https_port 用于反向代理HTTP主机时使用,本文不涉及,因而照抄或者删除这两条均可
- 接下来可以运行 frps
./frps -c frps.ini
- 一般来说,服务器默认设有防火墙,需要在防火墙中开放端口
bind_port
和dashboard_port
,这里为7000
和7500
,如下所示
- 此时访问
x.x.x.x:7500
并使用自己设置的用户名密码登录,即可看到仪表板界面
设置frps开机自启动
Ctrl+C
退出 frps,接下来按照下列步骤将 frps 设置为开机自启动
修改
rc-local.service
文件sudo vim /lib/systemd/system/rc-local.service
在文件的最后面添加 [Install] 段的内容,如下所示
[Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no #这一段原文件没有,需要自己添加 [Install] WantedBy=multi-user.target Alias=rc-local.service
创建
/etc/rc.local
,Ubuntu 20.04 默认不存在/etc/rc.local
,需要自己创建sudo vim /etc/rc.local
向该文件中添加要执行的命令,如下所示
#!/bin/bash # 将你需要执行的命令写在这里,禁止写入死循环命令 frps的绝对路径 -c frps.ini的绝对路径 exit 0
修改
/etc/rc.local
权限sudo chmod 777 /etc/rc.local
启动
rc-local.service
sudo systemctl enable rc-local.service
检查服务状态:使用
sudo systemctl status rc-local.service
查看rc-local
服务的状态, 显示 loaded 和 enabled 即可接下来重启云服务器,访问
x.x.x.x:7500
查看 frps 是否正常运行
客户端配置
因为我需要可以远程访问台式机上的 jupyter,因此台式机就是这里说的客户端。由于台式机上安装了Windows 和 Ubuntu20.04 双系统,因此下面分别按照这两个系统进行示例
Windows
frpc配置
- 下载 frp_0.50.0_windows_amd64 并解压,客户端只要关注两个文件,即
frpc
和frpc.ini
,我们可以通过修改frpc.ini
来配置功能,如下所示
[common] server_addr = x.x.x.x server_port = 7000 token = 12345678 [smb] type = tcp local_ip = 127.0.0.1 local_port = 445 remote_port = 7001 [jupyter] type = tcp local_ip = 127.0.0.1 local_port = 8888 remote_port = 7002 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 7003
[common]
字段下的三项为服务端的设置server_addr:为服务端IP地址,填入即可
server_port:为服务器端口,填入你设置的端口号即可,如果未改变就是7000
token:是你在服务器上设置的连接口令,原样填入即可
frp 实际使用时,会按照端口号进行对应的转发,原理如下所示
frpc.ini
的[smb]
、[jupyter]
和[ssh]
字段都是自己定义的规则,自定义端口的格式如下:[xxx]:表示一个规则名称,自己定义,便于查询即可
type:表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册
local_port:是本地应用的端口号,按照实际应用工作在本机的端口号填写即可
remote_port:是该条规则在服务端开放的端口号,自己填写并记录即可
SMB,Windows文件共享所使用的协议,默认端口号445,协议TCP,因此规则
[smb]
可实现远程文件访问jupyter 默认工作在端口
8888
,因此规则[jupyter]
可以实现远程访问 jupyter 服务器
接下来需要在云服务器端配置防火墙,开放
7001
、7002
和7003
这三个端口完成配置后,使用命令行运行
frpc.exe
即可,输出如下所示
设置frpc自启动
可以通过 Windows 的任务计划程序实现 frpc
开机自启动,具体可以搜索网上教程,关键的一步如下所示
SMB测试
确保电脑已经开启共享文件夹,有关教程自行搜索,在手机上安装软件 Solid Explorer
(ES文件浏览器应该也可以)来远程访问电脑上的文件
在 Solid Explorer
中新建云连接,选择连接类型为 LAN/SMB
,输入如下信息,远程主机名填云服务器的IP地址,端口填 7001
(即上面配置的remote_port)
按照流程输入有关信息即可连接
SSH测试
Windows安装SSH可以参考教程:Windows 10 开启ssh服务
VScode上可以安装拓展 Remote - SSH
来远程连接,需要注意的是,输入的命令为 ssh YourUserName@YourServerIP -p 7003
jupyter测试
jupyter 服务器配置
默认情况下 jupyter 不支持密码登录,可以按照下面的步骤开启
- 打开
Anaconda Prompt
,执行下面的命令来生成一个配置文件,注意记住配置文件路径
jupyter notebook --generate-config
- 接下来设置访问密码
jupyter notebook password
进入上面的
json
文件路径,打开jupyter_notebook_config.json
配置文件,复制password
对应的密文然后打开上面
jupyter_notebook_config.py
配置文件,添加以下参数后保存
c.NotebookApp.ip='*' #允许访问的IP地址,设置为*代表允许任何客户端访问 c.NotebookApp.password = u'你的密文'#刚才生成密码时上面复制的密文 c.NotebookApp.open_browser = False c.NotebookApp.port = 8888 #可自行指定一个端口, 访问时使用该端口 c.NotebookApp.allow_remote_access = True c.NotebookApp.notebook_dir = 'Your Work Dir'
接下来在
Anaconda Prompt
中输入jupyter notebook
启动jupyter
,或者直接启动jupyter
也可以接下来在其他设备(如笔记本)上输入
x.x.x.x:7002
(即云服务器IP地址和上面配置的remote_port),查看是否可以远程访问 jupyter
使用 JupyterLab
Jupyter Lab是Jupyter的一个拓展,它提供了更好的用户体验,例如可以同时在一个浏览器页面打开编辑多个Notebook,Ipython console和terminal终端,并且支持预览和编辑更多种类的文件,如代码文件,Markdown文档,json,yml,csv,各种格式的图片,vega文件(一种使用json定义图表的语言)和geojson(用json表示地理对象),还可以使用Jupyter Lab连接Google Drive等云存储服务,极大得提升了生产力。
用 conda 安装 JupyterLab
conda install -cconda-forge jupyterlab # 如果出现类似下面的报错,可以修改 anaconda 安装目录的权限 # EnvironmentNotWritableError: The current user does not have write permissions to the target environment. # environment location: /usr/local/anaconda3 # sudo chown -R YOUR_USER_NAME /usr/local/anaconda3
使用浏览器打开
your_jupyter_server/lab/workspaces/auto-a
即可
将 Anaconda 的虚拟环境设置为 jupyter 的 kernel
使用
Anaconda
创建环境并激活conda create -n env_1 python=3.7 conda activate env_1
在
env_1
环境下安装ipykernel
conda install -n env_1 ipykernel --update-deps --force-reinstall
将该环境写入到notebook的kernel中
python -m ipykernel install --user --name env_1 --display-name "env_1"
可以通过下面的命令来查看 jupyter 存在的 kernel
jupyter kernelspec list
如果想删除 env_1 虚拟环境,可通过下面的命令
jupyter kernelspec remove env_1
VSCode
VSCode 在安装拓展 Jupyter
、Jupyter Keymap
和 Jupyter Notebook Renderers
后,打开 ipynb 文件后可以选择远程的 jupyter
服务器。
需要注意的是,此时代码运行的工作目录是远程 jupyter
服务器的工作目录,可以通过 !chdir
来查看。所有 ipynb 文件中读取或者保存的数据,都是相对远程 jupyter
服务器的工作目录而言的,而不是本机中 ipynb 文件的目录。
Ubuntu20.04
待续。。。