工欲善其事,必先利其器。
想要拥有一个属于自己的站点,又不想花太多钱,肯定会选择一个质优价廉的云服务商,此时在国内的环境下,阿里云就成为了一个不错的选择。
阿里云有以下几个特点:
虽然阿里云的Slogan由高大上的“为了无法计算的价值”改成了略LOW的“上云就上阿里云”,但是阿里云的服务品质并没有一并下降。
这里跟同样选择阿里云的小伙伴简单介绍下我在阿里云部署的经验,主要是如何可以以更低的价格获得更稳定的阿里云服务。
先介绍下需要准备什么。
首先就以 星空Online 为例,大致说下总共购置了哪些服务:
除此之外,你还需要一个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
将请求反代到负载均衡下,就能够通过域名正常的访问站点了。
下面给出本站点用到的部分配置项,以供参考。
# 其余配置项略
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