如何在阿里云快速部署应用

发布于:5/12/2019, 11:45:38 PM @孙博
技术分享 | 阿里云,Docker,运维
许可协议:署名-非商业性使用(by-nc)

工欲善其事,必先利其器。

想要拥有一个属于自己的站点,又不想花太多钱,肯定会选择一个质优价廉的云服务商,此时在国内的环境下,阿里云就成为了一个不错的选择。

阿里云有以下几个特点:

  • 价格相对低廉。AWS、Azure 等价格都是比较贵的,除了家里有矿,小站长通常不会选择他们
  • 产品相对较广。比如你需要服务器,可以买ECS;需要数据库,有多种RDS;需要加速网络,可以购置CDN、OSS等产品。总之你需要的一般他都有。
  • 支持相对到位。对他的云产品有任何问题,几乎都可以在文档中找到答案,即使是文档中没有的,通过工单系统也可以很快得到解答。
  • 服务相对稳定。我选用阿里云的这些年,基本没有出过太大问题,机器都是稳如老狗。

虽然阿里云的Slogan由高大上的“为了无法计算的价值”改成了略LOW的“上云就上阿里云”,但是阿里云的服务品质并没有一并下降。

这里跟同样选择阿里云的小伙伴简单介绍下我在阿里云部署的经验,主要是如何可以以更低的价格获得更稳定的阿里云服务。


先介绍下需要准备什么。

首先就以 星空Online 为例,大致说下总共购置了哪些服务:

  • VPC(专有网络),划分为 APP、SLB、DATAS 两个网段,分别用来放置应用服务器、内网负载均衡、数据库服务器
  • ECS(云服务器),1核1G的乞丐版就可以,毋庸置疑,必须有服务器才能部署应用,这些服务器均不需要开通外网服务,以节省费用及保证安全。本站为双机负载,为了蓝绿发布总共购置了 4 台(当然除了这个站点外,还有其他的应用也复用了这些机器,所以成本并不高
  • RDS(云数据库),1核1G的 MySQL 5.7,乞丐版的配置基本够用。
  • REDIS,256M的主从版,一年几十块钱,花小钱办大事。
  • EIP(弹性公网),1M的网卡,随便绑定在哪个ECS上,那台ECS即为网关。
  • SLB(负载均衡),根据需要自己随意买,专有网络的不要钱。
  • 容器服务(Swarm版),核心服务!通过Docker部署应用比直接在服务器上部署要有太多好处。
  • 容器镜像服务,用来托管应用的镜像,容器服务必备。
  • 其他杂七杂八的应用就不介绍了,像什么域名、SSL证书、日志服务(SLS)什么的就不特别的介绍了。

除此之外,你还需要一个git代码库,考虑到现在 Github 也向所有人免费开放私库,建议选择将代码托管到 Github 上。


下面说下具体的过程。

如何开发一个网站我就不多说了,这一点相信对看这个文章的朋友来说从来都不会是什么问题。在开发站点中需要使用 RDS 等服务如有问题也可以参照阿里云的文档,我也不多做介绍,本文主要介绍下如何将程序跑起来。

首先需要将EIP绑定某个ECS上,并将域名的A记录指向这个地址,这时你就有了一个接入点。建议找下阿里云的文档“如何自建NAT网关”,或根据自己的Linux知识将这台ECS设定为NAT网关。如果实在搞不定,也可以花钱买NAT服务,由于费用对小站长来说并不低所以我不推荐。NAT网关的作用是使内网下其余机器将发往外网的请求通过这个网关转发出去,以达到节省费用的目的。

然后在这台ECS上部署 Nginx,为了方便后续扩展,也可以选择使用 OpenResty。此时你就有了一个流量的入口。

然后在容器镜像服务中,创建一个私网的命名空间,并基于Github(或其他)创建一个镜像。当你在Github中创建一个Release,并命名为release-v1.0.0这样的格式时,阿里云的容器镜像服务便会自动为你 build 一个 tag 为1.0.0的镜像。

到这一步结束时,你就有了一个运行着 Nginx 的机器、以及一个程序的镜像,此时只差将程序运行起来。

考虑到我们每次部署的机器可能会不同(只买一台ECS的小伙伴可以无视),而将所有ECS的IP全部写死在Nginx配置中的做法又不够灵活,所以我建议通过在专有网络下免费的SLB来代替这个过程。

选择创建专有网络类型的负载均衡之后,就会得到一个固定的内网地址,我们的做法是在Nginx配置中,将网站的转发地址固定写到这个SLB的固定地址上,容器服务每次发布程序时,可以通过简单的配置自动完成负载均衡和容器的绑定,这样我们就不必在每次新版本发布后,再去改Nginx的配置。

我们在容器服务中创建一个集群(Swarm版),然后通过“添加节点”的功能将购置的机器添加到这个集群。然后通过“创建应用”按钮创建程序的配置,在这里要注意,一定要仔细阅读文档,看懂aliyun.lb.port_xxxx这个配置项的使用方法,这个是决定负载均衡与容器绑定的关键!

配置项写完后,就可以启动应用了,如果负载均衡的心跳检测通过的话,容器就会自动加载到负载均衡的后端服务器列表中,此时通过SLB的固定地址+端口,就可以完成对网站的访问了。

那么问题来了,我们的负载均衡是专有网络下的,如何可以在外网访问?这个问题就变得很简单了,只需要在 Nginx 的配置中设定好监听的域名、端口,然后通过 proxy 将请求反代到负载均衡下,就能够通过域名正常的访问站点了。


下面给出本站点用到的部分配置项,以供参考。

nginx.conf
# 其余配置项略

http {
    # 其余配置项略

    upstream www_luckystarry_com {
        server xxx.xxx.xxx.xxx:yyyy; # xxxx为 SLB 的固定地址,yyyy为SLB的监听端口。
    }

    server {
        listen      80;
        server_name www.luckystarry.com;
        return      301 https://$server_name$request_uri;
    }

    server { 
        # Basic
        listen      443;
        charset     utf-8;
        server_name www.luckystarry.com;
        # HTTPS(SSL) 配置细节略
        # Locations
        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_pass          http://www_luckystarry_com;
        }
    }
}
容器服务配置
service-name-x.x.x:
  restart: always
  ports:
  - xxxxx:yyyy/tcp
  # xxxxx 宿主机监听端口,此端口在同一台ECS上不可重复,在多台ECS上可重复
  # yyyy  容器监听端口
  memswap_limit: 0
  labels:
    aliyun.scale: '2'
    # 2 的意思是,每次部署都会在随机两台ECS上启动 2 个容器实例
    aliyun.probe.url: http://container:yyyy/
    # yyyy 为容器监听端口,此处为心跳检测的URL地址,建议配置
    aliyun.lb.port_yyyy: http://slb-name:zzzz
    # yyyy 为容器监听的端口
    # zzzz 为SLB监听的端口
    aliyun.rolling_updates: 'true'
  shm_size: 0
  image: registry-vpc.cn-region.aliyuncs.com/namespace/image-name:x.x.x
  memswap_reservation: 0
  kernel_memory: 0
  mem_limit: 0
  environment:
  - ENVIRONMENT=product
  # 如有环境变量就配置,没有就不配

总之仅通过这些描述,并不是本站完整的配置及部署方案,但是这些内容均为站点部署的核心。一个健康良好的站点除了程序自身的正确之外,还需要一个运维工具,比如接入日志服务、接入听云等APM工具。

在这里只是希望通过我的介绍可以让大家对阿里云部署有个初步的了解。

最后为了给服务器攒“奶粉钱”,请允许我做一个小小的广告,如果有想要购置阿里云云服务的朋友,希望可以用我的邀请链接购置。通过我的邀请,您可以获得优惠,而我可以获得奖励,算是一个双赢的结果。链接如下:

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=oifnap1a