首页 个人云服务器指南
文章
取消

个人云服务器指南

前言

C++搞不知道有什么用的单机软件无聊死了,还是互联网好玩。(不过学C++跟搞互联网的都一起饿死了)简单记录一下简简单单的入门知识吧。

选购

国内和国外,但国外的还是会有支付银行卡的问题。

那国内基本就阿里、华为、腾讯,还有别的一些小厂。体感跟看别人的说法,阿里做的最好,市场份额也最高。华为性价比还行,印象中感觉主要还是to G或者to B。腾讯云最low(身边有朋友还被黑了)。不过阿里云已经给实验室买了两个账户,没有新用户了。只能试试腾讯云了。选购链接:

个人开发者嘛,就一个字抠。所以嘛,搞公有云的也不图这几个钱,以前无论是新用户优惠还是学生领取,搞得都挺多的,图的可能就是培养一个用户习惯。然而这年头大家过的都难,这种看不到啥钱途的事情也不怎么爱做了。体感上面公有云这种业务可能也收缩了,看上去就是价格都不便宜了。有钱赚的还是像金蝶那种搞私有云的。

上面稍微吐槽一下,唉,毕竟云这种概念对于开发者还是很有吸引力的。

启动服务器

买完之后基本按照指引一步一步完成即可。之前使用过几次阿里云都是装的Windows Server,如果是Windows基本没什么好说的,使用远程桌面登录即可。

自己玩的话肯定还是用Linux服务器比较好玩,先装个ubuntu。首次登录需重置密码,然后使用ssh远程登录。更建议使用密钥登录,更加安全也能实现免密登录。

密钥登录

密钥登录可以使用云自带的密钥管理系统,会生成一对密钥,然后下载私钥保存起来,使用的时候添加密钥就会自动添加到服务器.ssh文件夹内,然后把私钥放到客户机.ssh文件夹下,添加Config文件:

1
2
3
4
5
6
7
Host ubuntu
    HostName (your ip)
    Port 22
    User ubuntu
    IdentityFile ~/.ssh/ubuntu.pem
    ServerAliveInterval 30
    TCPKeepAlive yes

具体免密登录参考:构建我的工作空间 Olimi

ubuntu配置

进入系统首先sudo apt-get updatesudo apt-get upgrade更新。

然后装些必备扩展比如zsh终端吧:Windows Terminal + WSL + Ubuntu + 图形化 总结 Olimi

图形化界面试着装了一下,感觉不是特别有必要,一个是系统资源占用高,另外还比较卡,选Linux系服务器就是图一个系统资源性比价最高,需要图形化界面直接重装为Windows Server算了。

访问github

上述安装zsh过程碰到一个使用linux最大的问题,就是国内访问github巨慢的问题,什么时候吃过这种苦。

解决途径:

  1. 针对这个问题主流的方案就是直接强改host,通过一些ip测速获取当前github的ip,手动设置host(/etc/hosts). 也有一些github项目一直会更新hosts:isevenluo/github-hosts: 🔥🔥🔥 本项目定时更新GitHub最新hosts,解决GitHub图片无法显示,加速GitHub网页浏览。
  2. 挂梯子。

第一种方法亲测不太好使,有点神经刀,有时候好用有时候还是很慢。吃不得这种苦,还是挂梯子吧。

服务器使用v2raya:Debian / Ubuntu - v2rayA

大概的步骤:

1
2
3
4
5
6
7
8
9
10
11
curl -Ls https://mirrors.v2raya.org/go.sh | sudo bash # 安装v2ray
sudo systemctl disable v2ray --now # 关掉v2ray服务
wget -qO - https://apt.v2raya.mzz.pub/key/public-key.asc | sudo apt-key add - #添加v2raya公钥
echo "deb https://apt.v2raya.mzz.pub/ v2raya main" | sudo tee /etc/apt/sources.list.d/v2raya.list # 添加v2raya软件源
# 安装v2raya
sudo apt update
sudo apt install v2raya
sudo systemctl start v2raya.service
sudo systemctl enable v2raya.service # 可选,设置开机自动运行

# 访问:127.0.0.1:2017,因为是远程服务器,所以要开放这个端口,远程访问,好处就是虽然是无图形化界面的服务器,也可以通过客户端访问图形界面

起了v2raya服务之后添加梯子即可,其他说明参见官方文档。

碰到一个坑爹的问题是:使用”防止dns污染“功能会导致无法识别mirrors.tencentyun.com这些内部域名。解决方案:

  1. 重启一下,服务器好像会自动重置网络。
  2. 找一下dns服务器地址,自行添加hosts、云服务器 内网服务-产品简介-文档中心-腾讯云 (tencent.com)

端口维护

管理云服务器最多的地方应该就是端口的交互了,为了安全起见服务器大部分端口都是关闭状态,比如起了一个3306的服务,但是外界默认是访问不到的。需要到控制台开通端口:

image-20221031163921846

玩转云服务

入门上手云服务器并没有什么门槛,本质上跟自己电脑没什么区别,只是一台可以24小时不停机,且拥有公网资源的电脑而已。主要还是看自己怎么玩。

搭建git服务器

干这个事就是买服务器的初衷来着。虽然就是自己学习着玩,github完全更好用。

之前调研gitlab,不太好使,配置要求太高,建议用gitea:Gitea

步骤记录:参考如何在Ubuntu 18.04安装Gitea myfreax

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1. 准备
sudo apt install sqlite3 git
# 创建一个git用户,下文操作都是基于git用户权限
sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos 'Git Version Control' git

# 2.下载gitea
wget -O /tmp/gitea https://dl.gitea.io/gitea/1.17.3/gitea-1.17.3-linux-amd64 #选择并下载一个二进制版本
sudo mv /tmp/gitea /usr/local/bin

sudo chmod +x /usr/local/bin/gitea

sudo mkdir -p /var/lib/gitea/{custom,data,indexers,public,log}
sudo chown git: /var/lib/gitea/{data,indexers,log}
sudo chmod 750 /var/lib/gitea/{data,indexers,log}
sudo mkdir /etc/gitea
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea

# 3.配置systemd服务
sudo wget https://raw.githubusercontent.com/go-gitea/gitea/master/contrib/systemd/gitea.service -P /etc/systemd/system/

sudo systemctl daemon-reload
sudo systemctl start gitea
sudo systemctl enable gitea
sudo systemctl status gitea

正常情况下完成上述过程就可以打开ip:3000访问gitea网页,如果是远程服务器,这里ip填写公网ip并且记得打开3000端口。

坑:第一次到这里的时候省略了第一步创建git用户,使用自己默认的用户,但是官网给的gitea.service脚本是基于git用户的,如果不按照默认的要更改脚本为匹配信息。其实创建一个专门管理git的用户也挺好的(省事),补回来。

信息看着填就行,后续都可以更改配置文件,数据库这里选择sqlite3,仓库路径/home/git/gitea-repositories.一路往下安装图形界面操作,跳转到登录界面首次注册的用户为管理员,创建仓库,就可以作为服务器供外界访问了。比如我的测试: git clone http://ip:3000/olimi/test.git.

Caddy反向代理

官网。Wiki介绍:

Caddy服务器(或称Caddy Web)是一个开源的,使用 Golang 编写,支持 HTTP/2 的 Web 服务端。它使用 Golang 标准库提供 HTTP 功能。

Caddy 一个显著的特性是默认启用 HTTPS。[3][4]它是第一个无需额外配置即可提供 HTTPS 特性的 Web 服务器。

与Nginx对比最大的特点就是开箱即用,无需配置HTTPS额外配置。

使用步骤:

  1. 安装Caddy.

    1
    2
    3
    4
    5
    
    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    sudo apt update
    sudo apt install caddy
    
  2. 修改配置文件。/etc/caddy/Caddyfile. 下面包括两个服务。每个服务用其域名开头,然后指向内部反向代理的地址即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    miniflux.olimi.icu {
            encode zstd gzip
            reverse_proxy localhost:8080
    }
       
    git.olimi.icu {
            encode zstd gzip
            reverse_proxy localhost:3000
    }
    
  3. 无需考虑SSL证书问题,自动帮你申请证书。

Nginx反向代理

上面测试链接协议为http,是不太安全的,通过配置Nginx反向代理配置SSL加密。步骤记录:

1
2
3
4
5
6
7
# 1.安装nginx
sudo apt-get install nginx

# 2.配置反向代理
# 这里首先需要一个指向服务器ip的域名,如果没有域名,可以随便设一个域名,然后在需要使用的电脑,手动配置host指向该ip
sudo nano /etc/nginx/conf.d/域名.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    server_name 域名;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;
    client_max_body_size 50m;
    # Proxy headers
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    # log files
    access_log /var/log/nginx/git.example.com.access.log;
    error_log /var/log/nginx/git.example.com.error.log;

    # Handle / requests
    location / {
       proxy_redirect off;
       proxy_pass http://127.0.0.1:3000;
    }
}

使用:sudo nginx -t测试语法问题。然后sudo systemctl restart nginx重启服务。

接着修改gitea中的域名配置:

1
2
3
4
5
6
```shell
[server]
DOMAIN           = git.olimi.icu
ROOT_URL         = https://git.olimi.icu/1
```
{: file="/etc/gitea/app.ini" }

Nginx配置SSL证书:因为域名是腾讯云买的,所以直接到腾讯云中申请免费的SSL证书(虽然一直还在审核中..),大概过程是:

img

参考链接:SSL 证书 Nginx 服务器 SSL 证书安装部署-证书安装-文档中心-腾讯云 (tencent.com)

过程:

  1. 下载证书文件
  2. 上传到服务器,使用相对路径可放在nginx.conf同目录下
  3. 配置服务参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
 #SSL 默认访问端口号为 443
 listen 443 ssl;
 #请填写绑定证书的域名
 server_name cloud.tencent.com; 
 #请填写证书文件的相对路径或绝对路径
 ssl_certificate  cloud.tencent.com_bundle.crt; 
 #请填写私钥文件的相对路径或绝对路径
 ssl_certificate_key cloud.tencent.com.key; 
 ssl_session_timeout 5m;
 #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 #请按照以下协议配置
 ssl_protocols TLSv1.2 TLSv1.3;
 ssl_prefer_server_ciphers on;
 location / {
   #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 
   #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
   root html;
   index index.html index.htm;
 }
}
server {
 listen 80;
 #请填写绑定证书的域名
 server_name cloud.tencent.com; 
 #把http的域名请求转成https
 return 301 https://$host$request_uri; 
}

SSL证书

前面配置Nginx反向代理已经提及证书,Nginx可以帮助我们管理SSL通讯,只需要提供证书到Nginx并完成配置即可。

不过前面步骤申请的SSL证书,免费的只针对单个域名,无法提供通配符适配,比如只能申请olimi.icu,不能申请*olimi.icu,所以每个子域名就得单独申请证书,较为麻烦。

方案:使用Let’s Encrypt申请证书(Github.io的证书就是这个签发的)。

Let’s Encrypt renew出现“Challenge failed for domain xxxx” - tlanyan (itlanyan.com)

CentOS 7 上使用Certbot申请通配符证书-阿里云开发者社区 (aliyun.com)

SSH端口转发妙用

基于SSH端口转发能够实现两个场景:

  1. 场景1:云服务部署了一个服务,但可能由于测试阶段等原因,并不想直接暴露到公网,或者不想添加该服务的端口到防火墙中。可利用本地端口转发在本地端测试,使用本地一个端口进行访问,转发到该服务中。
  2. 场景2:本地内网部署了一个服务,暴露给外界访问。其中通过云服务器的公网IP进行一次端口转发,将公网IP和端口(或一个域名)转发到本地内网中服务中。

实现方法如下。测试服务均使用上面的gitea服务。云服务器部署方式见上面,本地内网的gitea服务则直接使用exe包即可。现在有两个电脑:云服务器和本地电脑。

  1. 场景1

测试场景:云服务器部署了gitea服务,按照默认的监听3000端口。这时并不使用HTTPS或暴露3000端口,仅想在本地测试云服务器上3000端口的该服务

1
2
3
# 在本地电脑运行,这里使用了免密登录
ssh -L 4000:localhost:3000 ubuntu 
# 完整命令:ssh -L [host1:]port1:host2:port2 remote_host

原理:将本地机器上的4000端口转发到远程主机上的3000端口,这样就可以通过访问localhost:4000来访问remote_host:3000了

Local Port Forwarding 460*350

  1. 场景2

测试场景:本地部署了gitea服务,能够使用localhost:3000访问该服务。现在想将该服务暴露到公网中。

1
2
3
# 在本地电脑运行,这里使用了免密登录
ssh -R 4000:localhost:3000 ubuntu
# 完整命令:ssh -R [host1:]port1:host2:port2 root@remote_host

原理:使用SSH协议连接到远程服务器ubuntu,并将云服务器的4000端口映射到本地主机的3000端口,这样就可以通过访问云服务器的4000端口来访问本地主机的3000端口上的服务。

Remote Port Forwarding 460*350

注意:

  • 纯粹端口转发,就是将TCP包从一个端口进,通过SSH隧道流向指定的端口。流向如上图所示,较为容易理解。但会碰到一些问题。

  • 有时候连接时提示Warning: remote port forwarding failed for listen port 4000。可能是上次ssh转发连接没彻底关闭,这时候登录云服务器。使用netstat -tunlp |grep 端口号,查看占用端口进程ID,然后使用kill -9 进程ID关闭占用。

  • HTTPS问题。场景1应该不需要考虑HTTPS问题,本身就是本地测试而不暴露公网。但场景2就要考虑HTTPS问题,因为是在公网中使用。HTTPS服务可以考虑上面的方案,比如Caddy。这里HTTPS证书应该部署在本地服务这里,还是在云服务器上呢?答案是云服务器上。因为HTTPS证书签署会绑定域名,如果在本地签署证书,那就会签署到localhost这样的地址,如此一来在公网访问时,访问的是公网IP+端口或域名,跟实际证书就不匹配,这时候浏览器会提示ERR_SSL_PROTOCOL_ERROR报错。正确的做法是本地暴露HTTP服务,然后在云服务器上,对要转发的端口,这里示例就是4000端口,使用Caddy等反向代理,然后签署SSL证书。在公网访问这个域名就不会出错了。

    1
    2
    3
    4
    
    server.olimi.icu {
            encode zstd gzip
            reverse_proxy localhost:4000
    }
    

Reference:

Web知识

实践过程就会碰到许多web相关的知识,很多都有所耳闻,或者大概了解过,通过与实践结合,可以深入了解互联网中各种技术的原理。因为主要是埋个坑,所以放在这个博客中的一部分。

TLS原理

SSL/TLS 原理及抓包详解 - 腾讯云开发者社区-腾讯云 (tencent.com)

The Illustrated TLS 1.3 Connection: Every Byte Explained (xargs.org)

反向代理原理

终于有人把正向代理和反向代理解释的明明白白了! - 腾讯云开发者社区-腾讯云 (tencent.com)

DNS系统

LeanCloud Blog: 域名背后那些事

本文由作者按照 CC BY 4.0 进行授权

【超详细】C++ 编码研究及Windows平台中文编码问题-顺便谈谈IDE

-