在GCP上搭建Typecho以及GOST代理


一.创建最低配置的虚拟机实例

GCP提供App Engine 以及Compute Engine的部署。

App Engine是GCP提供自动化构建的的实例引擎,配置起来更加简单,收费也会更贵。

Compute Engine是完全手动配置和维护的实例引擎。

  • 选择Compute Engine -> 虚拟机实例来创建一个实例。

  • 根据我自己的测算,选择台湾asis-east结点最稳定,ping延迟在60-70ms之间。

  • 机器类型选择N1系列,配置选择f1-micro(1vcpu,614MB内存)。

  • 操作系统选择Ubutnu18.04(重要) 硬盘为10G硬盘。

  • 防火墙设置点开允许HTTP和HTTPS流量。

费用估算为5美元一个月,另外我还测试过突发实例(价格更低,但是24小时之后自动关机,所以没选择)。

二.配置ssh免密登录

  • 在GCP的虚拟机实例页面点击SSH -> 在浏览器中打开。执行sudo passwd设定root密码,执行su root切换到root账户。
  • 编辑ssh的配置文件vim /etc/ssh/sshd_config,PermitRootLogin 改为yes,PubkeyAuthentication改为yes,AuthorizedKeysFile注释放开。保存后重启ssh服务service sshd restart
  • 编辑存储免密登录key的文件,把自己客户端机器的pubkey(一般在本机的cd ~/.ssh目录下)存入。vim ~/.ssh/authorized_keys

  • 重启ssh服务service sshd restart
  • 用你的本机验证登录即可。

三.搭建Typecho

使用一键建站脚本来搭建环境,这里要介绍几个概念。

lamp 的全称是linux + apache + mysql +phplnmp 的全称是linux + nginx + mysql + php (国外喜欢简称为LEMP,搜英文资料需要搜LEMP)

Nginx 特性Nginx 性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少。

1、相比 Apache,用 Nginx 作为 Web 服务器:使用资源更少,支持更多并发连接,效率更高。

2、作为负载均衡服务器:Nginx 既可在内部直接支持 Rails 和 PHP,也可支持作为 HTTP 代理服务器对外进行服务。Nginx 用 C 编写而成, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

3、作为邮件代理服务器:Nginx 同时也是一款非常优秀的邮件代理服务器(最早开发这个产品的目的之一,是作为邮件代理服务器)。

4、反向代理可以根据url将请求转向于不同用途的集群,比如图片请求,转向图片服务器集群;视频请求,转身视频服务器集群。

nginx是一款轻量级的web服务器/反向代理服务器/电子邮件代理服务器,安装非常简单,配置文件也很简洁(还支持 perl 语法)。

Nginx 支持平滑加载新配置,还能够在不间断服务的情况下进行软件版本升级。

Apache 特性

1、Apache 是 LAMP 架构最核心的 Web Server,开源、稳定、模块丰富是 Apache 的优势。但 Apache 的缺点是有些臃肿,内存和 CPU 开销大,性能上有损耗,不如一些轻量级的 Web 服务器(譬如:Nginx、Tengine等)高效,轻量级的 Web 服务器对于静态文件的响应能力来说远高于 Apache 服务器。

2、Apache 做为 Web Server 是负载 PHP 的最佳选择,如果流量很大的话,可以采用 Nginx 来负载非 PHP 的 Web 请求。Nginx 是一个高性能的 HTTP 和反向代理服务器,Nginx 以其稳定、丰富功能集、示例配置文件和低系统资源的消耗而闻名。Nginx 现能支持 PHP 和 FastCGI,也支持负载均衡和容错,可和 Apache 配合使用,是轻量级的 HTTP 服务器的首选。

3、Web 服务器缓存也有多种方案,Apache 提供了自己的缓存模块,也可以使用外加的 Squid 模块进行缓存,这两种方式均可有效提高 Apache 的访问响应能力。Squid Cache 是一个 Web 缓存服务器,支持高效缓存,可作为网页服务器的前置 cache 服务器缓存相关请求以提高 Web 服务器速度。把 Squid 放在 Apache 的前端来缓存 Web 服务器生成动态内容,而 Web 应用程序只需要适当地设置页面实效时间即可。如访问量巨大,则可考虑使用 memcache 作为分布式缓存。

4、PHP 的加速可使用 eAccelerator 加速器,eAccelerator 是一个自由开放源码的 PHP 加速器。它会优化动态内容缓存,提高 PHP 脚本缓存性能,使 PHP 脚本在编译状态下,对服务器的开销几乎完全消除。它还可对脚本起优化作用,以加快其执行效率。 使 PHP 程序代码执效率可提高 1-10 倍。

至于安装哪个好呢?

要省内存的话lnmp是最好的选择,但似乎不太稳定,有时会比较常502。

静态的多用lnmp还是不错的动态内容多的话,lamp还是最稳定的

参考地址

  • typecho都是大多静态页面,因此我使用lnmp来搭建环境,使用脚本生成来生成安装命令,更详细的教程可以参考教程地址。安装时间可能会比较长,耐心等待。
  • 添加vhost。lnmp vhost add,也就是添加自己的域名。这里需要注意,选择是否使用ssl的时候选择自定义证书位置的选项,稍后在安装gost的时候生成ssl证书,并使用此时生成的证书位置。
  • 安装Typecho
# 下载并解压并跳转到目录
wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz && tar xvzf 1.1-17.10.30-release.tar.gz && cd build 
# 拷贝到nginx设置的域名下
mv * ../../wwwroot/larkin-cn.top/ 
# 赋予用户和组权限 
cd /home/wwwroot/larkin-cn.top/ &&  chown -R www:www *

打开浏览器输入 http://www.larkin-cn.top/install.php。根据提示安装即可

上述的安装是通过lnmp的一键脚本来实现的,也可以通过手动分步骤安装,需要对nginx以及php有一定的了解才可以走通,可以参考国外的国外的LEMP教程

另外通过lnmp的方式安装的nginx的配置文件地址不是/etc/nginx的目录,而是/usr/local/nginx/conf

四.安装gost服务

  • 可以参考我的 另一篇文章,有详细的介绍,这里做简单的补充。下面是install.sh的脚本
    #!/bin/bash

# Author
# original author:https://github.com/gongzili456
# modified by:https://github.com/haoel

# Ubuntu 18.04 系统环境

COLOR_ERROR="\e[38;5;198m"
COLOR_NONE="\e[0m"
COLOR_SUCC="\e[92m"

update_core(){
    echo -e "${COLOR_ERROR}当前系统内核版本太低 <$VERSION_CURR>,需要更新系统内核.${COLOR_NONE}"
    sudo apt install -y -qq --install-recommends linux-generic-hwe-18.04
    sudo apt autoremove

    echo -e "${COLOR_SUCC}内核更新完成,重新启动机器...${COLOR_NONE}"
    sudo reboot
}

check_bbr(){
    has_bbr=$(lsmod | grep bbr)

    # 如果已经发现 bbr 进程
    if [ -n "$has_bbr" ] ;then
        echo -e "${COLOR_SUCC}TCP BBR 拥塞控制算法已经启动${COLOR_NONE}"
    else
        start_bbr
    fi
}

start_bbr(){
    echo "启动 TCP BBR 拥塞控制算法"
    sudo modprobe tcp_bbr
    echo "tcp_bbr" | sudo tee --append /etc/modules-load.d/modules.conf
    echo "net.core.default_qdisc=fq" | sudo tee --append /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee --append /etc/sysctl.conf
    sudo sysctl -p
    sysctl net.ipv4.tcp_available_congestion_control
    sysctl net.ipv4.tcp_congestion_control
}

install_bbr() {
    # 如果内核版本号满足最小要求
    if [ $VERSION_CURR > $VERSION_MIN ]; then
        check_bbr
    else
        update_core
    fi
}

install_docker() {
    if ! [ -x "$(command -v docker)" ]; then
        echo "开始安装 Docker CE"
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
        sudo add-apt-repository \
            "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
            $(lsb_release -cs) \
            stable"
        sudo apt-get update -qq
        sudo apt-get install -y docker-ce
    else
        echo -e "${COLOR_SUCC}Docker CE 已经安装成功了${COLOR_NONE}"
    fi
}

check_container(){
    has_container=$(sudo docker ps --format "{{.Names}}" | grep "$1")

    # test 命令规范: 0 为 true, 1 为 false, >1 为 error
    if [ -n "$has_container" ] ;then
        return 0
    else
        return 1
    fi
}

install_certbot() {
    echo "开始安装 certbot 命令行工具"
    sudo apt-get update -qq
    sudo apt-get install -y software-properties-common
    sudo add-apt-repository universe
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update -qq
    sudo apt-get install -y certbot
}

create_cert() {
    if ! [ -x "$(command -v certbot)" ]; then
        install_certbot
    fi

    echo "开始生成 SSL 证书"
    echo -e "${COLOR_ERROR}注意:生成证书前,需要将域名指向一个有效的 IP,否则无法创建证书.${COLOR_NONE}"
    read -p "是否已经将域名指向了 IP?[Y/n]" has_record

    if ! [[ "$has_record" = "Y" ]] ;then
        echo "请操作完成后再继续."
        return
    fi

    read -p "请输入你要使用的域名:" domain

    sudo certbot certonly --standalone -d $domain
}

install_gost() {
    if ! [ -x "$(command -v docker)" ]; then
        echo -e "${COLOR_ERROR}未发现Docker,请求安装 Docker ! ${COLOR_NONE}" 
        return
    fi

    if check_container gost ; then
        echo -e "${COLOR_ERROR}Gost 容器已经在运行了,你可以手动停止容器,并删除容器,然后再执行本命令来重新安装 Gost。 ${COLOR_NONE}"
        return
    fi

    echo "准备启动 Gost 代理程序,为了安全,需要使用用户名与密码进行认证."
    read -p "请输入你要使用的域名:" DOMAIN
    read -p "请输入你要使用的用户名:" USER
    read -p "请输入你要使用的密码:" PASS
    read -p "请输入HTTP/2需要侦听的端口号(443):" PORT 

    if [[ -z "${PORT// }" ]] || ! [[ "${PORT}" =~ ^[0-9]+$ ]] || ! [ "$PORT" -ge 1 -a "$PORT" -le 655535 ]; then
        echo -e "${COLOR_ERROR}非法端口,使用默认端口 443 !${COLOR_NONE}"
        PORT=443
    fi

    BIND_IP=0.0.0.0
    CERT_DIR=/etc/letsencrypt/
    CERT=${CERT_DIR}/live/${DOMAIN}/fullchain.pem
    KEY=${CERT_DIR}/live/${DOMAIN}/privkey.pem

    sudo docker run -d --name gost \
        -v ${CERT_DIR}:${CERT_DIR}:ro \
        --net=host ginuerzh/gost \
        -L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY}&probe_resist=code:400&knock=www.google.com"
}

crontab_exists() {
    crontab -l 2>/dev/null | grep "$1" >/dev/null 2>/dev/null
}

create_cron_job(){
    # 写入前先检查,避免重复任务。
    if ! crontab_exists "certbot renew --force-renewal"; then
        echo "0 0 1 * * /usr/bin/certbot renew --force-renewal" >> /var/spool/cron/crontabs/root
        echo "${COLOR_SUCC}成功安装证书renew定时作业!${COLOR_NONE}"
    else
        echo "${COLOR_SUCC}证书renew定时作业已经安装过!${COLOR_NONE}"
    fi

    if ! crontab_exists "docker restart gost"; then 
        echo "5 0 1 * * /usr/bin/docker restart gost" >> /var/spool/cron/crontabs/root
        echo "${COLOR_SUCC}成功安装gost更新证书定时作业!${COLOR_NONE}"
    else
        echo "${COLOR_SUCC}gost更新证书定时作业已经成功安装过!${COLOR_NONE}"
    fi
}

install_shadowsocks(){
    if ! [ -x "$(command -v docker)" ]; then
        echo -e "${COLOR_ERROR}未发现Docker,请求安装 Docker ! ${COLOR_NONE}" 
        return
    fi

    if check_container ss ; then
        echo -e "${COLOR_ERROR}ShadowSocks 容器已经在运行了,你可以手动停止容器,并删除容器,然后再执行本命令来重新安装 ShadowSocks。${COLOR_NONE}"
        return
    fi

    echo "准备启动 ShadowSocks 代理程序,为了安全,需要使用用户名与密码进行认证."
    read -p "请输入你要使用的密码:" PASS
    read -p "请输入ShadowSocks需要侦听的端口号(1984):" PORT 

    BIND_IP=0.0.0.0

    if [[ -z "${PORT// }" ]] || ! [[ "${PORT}" =~ ^[0-9]+$ ]] || ! [ "$PORT" -ge 1 -a "$PORT" -le 655535 ]; then
        echo -e "${COLOR_ERROR}非法端口,使用默认端口 1984 !${COLOR_NONE}"
        PORT=1984
    fi 

    sudo docker run -dt --name ss \
        -p ${PORT}:${PORT} mritd/shadowsocks \
        -s "-s ${BIND_IP} -p ${PORT} -m aes-256-cfb -k ${PASS} --fast-open"
}

install_vpn(){
    if ! [ -x "$(command -v docker)" ]; then
        echo -e "${COLOR_ERROR}未发现Docker,请求安装 Docker ! ${COLOR_NONE}" 
        return
    fi

    if check_container vpn ; then
        echo -e "${COLOR_ERROR}VPN 容器已经在运行了,你可以手动停止容器,并删除容器,然后再执行本命令来重新安装 VPN。${COLOR_NONE}"
        return
    fi

    echo "准备启动 VPN/L2TP 代理程序,为了安全,需要使用用户名与密码进行认证."
    read -p "请输入你要使用的用户名:" USER
    read -p "请输入你要使用的密码:" PASS
    read -p "请输入你要使用的PSK Key:" PSK

    sudo docker run -d --name vpn --privileged \
        -e PSK=${PSK} \
        -e USERNAME=${USER} -e PASSWORD=${PASS} \
        -p 500:500/udp \
        -p 4500:4500/udp \
        -p 1701:1701/tcp \
        -p 1194:1194/udp  \
        siomiz/softethervpn
}

install_brook(){
    brook_file="/usr/local/brook/brook"
    [[ -e ${brook_file} ]] && echo -e "${COLOR_ERROR}Brook 已经安装,请检查!" && return
    wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/brook.sh &&\
        chmod +x brook.sh && sudo bash brook.sh
}

# TODO: install v2ray

init(){
    VERSION_CURR=$(uname -r | awk -F '-' '{print $1}')
    VERSION_MIN="4.9.0"

    OIFS=$IFS  # Save the current IFS (Internal Field Separator)
    IFS=','    # New IFS

    COLUMNS=50
    echo -e "\n菜单选项\n"

    while [ 1 == 1 ]
    do
        PS3="Please select a option:"
        re='^[0-9]+$'
        select opt in "安装 TCP BBR 拥塞控制算法" \
                    "安装 Docker 服务程序" \
                    "创建 SSL 证书" \
                    "安装 Gost HTTP/2 代理服务" \
                    "安装 ShadowSocks 代理服务" \
                    "安装 VPN/L2TP 服务" \
                    "安装 Brook 代理服务" \
                    "创建证书更新 CronJob" \
                    "退出" ; do

            if ! [[ $REPLY =~ $re ]] ; then
                echo -e "${COLOR_ERROR}Invalid option. Please input a number.${COLOR_NONE}"
                break;
            elif (( REPLY == 1 )) ; then
                install_bbr
                break;
            elif (( REPLY == 2 )) ; then
                install_docker
                break 
            elif (( REPLY == 3 )) ; then
                create_cert
                loop=1
                break
            elif (( REPLY == 4 )) ; then
                install_gost
                break
            elif (( REPLY == 5  )) ; then
                install_shadowsocks
                break
            elif (( REPLY == 6 )) ; then
                install_vpn
                break
            elif (( REPLY == 7 )) ; then
                install_brook
                break
            elif (( REPLY == 8 )) ; then
                create_cron_job
                break
            elif (( REPLY == 9 )) ; then
                exit
            else
                echo -e "${COLOR_ERROR}Invalid option. Try another one.${COLOR_NONE}"
            fi
        done
    done

     IFS=$OIFS  # Restore the IFS
}

init
  • 需要注意的一点是执行这个脚本前,需要先停掉nginx 服务,不然会有80端口冲突的问题。执行service nginx stop执行完后别忘了启动service nginx start
    • 生成的ssl证书的地址留个备份,然后在vhost中添加的域名的ssl的配置,写入该路径。

五.typecho更换主题

我使用的主题 git地址,免费使用。

声明:Eironn's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 在GCP上搭建Typecho以及GOST代理


Java开发,同时会一些旁门左道。