如果您希望让外网访问UOJ,但是服务器没有外网ip,那么您可能需要这篇教程。
本文将引导您将内外的UOJ对外网开放。您可以选择以下方案中的一种。
ngrok
ngrok是一款操作简单的软件,可以把内网的web服务映射到外网。
大部分的ngrok服务是免费的。例如:ngrok.cc
ngrok的缺点:
- 速度比较慢
- 数据并不保密,ngrok服务提供者有能力监听OJ的通讯。
虽然有这几个缺点,ngrok仍然不失为一个好的选择。具体的配置,请参见ngrok.cc网站。
ssh转发
这个方案需要您有一台VPS,且VPS需要拥有外网ip。PYOJ就是通过这种方式向外网开放的。
首先,您需要在本地机器通过ssh-keygen
来生成一个您的密钥:
ssh-keygen -t rsa
一直按enter
键,然后您将会在~/.ssh/id_rsa.pub
取得您的公钥。
然后登录您的VPS,把上面的公钥扔进~/.ssh/authorized_keys
,如下图所示:
现在,您在本地机器上使用如下命令,应该可以免密码登录VPS:
bash ssh <VPS_user>@<VPS_ip>
如果不能登录,您可能对上面过程的理解存在偏差。
接下来,在本地机器上安装autossh
,它是稳定的ssh连接工具:
sudo apt install autossh
最后运行下面的指令,将本地的80
端口映射到VPS的80
端口:
autossh -M 5698 -NfR <VPS的ip>:80:<本地机器的ip>:80 <VPS用户名>@<VPS的ip> # 例如: # autossh -M 5698 -NfR 23.23.23.23:80:127.0.0.1:80 blue@23.23.23.23 # 5698是监听端口,用于测试ssh连接是否稳定。如果您运行了多个autossh,请保证它们的监听端口不同。
访问VPS的ip,您应该可以看到UOJ了。
如果您有域名,请添加一条A记录,指向VPS的ip,然后就能用域名访问了。
ssh转发的高级配置
如果一台VPS需要映射多个网站,那么显然不能都映射到80
端口。
在这种情况下,您可以将网站分别映射到10000
,10001
,10002
……然后用nginx来做反代。访问不同的域名将会反代到不同的网站。
VPS上的配置文件(/etc/nginx/conf.d/uoj.conf
)大概如下:
http://paste.ubuntu.com/24334214/