【玩转腾讯云】网站-全套服务-从0到1

2020-05-05 00:25:47 浏览数 (2)

TOC

1. 这样开始的...

1.1. 背景

  • 朋友"搞事情",自己有偿帮忙搭了一套线上服务,包括官网小程序后台文档集站点个人博客站点
  • 初期,流量小,节约资金,一切从简,后期,流量大了,再考虑扩容或迁移服务(目前完全能hold住)
  • 基于一台腾讯云服务器搭建了全套服务,站点均在同一个二级域名

1.2. 依赖的服务

1.2.1 腾讯云服务
  • 使用到的腾讯云服务
    • CVM云服务器
    • COS对象存储
    • 网站备案
    • 域名管理, SSL证书
    • 腾讯软件源: mirrors.tencent.com
    • 微信小程序
1.2.2 一个外网账号
  • 用于解决国内访问wordpress官网受限的问题!
    • 方便wordpress主题和插件安装
  • 409 Too Many Requests! 的问题~~~~~

2. 这样设计的...

2.1. 资源&服务

  • web服务均基于容器: 方便部署&迁移,除去准备工作,整套服务部署1天即可完成
  • 资源: 一台CVM云服务器:
    • 2核8G内存
    • Centos 7
  • 服务:
    • 企业官网:
      • 容器独立部署: 基于wordpress:latest镜像
      • 访问域名: www.XXXX.comXXXX.com
    • 企业小程序php后台:
      • 容器独立部署: 基于php:7.2-apache镜像
      • 访问域名: mall.XXXX.com
    • GitBook资料站点:
      • 容器独立部署: 基于fellah/gitbook镜像
      • 访问域名: book.XXXX.com
    • Jekyll技术博客:
      • 容器独立部署: 基于jekyll/jekyll:latest镜像
      • 访问域名: blog.XXXX.com
    • Nginx代理:
      • 宿主机上直接安装部署
    • Mysql服务:
      • 宿主机上直接安装部署

2.2. 部署架构图

  • 架构图 网站部署_150dpi.png image.pngimage.png

3. 这样实践的...

建议登陆腾讯云控制台后,将服务统计➕到快捷访问栏中

image.pngimage.png

3.1. 域名申请&SSL证书

  • 腾讯云官方介绍很详细,跟着说明就可以 官网链接
    • 或参考博文域名注册及域名备案
  • 注意:
    • 网站备案,域名必须是国内的,若已有的域名是在国外注册,得转入
    • “域名转入”比较花时间,朋友本打算把国外的域名转到腾讯云下,但了解后发现,前后得2周多的时间,于是放弃了,直接在腾讯云重新申请了一个新域名
    • 使用腾讯云的“网站备案”服务,那购买的服务器、域名自然得......
    • 在域名申请成功后,直接开始“申请网站”,这样可以节省时间!
  • 截图 image.pngimage.png
  • SSL证书: 支持HTTPS访问 (小程序服务必须支持HTTPS)
    • 直接申请免费的就行
    • 免费的仅1年有效期,过期后需手动续
    • 免费的仅支持单一域名绑定,即www.XXX.com和mall.XXX.com得分别申请两个证书
      • 因此自己申请了4个证书
    • 付费证书可支持二级域名下的子域名(即只要申请一个)
  • 截图 image.pngimage.pngundefined

3.2. 网站备案

  • 为方便备案,可先临时搭建一个简单的web网站,比如gitbook(写一些官网介绍即可)
  • 网站备案,现在很快,三月底申请了一个,2天就过了!
    • 流程直接参考:官网链接
  • 可方便的直接通过小程序进行备案 - 小程序名:腾讯云网站备案 - 截图: image.pngimage.png

3.3. 服务搭建

Wordpress官网的搭建比较实用 下面以官网为例,介绍服务从0到1的实践过程

3.3.1. Nginx服务

通过Nginx配置反向代理,实现单个主机上部署多个web服务

  • Nginx服务直接部署在宿主机上
  • Nginx配置
    • 为方便部署,WordPress的配置文件放在/deploy/nginx/目录下(不是默认的/etc/nginx/下)
    • 需要在nginx.conf配置中添加该路径
  • 自动化脚本
    • 安装nginx,设置开机启动,并添加nginx配置文件路径
代码语言:txt复制
#!/usr/bin/env bash
# 若包含*,则必须加上转义符,防止通配符匹配
NGINX_CONF="/deploy/nginx/*.conf"

add_nginx_conf() {
    [[ "$1x" = "x" ]] && echo "please input confpath" && return
    cat /etc/nginx/nginx.conf | grep -q "${1}"

    if [[ $? -ne 0 ]]; then
        # include /deploy/nginx/*.conf;
        sed -i "/sinclude /etc/nginx/conf.d/*.conf;/a    include ${1};" /etc/nginx/nginx.conf
        [[ $? -eq 0 ]] && echo "add nginx conf path success... [$1]"
    else
        echo "nginx conf path already existed! [$1]"
    fi
}

install_nginx() {
    echo "install nginx ..."
    yum instal nginx -y && 
    echo "enable nginx set-up ..." && 
    systemctl enable nginx && 
    echo "start nginx set-up ..." && 
    systemctl start nginx && 
}

#################################
install_nginx
add_nginx_conf ${NGINX_CONF}
# 加载配置
nginx -s reload
  • nginx配置文件: /deploy/nginx/XXXXX.conf)
    • 支持HTTPS访问,SSL证书放在/deploy/web_ssl/目录下
代码语言:txt复制
server {
    listen       80;
    listen       [::]:80;
    #server_name  _;
    server_name  mall.XXXXX.com www.XXXXX.com XXXXX.com;
    #root         /usr/share/nginx/html;
    return 301 https://$host$request_uri;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
}
####################### www.XXXXX.com && XXXXX.com
####################### 16601
server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  www.XXXXX.com XXXXX.com;
    #root         /usr/share/nginx/html;

    ssl_certificate "/deploy/web_ssl/www.XXXXX.com/Nginx/1_www.XXXXX.com_bundle.crt";
    ssl_certificate_key "/deploy/web_ssl/www.XXXXX.com/Nginx/2_www.XXXXX.com.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:16601;
        proxy_read_timeout 90;
        proxy_redirect http://localhost:16601 https://www.XXXXX.com;
    }
    # error_page 404 /404.html;
    #     location = /40x.html {
    # }

    # error_page 500 502 503 504 /50x.html;
    #     location = /50x.html {
    # }
}
  • 配置更新后需要键入 nginx -s reload 重新加载
3.3.2. Mysql服务
  • mysql数据库部署在宿主机上,所有服务共用同一实例
  • 自动化脚本
    • 安装mysql,设置开机启动,并初始化
    • 需指定root密码:如设置root密码为123456, ROOT_MYSQL_PASSWORD="123456"
代码语言:txt复制
#!/usr/bin/env bash
# set password (default root password: onephone)
ROOT_MYSQL_PASSWORD=""

#############################
echop() {
    echo "[$(date)@codeshold.me] $@"
}

init_mysql() {
    PASSWORD=${ROOT_MYSQL_PASSWORD:-onephone}

    echop "init mysql/mariadb ..."
    yum install expect -y && 
    expect <<EOF
          set timeout 10
          spawn mysql_secure_installation
          expect "Enter current password for root" { send "n" }
          expect {
            "Enter current password for root" { send "$PASSWORDn"; exp_continue }
            "Change the root password" { send "nn" }
            "Set root password" { send "Yn"; exp_continue }
            "New password" { send "$PASSWORDn"; exp_continue }
            "Re-enter new password" { send "$PASSWORDn" }
          }
          expect "Remove anonymous users" { send "Yn" }
          expect "Disallow root login remotely" { send "Yn"}
          expect "Remove test database and access to it" { send "Yn" }
          expect "Reload privilege table" { send "Yn" }
EOF
}

install_mysql() {
    # yum remove mariadb-server mariadb -y
    ps aux | grep -q mysqld
    [[ $? -ne 0 ]] && systemctl start mariadb

    if [[ $? -ne 0 ]]; then
        echop "install mysql/mariadb ..."
        yum install mariadb-server mariadb -y && 
        echop "enable startup ..." && 
        systemctl enable mariadb && 
        echop "start mysql/mariadb ..."
        systemctl start mariadb && 
        init_mysql && 
        echop 'mysql/mariadb install success!'
    else
        echop 'mysql/mariadb already had been installed!'
    fi
}

############################ run #########################
install_mysql
init_mysql
3.3.3. docker-ce服务