实战起来,使用云低成本搭建服务浅谈

2016-01-12 15:38:13 +08:00
 112xiangtao

和朋友做了一个产品( bugclose ),从产品设想到公测上线仅用了一个半月,并且具有成为一个支持百万用户和数千并发的中型网站的潜力。这一切,很大程度上归功于阿里云的服务架构,使得我们能够在从起步到规模扩大的过程中,持续升级,按需付费,网站具有很好的伸缩性。这篇文章想为正准备使用阿里云的程序猿们提供一些经验和建议,当然也要声明的是,本文及续篇只是谈一下在当前的云环境下怎么方便的搭建一个应用,不是为阿里云做广告,关于阿里云与其他云设施的价格及性能的比较,本文不做评价。

首先说一下网站的简单架构,网站基本上由后端 API 服务和前端 H5 页面构成,没有服务器页面。另外还有一个博客,采用的是 wordpress 。后端 API 服务采用的技术是 Java ,采用了 Hibernate 和 Spring 框架。做成 API 服务是为了同时适配前端的 H5 页面和移动应用(将来会做)。我的经验是,在做复杂的后端逻辑处理时, Java 是比较好的选择,可能其性能不如 Node.js 这种异步框架,但处理逻辑我还是建议用同步,思路上要清晰得多;至于性能方面的损失,可以通过负载均衡找回来。

为什么不做 JSP 或 PHP 等服务器页面?一是因为我想让前端和后端能独立的开发,不把后端脚本和前端脚本混在一起;二是因为做服务器页面会带来复杂度,虽然可能让前端的开发量降低一点(例如不需要写过多的 DOM 操作),但是不纯粹的页面会让代码杂乱无序,反而加重了前端的工作量。还有一个问题?没有服务器页面,前端做页面包含怎么做?很好解决,用 nginx 服务器,天然支持 SSI ,而且不需要改成难看的 shtml 或 php ,就像这样的:

nginx 配置:

server {

location / {

ssi on;

                 ssi_silent_errors on;

}

}

前端页面:

<!—#include virtual=“/tpl/header.html ”—>

注意:这里一定要用 virtual ,用 file 在某些情况下可能无效。我没有仔细研究,但当我的 Web 服务是负载均衡的后端服务时,写成 file 并使用相对路径是不行的,有研究的高手可以帮忙解释一下。

好了,闲话少叙,进入正题。先说说我们采用了哪些阿里云的服务:

ECS ,用来做应用服务器(Tomcat)和 Web 服务器(Nginx);另外我们还用 ECS 做一个邮件发送服务器;
RDS ,数据库服务;
OSS, 对象存储服务,用来存储图片,文件;
Memcached ,缓存服务,用来缓存热点数据;
Redis , KV 数据服务,用来存储 Session 数据等;
邮件推送服务,用来发送 Bug 提醒邮件等,目前我们准备了两套邮件推送服务,一是自己搭建邮件发送服务器,二是使用阿里云的邮件推送服务,到底用哪个,到时看看成本和送达率吧;
SLB, 负载均衡服务。

这篇文章先说一说 ECS ,如何选择以及如何安装必要的软件。

1 地域选择,主要取决于你的应用服务于哪些区域以及该区域的网络质量,如果你要服务于米国人民或者世界公民,那没说的,选择美国硅谷;若主要用户都在国内,则下面的大陆城市都可以选;然后还要看一看你需要的阿里云的其他服务在你所选择的地域里是否存在,如果不存在,则只能选其他城市了,因为这些区域的内网是互不相连的;最后,还要比较一下价格,看看是否选择别的城市更划算,当然,如果你只做一个针对华北地区的应用,那北京,青岛就要优先选择了。
http://ww4.sinaimg.cn/mw690/69ef7aeejw1ezwqyzt3y0j21js03ejrs.jpg

2 可用区选择,一个地域可能有多个可用区,同一个区域的可用区内网是连通的,所以选择任何一个都可以。分为多个可用区的目的是为了可用性,即多个可用区之间是故障隔离的。所以如果你有多个后端服务器,把他们分布在不同的可用区吧。
http://ww1.sinaimg.cn/mw690/69ef7aeejw1ezwqz02wslj21js05z74y.jpg

3 实例系列和实例规格,根据应用目前的负载去选吧,反正以后可以平滑升级。
http://ww2.sinaimg.cn/mw690/69ef7aeejw1ezwqz0ao26j21js0n3q5f.jpg

4 带宽,如果你的 ECS 用来做后端负载(前面有阿里的负载均衡 SLB ),那就保留最小带宽 1M 用来管理服务器上传应用即可。建议大家使用负载均衡,让 ECS 来做应用应该做的事,而且负载均衡提供了 ECS 对外的网络隔离( SSH 的端口除外)。
http://ww3.sinaimg.cn/mw690/69ef7aeejw1ezwqz137qlj21js08c3z8.jpg

5 镜像,简单的说就是服务器装什么系统,镜像市场还包括一些配置好的软件运行环境,省去你去安装配置软件的功夫。

当然,本人还是建议使用公共镜像,一是可以安装最新的运行环境,二是镜像市场提供的运行环境把目录给你装的乱七八糟,还不如干干净净的自己安装使用默认的目录。至于选择什么系统见仁见智,本人倾向于选择 CentOS7.0 ,因为可以用 yum ,特别是通过 yum 能安装 tomcat ,这是我最喜欢的,否则,且配置去吧。
http://ww4.sinaimg.cn/mw690/69ef7aeejw1ezwqz0r5slj21js0bk75x.jpg

6 存储,我就选择默认的,因为 ECS 主要是用来做计算的,不要在 ECS 存储数据库或者用户文件,高效云盘对我来说也没啥用, Web 文件都被缓存了,磁盘的 IO 是很小的。

7 密码,使用复杂一点的密码吧,然后取一个容易记的名字。
购买完毕后,使用一个远程终端软件(如 XServer 或 vSSH ),可以去安装必要的软件,对于我来讲,需要安装 Nginx, JDK , Tomcat:

yum install nginx

yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64

yum install tomcat

chkconfig nginx on

chkconfig tomcat on

安装完成后,就可以通过 FileZilla 等支持 SFTP 的软件把应用或网页传到相应的目录了,我把 java 应用放到了 /usr/share/tomcat/webapps 下, web 应用放到了 /var/www 下。

配置文件的更改, tomcat 主要要修改 /usr/share/tomcat/conf/server.xml :

<Connector port=” 8080 ″ protocol=” HTTP/1.1 ″

connectionTimeout=” 20000 ″

redirectPort=” 8443 ″ URIEncoding=” utf-8 ″/>

主要是为了支持 URL 的中文编码。

nginx 主要要修改 /etc/nginx/nginx.conf:

location / {

root /var/www;

}

为了在 web 页面通过 ajax 调用后端 API 服务(通过 tomcat 实现), nginx.conf 还需要配置如下内容:

http {

设定负载均衡的服务器列表

upstream tomcat_server {

server localhost:8080;

}

server {

location /cgi/ {

proxy_pass http://tomcat_server/cgi/;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header REMOTE-HOST $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 10m;

client_body_buffer_size 128k;

proxy_connect_timeout 90;

proxy_send_timeout 90;

proxy_read_timeout 90;

proxy_buffer_size 4k;

proxy_buffers 4 32k;

proxy_busy_buffers_size 64k;

proxy_temp_file_write_size 64k;

}

}

}

这样,在页面中就能通过 /cgi/…来调用后端 API 服务了。

如果想支持更多的 tomcat 的负载均衡,在 tomcat_server 里再加上服务器地址吧。

再来说说博客,可以把 wordpress 装在另一台服务器上,这里为了简单和节省,装在同一台服务器上吧,先安装必要的运行环境:

yum install php-fpm php-mysql php-mbstring php-gd php-pear php-mycrpt php-hash php-accelerator php-suhosin php-tidy php-curl

chkconfig php-fpm on

这里没有安装 mysql-server ,因为我想用 RDS 来安装 wordpress 的数据库。

centos 的 php-fpm 默认是配合 apache 使用的,需要改成 nginx ,在 /etc/php-fpm.d/www.conf 里:

user = nginx

group = nginx

把 wordpress 解压到 /var/wordpress , nginx 里的配置如下:

server {

location /blog {

alias /var/wordpress;

index index.php index.html index.htm;

if (-f $request_filename/index.html){

rewrite (.*) $1/index.html break;

}

if (-f $request_filename/index.php){

rewrite (.*) $1/index.php;

}

if (!-f $request_filename){

rewrite (.*) /blog/index.php;

}

}

location ~ /blog/.+.php.*$ {

if ($fastcgi_script_name ~ /blog/(.+.php.*)$) {

set $valid_fastcgi_script_name $1;

}

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /var/wordpress/$valid_fastcgi_script_name;

include fastcgi_params;

}

}

这样,访问 http://www.bugclose.com/blog 就可以访问博客了,对于您自己的网站,第一次访问需要配置 wordpress ,这里就不一一详述了。

好了,阿里云实践之旅第一部分就写这么多,内容很浅显,读者如果对后续文章感兴趣,本人就继续写下去。

2044 次点击
所在节点    数据库
21 条回复
chinafeng
2016-01-12 15:49:58 +08:00
Mark ,很有帮助,不过这样涉及到环境迁移就很麻烦了,毕竟可选的就那么几个云
112xiangtao
2016-01-12 15:57:53 +08:00
@chinafeng 这些服务以后基本都会成为标配:)
kslr
2016-01-12 16:01:10 +08:00
你的技术还停留在上个世纪
BOYPT
2016-01-12 16:01:25 +08:00
话说 V2EX 的排版真是让人无所适从,,
lemayi
2016-01-12 16:16:52 +08:00
@kslr 毫无其他意思,真心问下最新流行的是啥技术?
112xiangtao
2016-01-12 16:18:49 +08:00
@kslr 哈哈 上个世纪的技术解决这个世纪的问题
WildCat
2016-01-12 16:22:48 +08:00
> 为什么不做 JSP 或 PHP 等服务器页面?一是因为我想让前端和后端能独立的开发,不把后端脚本和前端脚本混在一起;二是因为做服务器页面会带来复杂度,虽然可能让前端的开发量降低一点(例如不需要写过多的 DOM 操作),但是不纯粹的页面会让代码杂乱无序,反而加重了前端的工作量


PHP 真是躺枪
112xiangtao
2016-01-12 16:31:51 +08:00
@WildCat 嘿嘿 我们没有 php 程序员
dphdjy
2016-01-12 20:35:46 +08:00
(ಥ_ಥ) 这不是软广吗~难道我姿势不对~
qile1
2016-01-12 21:17:47 +08:00
楼主,问下,最近申请了一个 ecs ,里面直接安装 wdcp ,自带 mysql 和 web 服务,用自带的 phpayadmin 可以连接数据库, ssh 也可以打开数据库,但是 wp 配置无法连接 musql 数据库,用 localhost 和 172.0.0.1 都试过,无法连接数据库。不知道是什么原因?
6IbA2bj5ip3tK49j
2016-01-12 21:23:01 +08:00
感觉就是搜索“ xxx 搭建”,然后跟着入门教程走。
搭建完就是这样了。
ryd994
2016-01-12 21:33:31 +08:00
你如果写 ssi 你会怎么写?
ssi 的路径是相对于当前路径的
ishamo
2016-01-12 21:42:35 +08:00
@qile1 感觉是你的 wp-config.php 里面写的不对。可以开调试看看详细信息。
msg7086
2016-01-12 21:52:58 +08:00
可能只有我一个人觉得国内的云价格极其昂贵。
可能只有我一个人觉得 Java 占用资源很多。
可能只有我一个人觉得 HTTP 的最新版本不是 5 。
可能只有我一个人觉得 yum 不如 apt 之类的好用。
可能只有我一个人觉得 Markdown 不难。
strwei
2016-01-12 22:07:02 +08:00
jsp
ipconfiger
2016-01-12 22:16:14 +08:00
@kslr 说上世纪有点夸张了, 不过确实够 out 的了
mengskysama
2016-01-13 00:14:06 +08:00
我认为这种架构存在大量的浪费

1 、后期运维成本包括迁移,尤其是后期机器上环境以及服务越来越多的情况下。
2 、服务器资源浪费、一台实例可以运行若干个实例(前提是之间互不影响,但是如果按照这种模式,问题 1 就会越来越严重,甚至会出现版本软件资源之间冲突等等。。
3 、伸缩自由度不够高,不能很好地根据负载情况来申请实例,例如业务激增需要增加实例、后端故障需要摘掉。

个人认为 Docker+容器编排技术来架构更合适。
mengskysama
2016-01-13 00:21:13 +08:00
而且个人感觉 PHP 也没啥大问题,虽然我不用。现在的 PHP 框架都是 MVC 的, Laravel 这种做 API 做 API 妥妥的、甚至之前公司还 PHP 做页游后端开发的。。。
iyaozhen
2016-01-13 01:09:32 +08:00
感觉本来挺简单和自然的事情被你说的那么复杂。各种槽点
TerranC
2016-01-13 01:28:31 +08:00
@kslr 同问一下现代化的方案指的什么?真心求教点拨

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/250163

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX