V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
112xiangtao
V2EX  ›  数据库

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

  •  
  •   112xiangtao · 2016-01-12 15:38:13 +08:00 · 2131 次点击
    这是一个创建于 3234 天前的主题,其中的信息可能已经有所发展或是发生改变。

    和朋友做了一个产品( 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 ,这里就不一一详述了。

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

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


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

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

    个人认为 Docker+容器编排技术来架构更合适。
    mengskysama
        18
    mengskysama  
       2016-01-13 00:21:13 +08:00
    而且个人感觉 PHP 也没啥大问题,虽然我不用。现在的 PHP 框架都是 MVC 的, Laravel 这种做 API 做 API 妥妥的、甚至之前公司还 PHP 做页游后端开发的。。。
    iyaozhen
        19
    iyaozhen  
       2016-01-13 01:09:32 +08:00
    感觉本来挺简单和自然的事情被你说的那么复杂。各种槽点
    TerranC
        20
    TerranC  
       2016-01-13 01:28:31 +08:00 via iPhone
    @kslr 同问一下现代化的方案指的什么?真心求教点拨
    ryd994
        21
    ryd994  
       2016-01-13 02:05:46 +08:00
    @lemayi
    @TerranC
    我猜,他指的是 SSI 。我能查到的最早的关于 SSI 的文档是 95 年 NCSA httpd 文档。似乎实际上更久。

    @112xiangtao
    关于 file 不对的问题,你应该 ssi_silent_errors off;并检查错误信息,我认为是路径问题。
    ‘’‘
    "virtual" specifies the target relative to the domain root, while "file" specifies the path relative to the directory of the current file. When using "file" it is forbidden to reference to absolute paths. Higher directories (..) are usually forbidden, unless explicitly configured. The Apache documentation recommends using "virtual" in preference to "file".
    ’‘’
    Cite Wikipedia
    可见通常 virtual 更方便维护。除非你目录结构很严谨,同一个程序模块都放在同一个目录下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5400 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:31 · PVG 16:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.