高速!通过命令行创建静态Heroku网站(需要具备Git技能)

此文假设可以使用类Unix的命令行。

gitのインストール

你可以先用下面的命令来确认一下,因为它们通常是默认安装的。

$ git --version

创建Heroku账户

Heroku客户端安装

在使用Heroku进行推送时需要创建SSH密钥。

将SSH密钥注册到Heroku。

在命令行中执行以下操作

$ curl -o- https://raw.githubusercontent.com/nanananamememe/open_heroku/master/make.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   261  100   261    0     0   1003      0 --:--:-- --:--:-- --:--:--  1007
mkdir: my_site: File exists
Reinitialized existing Git repository in ~/my_site/.git/
Creating app... done, ⬢ hoge-piyo-99999
https://hoge-piyo-99999.herokuapp.com/ | https://git.heroku.com/hoge-piyo-99999.git
On branch master
nothing to commit, working directory clean
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 299 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.lock; using PHP ^5.5.17
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote:        - php (5.6.29)
remote: -----> Installing dependencies...
remote:        Composer version 1.2.4 2016-12-06 22:00:51
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 13.5M
remote: -----> Launching...
remote:        Released v3
remote:        https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
To https://git.heroku.com/hoge-piyo-99999.git
 * [new branch]      master -> master

通过执行命令行,将创建一个没有广告显示的免费网站,该网站将在执行命令的文件夹的顶层目录下创建名为my_site的文件夹。Heroku应用程序会自动创建,并作为远程存储库添加到my_site文件夹中。

编辑网站

$ cd my_site;
$ echo '<p><a href="test.html">test.html</a></p>' >> index.html;
$ echo 'This is a pen. This is a apple. huuunmm! Applepen!!' > test.html;
$ git add .;
$ git commit -a -m test;
$ git push heroku master;
$ heroku open;

请问一下,index.html上有没有链接到test.html呢?
然后就可以大胆地写HTML、JavaScript、CSS之类的东西,提交并推送,来构建网站了。

只有这些还不足以解释shell脚本的含义.

#!/bin/sh
app=$1; #←引数を取得
if [ -z "$app" ];then
    app="my_site"; #←引数空ならmy_siteに
fi
mkdir $app; #←ディレクトリ作成 
cd $app; #←ディレクトリ移動
git init; #←git初期化
heroku create; #←herokuアプリ作成
echo '{}' > composer.json; #←コンポーサー設定作成、このファイルの有無でphpアプリか判断される
echo '<b>Hellow World!!</b> Yes we can!!' > index.html; #←ヘロ〜
git add .; #←composer.jsonとindex.htmlをgitのインデックスに登録
git commit -a -m first; #←コミット
git push heroku master; #←プッシュ&デプロイーン
heroku open; #←ブラウザーに『Hellow World!』と表示されたらハッピー

因此,为了更进一步,让我们使用Redis进行一个应用程序的示例来添加一个附加组件。

    • 実ソース https://github.com/nanananamememe/short_url

サンプル https://infinite-forest-33516.herokuapp.com/

使用以下命令从GitHub克隆源代码并创建Heroku应用程序,并添加Redis。
会多次出现“heroku-redis状态正在创建。”。
这是因为Redis服务器正在启动的原因,所以在此期间应用程序将不会运行,这是等待启动的提示信息。
当出现“已创建Heroku-redis状态。”时,表示启动完成。应该会在浏览器中打开一个URL缩短网站。(大概)

$ curl -o- https://raw.githubusercontent.com/nanananamememe/open_heroku/master/make_short_url.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   519  100   519    0     0   1038      0 --:--:-- --:--:-- --:--:--  1040
Cloning into 'short_url'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 0), reused 12 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), done.
Checking connectivity... done.
Creating app... done, ⬢ hoge-piyo-99999
https://hoge-piyo-99999.herokuapp.com/ | https://git.heroku.com/hoge-piyo-99999.git
Creating heroku-redis:hobby-dev on ⬢ hoge-piyo-99999... free
Your add-on is being provisioned and will be available shortly
! Data stored in hobby plans on Heroku Redis are not persisted.
redis-hoge-99999 is being created in the background. The app will restart when complete...
Use heroku addons:info redis-hoge-99999 to check creation progress
Use heroku addons:docs heroku-redis to view documentation
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (12/12), 2.63 KiB | 0 bytes/s, done.
Total 12 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.json; requirements
remote:        from dependencies in composer.lock will be used for selection
remote:        - php (7.1.0)
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote: -----> Installing dependencies...
remote:        Composer version 1.2.4 2016-12-06 22:00:51
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:          - Installing predis/predis (v1.0.3)
remote:            Downloading: 100%
remote:        
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 14M
remote: -----> Launching...
remote:        Released v3
remote:        https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/hoge-piyo-99999.git
 * [new branch]      master -> master
heroku-redis state creating.
heroku-redis state creating.
heroku-redis state creating.
Allrady heroku-redis state created.

使用PHP生成短链接的说明

由于使用缩短URL,在 http://hogehoge.heroku.com/ 之后将作为搜索关键字处理,需要在.htaccess文件中进行重定向。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

使用predis进行与redis的连接。

{
  "require": {
     "predis/predis": "1.0.3"
  }
}
<?php
require 'vendor/autoload.php';
Predis\Autoloader::register();
$domain = getenv('HTTP_HOST'); //ホスト名取得
$redisUrl = getenv('REDIS_URL'); //redis設定取得
if (!$redisUrl) { //redis設定が取得できなければエスケープ
    echo 'heroku-redisアドオン作成中。しばらくお待ち下さい...';
    exit;
}
$redis = new Predis\Client($redisUrl); //preisを介してredisに接続
$url = empty($_POST['url'])?null:trim($_POST['url']); //短縮対象のURLが送信されていれば変数に格納
$key = trim(getenv('REQUEST_URI'), '/'); //http://hogehoge.heroku.com/以降を検索キーとして取得
if ($url) { //短縮対象のURLが送信されていれば
    if (!preg_match('/^https?:\/\//', $url)) { //URLの最初がhttpかhttpsかでなければ頭にhttp://を追加
        $url = 'http://' . $url;
    }
    $hash = strtr(trim(base64_encode(crc32(md5($url))), '='), '+/', '-_'); //$urlを元に検索キー生成
    $redis->set($hash, $url); //redisセット
    $redis->expire($hash, 43260); //redis保存期限の設定(秒)とりあえず | 60秒 x 60分 x 24時間 x 30日 = 43260
}
if ($key) { //検索キーが設定されていれば
    $redirect = $redis->get($key); //redisからurlを取得
    if ($redirect) { //urlが正常に取得できればリダイレクト
        header("Location: {$redirect}");
    } else {
        echo 'このURLの有効期限は切れました。';
        exit;
    }
} else {
    $jump = "http://{$domain}/{$hash}"; // 短縮後URLを作成
    require 'form.php'; //form.phpを読み込み
}

Shell脚本的说明

#!/bin/sh
app=$1; #引数を取得
if [ -z "$app" ];then
    app="short_url"; #引数空ならshort_urlに
fi
git clone https://github.com/nanananamememe/short_url $app; #githubより短縮URL作成のソースをクローン
cd $app; #チェーンジディレクトリ
heroku create; #ヘロクアプリ生成
heroku addons:create heroku-redis:hobby-dev; #サーバーへredisアドオンを追加
git push heroku master; #短縮URL作成のソースをヘロクにプッシュ
state=`heroku addons:info heroku-redis|grep State|awk '{print $2}'`; #redisサーバーの状態を取得
hold="creating" #状態が作成中の場合はこのメッセージ、$stateが一致した場合は延々とwhileが回ります。
while [ $state = $hold ]
do
    echo "heroku-redis state $state."; #作成中のメッセージ
    sleep 10s; #10秒待機
    state=`heroku addons:info heroku-redis|grep State|awk '{print $2}'`; #redisサーバーの状態を取得
done;
echo "Allrady heroku-redis state $state."; #redisサーバー作成完了
heroku open; #ブラウザを起動

以上。

广告
将在 10 秒后关闭
bannerAds