在腾讯云上搭建开发环境,配置科学上网

Published:

之前为了翻墙购买了 Vultr 的 VPS,顺便在上面搭建了本站,但是最近访问 Vultr 日本节点貌似不太稳定,导致有些小伙伴访问本站时不时的无法访问,因此就有了把本站迁往国内服务器的想法。基于各种原因的考虑,最终选择了腾讯云。这篇文章中,先给大家介绍一下在腾讯云上搭建开发环境,配置科学上网,安装 Git, zsh, nginx, Node.js 等等。后续的文章会给大家介绍如何利用 nginx, Node.js 搭建一个 HTTPS 的个人站点。

登录

首先是登录,有好奇的同学就要问了,登录腾讯云服务器有什么问题,直接 ssh root@xxx.xxx.xxx.xxx 然后输入密码不就行了么,这里想说的是必须要 ssh 记住密码,不能每次敲 ssh 的时候都得要输入密码,这是个让人很不舒服的事情,主要就是通过 ssh-keygenssh-copy-id 两条命令就好了,具体如下:

1、通过 ssh-keygen 产生 RSA 公私密钥对

ssh-keygen

一路回车(可以修改生成的文件名,我这里修改成了 id_rsa_tencentclound),之后会在 ~/.ssh 文件夹下生成 id_rsa_tencentcloundid_rsa_tencentclound.pub 两个文件,

2、在 ~/.ssh 目录下创建 config 文件,添加如下内容,如果已有 config 文件,直接添加如下内容即可:

Host tencentcloud
    HostName xxx.xxx.xxx.xxx
    IdentityFile ~/.ssh/id_rsa_tencentclound
    User root

其中 tencentcloud 是你给这个服务器自定义的一个别名,这个名字可以随便起,之后可以直接 ssh tencentcloud 来登录服务器;xxx.xxx.xxx.xxx 就是腾讯云服务器的 IP;root 就是腾讯云服务器登录的账户,一般都是 root 用户;~/.ssh/id_rsa_tencentclound 就是第一条 ssh-keygen 产生的那个文件的路径(这个文件可以在 ssh-keygen 命令的时候修改名字)。

3、用 ssh-copy-id 把公钥复制到远程主机上

ssh-copy-id -i ~/.ssh/id_rsa_tencentclound.pub root@xxx.xxx.xxx.xxx

这样一来,我们就可以通过 ssh tencentcloud 直接登录腾讯云服务器了,免去了每次输入密码的烦恼,你也可以配合一些例如 Alfred 之类的工具来实现快速登录。当然这样在本地配置能够行得通是需要对服务器的 /etc/ssh/sshd_config 做一些配置的,把如下这一行的注释去掉

AuthorizedKeysFile .ssh/authorized_keys

好奇的同学可以看看这个文件,里面的内容就是我们刚才通过 ssh-copy-id 上传过去的公钥内容。

locale 问题

登录到服务器后,如果服务器是 CentOS,那么可能会在命令行出现如下 warning

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

然后我们在服务器上输入 locale,返回如下内容:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.utf8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

在本机 Mac 上输入 locale,返回如下:

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

可以发现,本地 Mac 的 LC_CTYPE 和远程服务器的 LC_CTYPE 没有对应上,远程服务器上的 LC_CTYPEUTF-8, 而这个值对任何系统来说都是不存在的。因此这里我们不允许把本地的 locale 发送到远程服务器就好了,注释掉 /etc/ssh/ssh_config 文件里的 SendEnv LANG LC_* 这一行即可。

安装配置 Shadowsocks, Privoxy 实现科学上网

进到服务器以后,我们需要安装很多软件,例如 gitzshnginxNode.js 等等。但是我们都知道,腾讯云是国内的云服务商,既然是国内,那么就会有一堵墙。。。因此我们首先需要的是配置科学上网。当然这里需要你有一个国外的 VPS 服务商,相当于是把腾讯云服务器作为客户端。我选择的操作系统是 CentOS,具体步骤如下(其他操作系统的安装原理一样,只是命令可能会有不同,这里就不详细介绍了):

1、安装 Shadowsocks 客户端

# 安装 epel 扩展源
sudo yum -y install epel-release
# 安装 Python 包管理工具 pip 
sudo yum -y install python-pip
# 更新 Python 包管理工具 pip 
sudo pip install --upgrade pip
# 安装 Shadowsocks 客户端
sudo pip install shadowsocks

2、配置 Shadowsocks 客户端

  • 新建配置文件
sudo mkdir /etc/shadowsocks
sudo vi /etc/shadowsocks/shadowsocks.json
  • 添加配置信息
{
    "server":"xxx.xxx.xxx.xxx",
    "server_port": 8888,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "*******",
    "timeout": 300,
    "method": "aes-256-cfb",
    "workers": 1,
    "fast_open": false
}

参数说明:

参数名 说明
server Shadowsocks 服务器地址
server_port Shadowsocks 服务器端口
local_address 本地 IP
local_port 本地端口
password Shadowsocks 连接密码
timeout 等待超时时间
method 加密方式
workers 工作线程数
fast_open 是否开启 fast_open 以降低延迟,要求 Linux 内核在 3.7+。开启方法 echo 3 > /proc/sys/net/ipv4/tcp_fastopen
  • 启动 Shadowsocks
sslocal -c /etc/shadowsocks/shadowsocks.json

这里我们发现,这样启动 Shadowsocks 是会挂起的,我们必须另外开一个命令行来继续我们的事情,稍安勿躁,这个问题我们之后解决,我们先继续来配置。

  • 验证 Shadowsocks 客户端是否正常安装以及运行
curl --socks5 127.0.0.1:1080 http://httpbin.org/ip

如果返回如下信息,那么说明安装运行正常:

{
  "origin": "xxx.xxx.xxx.xxx"  # Shadowsock 服务器 IP
}

如果不正常,那么就按照错误信息去 Google 搜索一番。。。

3、安装 Privoxy

我们知道,Shadowsocks 是一个 socket5 服务,但是我们访问网站走的是 http/https 协议,因此我们需要使用 Privoxysocket5 流量转到 http/https 上。

# 安装
sudo yum -y install privoxy

4、配置 Privoxy 并启动

sudo vi /etc/privoxy/config
# 确保如下两行没有被注释,如果被注释了,去掉注释即可,如果没有下面两行中的任一行,加上即可。
listen-address 127.0.0.1:8118
forward-socks5t / 127.0.0.1:1080 .
# 启动
sudo privoxy /etc/privoxy/config

其中 listen-address 127.0.0.1:8118 中的 8118 是默认端口,不需要修改;forward-socks5t / 127.0.0.1:1080 . 中的 1080 是之前配置 Shadowsocks 客户端时那个配置文件里的 local_port 对应的值,在这里这个值是 1080

5、设置 http/https 代理

sudo vi /etc/profile
# 添加如下信息,这里的 8118 端口与之前 /etc/privoxy/config 文件中的 listen-address 配置的端口一致
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
# source file 使之生效
source /etc/profile

6、验证是否能科学上网

wget www.google.com

满心欢喜敲入以上命令,发现一直在 awaiting response...,瞬间感觉到有点心灰意冷,是不是哪一步做得不对?其实不是,我们的配置没错,这里不生效是由于 CentOS 的防火墙导致的,这个 ISSUE 有详细的介绍,这里我直接给大家解决方案了。

firewall-cmd --zone=public --add-port=xxxx/tcp --permanent
firewall-cmd --zone=public --add-port=xxxx/udp --permanent

xxxxshadowsock 配置文件 /etc/shadowsocks/shadowsocks.json 里的 server_port,如果运行命令报 FirewallD is not running 的错误,那是由于防火墙没开的原因,运行 systemctl start firewalld 打开即可。如果还不行,试试清空防火墙规则 sudo iptables -F。清空了以后还是不行的话,试试把 /etc/shadowsocks/shadowsocks.json 配置文件里的 fast_open 设置成 false 试试(我的内核在 3.7+,一开始设置的 ture,怎么都不行,然后改成 false 就可以了)。如果最后还是不行,那么 Google 吧。。。

7、更加优雅的切换 ShadowsocksPrivoxy

到这一步,相信大家都可以科学上网了,不信可以试试 wget www.google.com。但是我们发现很不方便,每次要想科学上网,必须得开启 ShadowsocksPrivoxy,而且 Shadowsocks 还是挂起的,必须还得再开一个命令行才行。同时还要注意 /etc/privoxy/config 里的 listen-address, forward-socks5t 这两个配置,需要科学上网时开启,不需要时还要注释掉,避免把 VPS 的流量用光了。。。感觉非常蛋疼。所以我们需要一种更优雅的方式来解决这个问题(这种方式的原理是使 Shadowsocksprivoxy 一直运行,然后通过设置 http_proxy, http_proxys 环境变量来切换)。

  • 在主目录下新建 ssstart.sh,内容如下:
#! /bin/bash

# nohup 挂起 Shadowsocks 进程,使之一直运行
nohup sslocal -c /etc/shadowsocks/shadowsocks.json >/dev/null 2>&1 &
# 启动 privoxy
sudo privoxy /etc/privoxy/config

新建 ssstart.sh 后,设置可执行:

chmod +x ~/ssstart.sh
  • 在当前 shell 的 profile(.bashrc.zshrc/etc/profile)里,实现两个函数,分别用于开启代理与关闭代理
function ssstart() {
    export http_proxy=http://127.0.0.1:8118;
    export https_proxy=http://127.0.0.1:8118;
}
function ssstop() {
    unset http_proxy https_proxy
}

使刚才修改的 profile 生效:

source /etc/profile

现在执行一次 ssstart.sh,之后想要科学上网时,直接在命令行输入 ssstart 即可,关闭时输入 ssstop 即可,可以通过 echo $http_proxyecho $https_proxy 来查看环境变量是否正确设置,可以通过 ps aux |grep sslocal |grep -v "grep" 来查看 Shadowsocks 进程。

之后再重新登入腾讯云服务器时,需要重新执行 ssstart才能实现科学上网,如果有开机自启动需求的同学,可以直接在 /etc/rc.local 文件中添加命令即可。

在科学上网这一部分,我们也算是比较令人满意的完成了配置,小结几个命令:

# nohup 挂起 Shadowsocks 进程,使之一直运行
nohup sslocal -c /etc/shadowsocks/shadowsocks.json >/dev/null 2>&1 &
# 启动 privoxy
sudo privoxy /etc/privoxy/config
# 验证 `Shadowsocks` 客户端是否正常安装以及运行
curl --socks5 127.0.0.1:1080 http://httpbin.org/ip
# 检测 Shadowsocks 和 Privoxy 的进程
ps aux | grep -E 'sslocal|privoxy' | grep -v "grep"
# 开启代理设置
ssstart
# 关闭代理设置
ssstop
# 查看代理设置    
echo $http_proxy && echo $https_proxy

源码安装 git

通过 yum 安装 git 就不说了,很简单,一行命令的事情,这里我们主要说一下从源码安装 git 的步骤。

1、安装依赖包

sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
sudo yum install gcc perl-ExtUtils-MakeMaker

2、卸载旧的 git 版本

sudo yum remove git

3、下载源码

cd /usr/src
# 这一步就能体会到科学上网的重要性了~~~
wget -O git.zip https://github.com/git/git/archive/master.zip
unzip git.zip
cd git-master/

4、编译和安装

make prefix=/usr/local/git all
make prefix=/usr/local/git install

5、加入 PATH

echo 'export PATH=$PATH:/usr/local/git/bin' > /etc/profile.d/git.sh
source /etc/profile
# 或者 
echo 'export PATH=$PATH:/usr/local/git/bin' >> /etc/bashrc
source /etc/bashrc

6、修复可能的错误

执行 git 时可能会碰到 error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory 这样的错误,去 /usr/local/lib 目录查看文件是存在的,解决方案为,在 /etc/ld.so.conf 新增一行 /usr/local/lib,然后运行 /sbin/ldconfig

7、运行

git --version

安装 zshoh my zsh

个人比较喜欢 zsh 所以这里,介绍一下如何安装 zsh

1、安装

sudo yum -y install zsh

2、查看 bin 下是否有 zsh 包

cat /etc/shells

如果安装成功,返回里应该有 zsh

/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh

3、切换默认的 shellzsh

chsh -s /bin/zsh

4、查看当前的 shell,已经被切换为 zsh

echo $SHELL

5、安装 oh-my-zsh

# 如果遇到网络不顺畅,记得我们开启我们之前配置的科学上网哦
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

安转后,shellzsh 了,可能会发现之前我们配置的科学上网的那两个函数无法使用了,只需要将之前配置在 /etc/profile 里的 ssstartssstop 两个方法复制到 .zshrc 文件中同时 source .zshrc 就可以了。

现在可以在 .zshrc 增加你个人喜好的配置了,themes, alias, plugins 等等。这里单独介绍一下安转 autojump 插件。

sudo yum install autojump

# 这一步很重要,autojump 文章也说了,RedHat, Fedora, CentOS 等系统需要安装这个 rpm 包,
# 仅仅只安装 autojump 是不够的
sudo yum install autojump-zsh

vi ~/.zshrc

# 在 plugins=(xxx) 里 添加 autojump
# plugins=(xxx xxx autojump)

source ~/.zshrc

如果不生效,重新登出然后再登入服务器即可。

源码安装 nginx

同样,nginx 我们也选择从源码来安装。

1、安装依赖

sudo yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

2、下载 nginx 包并解压

# 速度很慢?试试之前配置的科学上网
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -zxvf nginx-1.12.2.tar.gz

3、配置并编译

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre
make 
make install

4、把 nginx 配置到环境变量

# 当前我的 shell 是 zsh
vi ~/.zshrc
# 在最后加上如下内容
export PATH=$PATH:/usr/local/nginx/sbin

5、问题

当我们做完以上步骤,开启 nginx 服务时,我们发现 nginx 的确是启动了,但是其他任意机器都无法访问我们的地址。这是为什么呢,回想一下,我们之前在配置 Shadowsocks 设置过防火墙,那么是不是防火墙的原因呢?我们当时设置的是我们的 /etc/shadowsocks/shadowsocks.json 里配置的 server_port,而 nginx80 端口的。我们首先来看一看防火墙的端口开放情况:

sudo firewall-cmd --list-all

返回如下:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports: 8888/udp 8888/tcp   
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

我们可以看到在 port 这里,是我们之前配置的端口 8888,但是没有 80,所以这里我们加上试一试,添加规则的命令和之前一样,只是端口换成了 80

firewall-cmd --permanent --add-port=80/tcp

然后在运行 sudo firewall-cmd --list-all 看一看,返回如下:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports: 8888/udp 8888/tcp 80/tcp
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

80 端口加上了,然后我们再访问一下我们的 ip,发现可以访问了,顺利的看到了 nginx 的欢迎页面~

安装 Node.js

安装 Node.js 比较简单,不再详细介绍了。这里我们推荐通过 nvm 来安装(查看官网文档即可),日后也方便对 Node,js 版本可控,需要注意的是安装完成后,需要 source 一下你的 shell profile,我这里是 source ~/.zshrc。(如果速度慢,可以开启科学上网哦~)

结尾

至此,本篇文章要介绍的内容已经全部讲完了,希望大家按照这篇文章的步骤,能够顺利的在腾讯云上搭建开发环境,配置科学上网。之后将为大家介绍 nginx 代理转发 Node.js 服务以及为你的网站开启 https