创世神域

Nothing is impossible.

@Puteulanus3年前

04/2
19:27
学习心得

在Heroku上运行签到站

2015年5月22日更新:

1.使用www.tunnel.org.cn新加坡节点作为ngrok服务器

2.增加cron脚本使用的搜图服务避免抽风

3.在每轮循环中访问Heroku地址,避免搜图抽风时需要执行的程序不执行

4.运行脚本增加每小时重启ngrok的功能,增强稳定性

5.替换需要登录的OSC仓库为Github

注意:

由于之前的ngrok服务已经失效,ngrok地址改为 https://名字.phiui.com

脚本只是辅助防休眠,自己给Heroku地址加个云监控更靠谱

由于自动休眠的存在,算是非稳定服务,而且本身Heroku自己的地址有些地方访问很慢甚至被墙,不建议作为提供公众服务的网站使用

 

最近啃了几个Heroku的buildpack,对它的环境稍稍有了些了解,试着改了改官方的buildpack-php,加上了ngrok和防休眠。

Heroku使用git部署代码,最方便的解决方案是在Cloud9上部署应用。

先来说说主要的坑吧,看教程的可以跳到下面去。

Heroku因为不限流量和原生支持https,早年貌似被大量挂过代理,导致现在一些地方访问和Openshift一样是被墙的。我修改了官方的 heroku-buildpack-php ,在安装脚本中加入了ngrok(参考的 heroku-buildpack-ngrok ),使用 Tunnel 的服务让网站出口变为国内。这样好处是,国内访问基本没问题了,而且不使用Heroku自己的Web服务可以顺便避开官方对每个IP在一段时间第一次访问投放的广告。坏处也有,没法绑定自己的域名了,只能使用Tunnel的二级域名。

Heroku不像Openshift可以直接把代码传到空间里去,代码的储存和运行是分离的。Web应用没有访问的话1小时会自动休眠,可以靠Web访问唤醒。休眠的时候实际上运行环境是已经被删除掉了的,在唤醒时会从代码储存空间拉取代码重新部署。所以Heroku实际上是介于本地可写和本地不可写之间,一方面临时文件什么的存在本地完全没有问题,另一方面如果是重要的配置文件存在运行空间中的,一旦应用休眠或者后期有更改重新git push了代码的话,文件就丢失了。

为了防止应用休眠,我在buildpack的服务脚本加了一段循环,每隔三分钟以应用的Url为参数访问一次Bing搜图。这样主要是避免Heroku过滤掉自己访问自己的流量。Bing搜图会把应用主页当成原图去请求,用heroku logs可以看到每次访问的IP还不一样。

应用创建完可以用heroku run bash登录到运行空间查看上面的文件,不过这也算是个坑,实际上查看的应该是类似运行空间的镜像的东西,你做的修改同样不会被保存。其实还有貌似buildpack在部署的时候貌似和运行也不是一个环境,这个是在啃别人的buildpack的时候学着写的。

嗯还有个,MySQL的Add-on要绑定信用卡才能用。这个没办法靠应用内搭建的方法来解决,毕竟运行空间的数据终究是临时的,要是在应用内自己运行MySQL服务一旦应用重启整个数据库就没了。。

嗯下面是教程正文。

要在Heroku上部署签到站,你得先在Cloud9和ClearDB注册个账户。前者提供现成的部署环境,后者提供20M免费MySQL数据库。

在Cloud9面板上创建一个随意类别的应用,进入(已有的直接进去就行,它那个demo都可以)。

执行 git clone https://github.com/puteulanus/heroku-buildpack-php 从Github把buildpack拉下来

执行 cd heroku-buildpack-php 进入目录

执行 heroku login 登陆Heroku,输入Email和密码

登陆成功它会提示你Authentication successful。

然后执行 heroku create --buildpack https://github.com/puteulanus/heroku-buildpack-php justforfun123

注意justforfun123是我的应用名,需要替换成你自己的。应用名不能和别人的重复,最好想个独特一点的。

这句的意思是创建一个名为justforfun123的应用,并且以puteulanus/heroku-buildpack-php作为它的buildpack。

创建完是下面这个样子的。

 

1E4A8A5B-1A72-4A82-8C78-668A68029193

网站根目录在web文件夹,不熟悉命令的可以用Cloud9左侧的文件管理直接上传文件到web文件夹里,支持拖拽上传

或者执行下面这条

rm -rf web/index.php ;wget -O web/sign.zip 'https://github.com/kenvix/Tieba-Cloud-Sign/archive/master.zip' ;unzip web/sign.zip -d web/ ;mv web/Tieba-Cloud-Sign-master/* web/ ;rm -rf web/sign.zip web/Tieba-Cloud-Sign

然后就能看到web文件夹被填的满♂满的了

C13594F9-5DBB-4B42-BB9F-3A98FC06E7D8

然后有几个地方需要编辑一下的,首先是heroku-buildpack-php文件夹里的Procfile

在左侧面板找到它

A5B90383-F836-4115-9B7B-3E2A79588958

双击编辑,把justforthetest改成你的应用名,比如我的就是justforfun123

2F31F392-60FF-4412-A4F2-DCC5476507D0

改完ctrl+s保存。然后是heroku-buildpack-php下的bin目录里的run文件,在url的网址后面添加do.php

82501C0E-D77A-408A-A063-758BBFD919F6

变成这样

233A421C-5683-4FF7-BB4A-CF40C2A40079

下面的 sleep 180 代表每三分钟执行一次,你也可以改成 sleep 60 一分钟一次。同样ctrl+s保存。

打开web目录下的config.php,修改数据库信息为你在ClearDB的数据库信息。

78B9C2FB-D736-4444-B3D4-4F07268DDC1B

ClearDB的申请教程在最后面。

填好之后在最后一句前面加//把它注释掉。

0894B73B-BFF0-4C80-A5F8-911082047DBD

ctrl+s保存。

然后执行 git add . ;git commit -m 'init' ;git push heroku master 上传代码

遇到下面提示的话输入yes回车就行

BD904541-1021-413F-B60B-9DCB4E0DDDF7

泡杯茶等它上传完,Heroku这上传估计是限速了,慢得要死。。

896EEAEC-AF2E-4F1F-B8FA-18687B195F4E

刷屏刷了一大堆之后应用部署成功。

访问 你的应用名.tunnel.mobi/setup/install.php 可以看到安装界面了。

安装时选择自动获取数据库信息。

395C0907-A3BF-4FAB-A30B-FE63F8A68C64

安装成功

D7BECABC-FF89-4761-AA5D-4F3825907288

为确保安全你可以在Cloud9执行 touch web/setup/install.lock ;git add . ;git commit -m 'lock' ;git push heroku master 在代码储存中加入install.lock,这样即使应用重启之后别人也没办法进入install界面了

5DEE3C37-79A0-4DDF-9EE4-2B4D001F18CC

至此签到站部署成功。

 

附:ClearDB申请教程

打开https://www.cleardb.com/

点击最大的绿色按钮,创建免费数据库

3401FF18-EF43-47E3-ACE3-9C6E1F0159E2

选择最左边的Plan

7B825DEF-3C84-4EFE-9350-6DC4B6C9F596

选择 Shared MySQL Database Services for Windows Azure

AE2FD83D-0267-427B-B089-E5A24E48F10A

选择免费方案

175A2C20-D541-482F-889D-C835E38ED25C

地址随意,Heroku貌似是美国的服务器,数据库也用美国的应该会快一点

762002D8-1B6E-4B9A-9F0C-AEC5100BECB5

填上邮箱和密码注册账户

E3C154E7-6568-4394-B3C0-22A79A194076

点绿色按钮确认创建数据库

5A9E366E-8A9E-454A-8052-E7EA65AA11CD

然后就能看到你的数据库信息了

BD8E24B9-3BB4-47B4-A970-C27052573087

ClearDB的数据库不大,连接数也有限制,不过作为个人的签到站的话还是绰绰有余了。

在Heroku上运行签到站

          1. Puteulanus 文章作者
            UnknownUnknownUnknownUnknown

            我用的无名智者的,签了一年多了吧。。KK的早已停止维护,安装源拉不到他的源码,404正常。你实在不想用自己的信息实名认证的话,去淘宝找找代过的吧,或者直接买账号用。免费资源部落介绍的免费空间也有一些靠谱的。

          2. jj
            UnknownUnknownUnknownUnknown

            KKapi都有了啊。人家都可以正常使用的!在Heroku上运行签到站我研究一夜了都没弄出个所以然出来郁闷!在哪里执行命令啊。没看懂,

          3. Puteulanus 文章作者
            UnknownUnknownUnknownUnknown

            Cloud9的terminal里,如果你有Linux环境也可以在自己的终端里执行,相关工具安好就行。Heroku用php的buildpack可以创建PHP环境的空间,然后在本地改好签到程序的配置文件git push上去就行了。主要需要注意的是空间会自动休眠,这个可以用云监控搞定。而一旦休眠或者重新git push都会造成代码恢复到push时的原始状态,所以配置文件什么的不能让它生成,得按照SAE那种本地不可写空间的处理方式手动放置。

          4. jj
            UnknownUnknownUnknownUnknown

            liunx环境我有的就是代码玩不转啊,都是看教程弄的,玩不转代码是硬伤。我在Cloud9的terminal里找了半天都没找到终端在哪里。第一次找到终端了 ,现在不知道怎么也找不到。那我在liunx下具体应该怎么弄

          5. Puteulanus 文章作者
            UnknownUnknownUnknownUnknown

            大概就是这样,我的buildpack使用的ngrok服务貌似已经关了,可以用这个替代 https://www.tunnel.org.cn/ 。KK宣布弃坑了那就是说以后有什么问题也不会再维护,既然作者已经撒手了,即使放出了API暂时可以继续使用,也没有继续帮他维护下去的必要了。

    1. Puteulanus 文章作者
      UnknownUnknownUnknownUnknown

      不签可能是Bing搜图抽了,/do.php没被访问到,自己加个云监控试试吧。tunnel的配置文件在heroku-buildpack-php/bin/compile里,Installing ngrok下面那一段,可能还得更新下ngrok的版本才行。。我抽时间把安装源重新写下好了

      回复