自宅サーバーに外部ネットワークからアクセスする設定

自宅に立てたCentOSサーバーに外部ネットワークからグローバルIPアドレスを指定してアクセスするときの確認事項

前提
・自宅サーバーのCentOSからインターネットつなげることができる
・同一ネットワークに他のPCがある(同じルーターに繋がっている)場合、そのPCからCentOSサーバーにアクセスできる

確認事項
・apache(httpd)を起動していること
・iptables(ファイヤーウォール)を停止していること、もしくはきちんと設定されていること
・二重ルーターになっていないこと(確認方法はこちら

・CentOSサーバーとその他の同じLAN内にあるPCが同じグローバルIPアドレスを共有する場合(プロバイダ契約がひとつの場合)は、CentOSサーバーのプライベートIPアドレスを固定する
固定の仕方参考ページ

プライベートIPアドレスを固定するときは他の機器と重複しないように注意。ルーターにアクセスし、DHCPで自動割り当てされる範囲のIPアドレスを確認し、範囲外のIPアドレスを指定すること。

・ルーターからポートの開放を行い、外部ネットワークからアクセスできるようにする。このとき自宅サーバーのプライベートIPアドレスを指定する。

WHR-HP-GNルーターの場合は設定はこちら

CentOS6.7のGUI画面が乱れてインストールできない

CentOS6.7をUEFIモードのRAID1でインストールしたときの覚書

インストールするとGUI画面で画面が乱れてインストールができない。

画面が乱れる理由はマザーボード(グラフィックボード)との相性が悪いのが理由のよう。

PCの構成
-----------------------------------
・H170-PRO(マザーボード、バージョン0906 2016/02/26更新 適用済み)
・Core i3-6100T(CPU)
・バッファローの白ディスプレイ(VGAケーブル) → acer黒ディスプレイ(DVIケーブル)(ディスプレイを変更してもダメ)
-----------------------------------

3TBのHDDを使ってRAID1を組んでインストールしたいので、UEFI起動でGUIでインストールする必要がある。

※非UEFI起動だと、画像の乱れはないが2TBより多いHDDを認識しない。また「GPTブートディスクを非EFI環境のシステムでお使いです」というエラーが出てインストールができても起動ができない。

こちらを参考

※CUI(テキスモード)でのインストールだとカスタムレイアウトによるパーティションのカスタムレイアウトができないのでインストール時にRAID1が組めない。
RAIDでなくていいからテキストモードでのインストールしたい場合はこちらのページを参考に、インストール最初の画面でリンク先のページで"single"としているところを"text"に変えて進めればいい。

古いバージョンのCentOSをいろいろ試してみると、CentOS6.5だと問題なくインストールできた(6.3、6.4、6.6はダメだった)。CentOS7でもUEFIモードのインストールは問題なし。

古いバージョンのCentOSダウンロードはこちらから

ただし、CentOS6.5で無事にインストールを完了しても「yum -y update」でCentOS6.7にアップデートしてしまうと再び画面がバグる。

解決方法
CentOS6.7をインストールしたいときは、一旦CentOS6.5のブートメニューで「Install system with basic video driver(基本的なビデオドライバーでシステムをインストール)」を選択して、インストールする

参考ページ

そのあとでCentOS6.7にアップデートしても画面は乱れない

パーティションの構成はこのようにした

IMG_9894

RAID1構成の参考ページ

ブート領域の設定は「カスタムレイアウトを作成する」を選択したあと、「作成」-「標準パーティション」から次のように設定する。

一つ目のHDD
--------------------------------------
「マウントポイント」 → 「/boot/efi
「ファイルシステムタイプ」 → 「EFI System Partition」
「使用可能ドライブ」 → 「sda」にチェック
「サイズ」 → 「300」
--------------------------------------

上と同じサイズのパーティションの二つ目のHDDにも設定
--------------------------------------
「マウントポイント」 → 「(空欄)
「ファイルシステムタイプ」 → 「EFI System Partition」
「使用可能ドライブ」 → 「sdb」にチェック
「サイズ」 → 「300」
--------------------------------------

構成の順番も大事で、写真と順番が違うとCentOSが起動しなかった。おそらく一番最初にEFI Filesystemのブート領域を持ってくるといい。

UEFIのブート領域はRAIDにできないようなので、二つ目のHDDにはマウントポイントなしでEFI Filesystemの領域を同サイズ確保した。インストール後、sda1の内容をsdb1にコピーすればいいらしい。(こちらの方が言ってるまま)

あとは初期値をいじらずにインストールを終えればインストール完了となる。

インストールできたらすべてのパッケージをアップデートしておく。

yum -y update ※-yはすべてイエスで答える

CentOS6のインストールで「GPTブートディスクを非EFI環境のシステムでお使いです」

3TBのHDDを二つ用意してCentOS6.7にRAID1構成でインストールを試みた。

こちらのページを参考にパーティションを構成してインストール作業を進めていくと警告表示される。

-----------------------------------
警告:
GPTブートディスクを非EFI環境のシステムでお使いです。おそらく、これはBIOSがGPTディスクからの起動をサポートしていないため動かないでしょう。
-----------------------------------

GPTブートディスクとは、2TBより容量の多いHDDのことらしく、これまでのBIOSでは扱えないディスクサイズを指すらしい。警告を対して気にも留めずインストール作業を最後まで終え、PCを再起動するとBIOS(UEFI)画面が表示されるだけでCentOSは起動しない。

これの解決策は、DVDドライブにCentOSのインストールディスクを入れてPCをリブート。BIOS画面に入ってブートメニューから「UEFI: DVDドライブ名」を選択してUEFIモードでインストール工程を処理していけばいい。

Sccure boot violationでCentOSがインストールできない時の対処法

新しく購入したPCにCentOS6.7をインストールする際、Sccure boot violationというエラーが出た。

エラーメッセージ
-----------------------------------
The system found unauthorized changes on the firmware, operating system or UEFI drivers.

Press [OK] to run the next boot device, or enter directory to BIOS Setup if there are no other boot devices installed. Go to BIOS Setup > Advanced > Boot and change the current boot device into other secured boot devices.
-----------------------------------

google翻訳
-----------------------------------
システムは、ファームウェア、オペレーティングシステムまたはUEFIドライバに不正な変更を発見しました。

[OK]を押すと次のブートデバイスを実行、またはインストールされない他のブートデバイスがない場合は、BIOSセットアップにディレクトリを入力します。 BIOSセットアップ>詳細設定>ブートに移動し、他のセキュアなブートデバイスに現在のブートデバイスを変更。
-----------------------------------

Sccure bootはPC起動時にOSのデジタル署名をチェックする機能らしく、デジタル署名のないOSは、起動できないらしい。

•Linux OSの場合、ほとんどがSccure bootに対応していないため、エラーが出る模様。

解決策としては、Sccure bootをUEFIで無効にすればいい。

BIOS(UEFI)を起動して「Advanced Mode」 → 「Boot」→ 「Secure Boot」の項目をクリック。「OS Type」のところを「Windows UEFI mode」→「Other OS」に変更すればいい。

【自作PC】ファンの回転数が異常

サーバー用に自作PCを組み立ててBIOSをチェックしたところ、ケース側ファンの回転数がおかしい。数百で回転数が少なすぎて赤字になったり、一万回以上の表示されたりを繰り返して安定しない。

構成
・P100(PCケース)
・H170-PRO(マザーボード)
・Core i3-6100T(CPU)

解決法
P100のファンについている回転数を制御するスイッチを L から H に変えるだけ。とりあえずこれで表示される回転数は異常でなくなった。低回転過ぎたのかな。

【PHP】twilioで電話をかける、SMSを送る

twilioを使って電話をかけたりSMSを送ったときの覚書。言語はPHP。

1.ライブラリのダウンロードと設置

電話をかけるにもSMSを送るにも準備として、twilioのライブラリを設置する必要がある。
TwilioのPHPソースコード(zip)

解凍すると Services というフォルダが入っているのでそれをそのまま自分のサーバーにアップロードする。

ライブラリのインストールとSMS送信サンプルはこちらにもある(公式)

これで下準備完了。

2-1.twilioで電話をかける

次の二つのサンプルコードをアップロードして読み込むとtwilioの番号から電話をかけられる

twilio_call.php
--------------------------------------------------
<?php
require("Services/Twilio.php"); // PHPライブラリ

$sid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Account Sid
$token = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; // Auth Token
$tel_to = "+8190xxxxxxxx"; // 発信先電話番号
$tel_from = "+81xxxxxxxxxx"; // twilioで取得した発信元電話番号
$twiml = "http://example.com/calling.xml"; // TwiML URL(absolute path)

$client = new Services_Twilio($sid, $token);
$call = $client->account->calls->create($tel_from, $tel_to, $twiml);
?>
--------------------------------------------------

calling.xml(この音声が読み上げられる)
--------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="ja-jp">Twilioへようこそ。</Say>
</Response>
--------------------------------------------------
このサンプルコードはこちらのまま

2-2.twilioでSMSを送る

次のサンプルコードをアップロードして読み込むとtwilioの番号からSMSが送れる

--------------------------------------------------
<?php

require "Services/Twilio.php"; // PHPライブラリ

//set our AccountSid and AuthToken from www.twilio.com/user/account
$AccountSid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$AuthToken = "xxxxxxxxxxxxxxxxxxxxxxxxxx";

//instantiate a new Twilio Rest Client
//新しいクライアント オブジェクトのインスタンスを生成
$client = new Services_Twilio($AccountSid, $AuthToken);

//送信先の配列をつくる
//送信先電話番号 => 相手の名前
$people = array(
"+8190xxxxxxxx => "tarou",
"+8190xxxxxxxx => "hanako",
);

//Loop over all our friends. $number is a phone number above, and
//$name is the name next to it
foreach ($people as $number => $name) {

$sms = $client->account->messages->sendMessage(

//twilioから購入したSMS送信可能な電話番号
"+160xxxxxxxx",

// the number we are sending to - Any phone number
$number,

// the sms body
"このメッセージちゃんと届いてるか?"
);

// PC画面に表示されるメッセージ
echo $name . "にメッセージを送ったよ";
}

?>
--------------------------------------------------
このサンプルコードは公式のまま

paypalのエクスプレスチェックアウトを利用した定期支払いの導入

paypalのエクスプレスチェックアウトを利用した定期支払いの導入にはこちらのページが大変参考になった。

上記ページのサンプル

請求金額や請求頻度は、CreateRecurringPaymentsProfile APIで設定する。paypalfunctions.php 内にある次のパラメーターで指定できる。

----------------------------------
//定期支払いの請求開始日
"&PROFILESTARTDATE=".date("Y-m-d",strtotime("now"))."T0:0:0";

//30日ごとに請求
"&BILLINGPERIOD=Day";
"&BILLINGFREQUENCY=30";

//これだと5ヶ月ごとに請求
"&BILLINGPERIOD=Month";
"&BILLINGFREQUENCY=5";

//日本円で1,500円
"&AMT=1,500";
"&CURRENCYCODE=JPY";
----------------------------------

paypalのStart Date should be greater than current dateエラーの対処法

エクスプレスチェックアウトで定期支払いを実装したときに以下のエラーが出た

エラー内容
----------------------------------------------
GetExpressCheckoutDetails API call failed. Detailed Error Message: Subscription start date should be greater than current dateShort Error Message: Start Date should be greater than current dateError Code: 11505Error Severity Code: Error
----------------------------------------------

これは paypalfunctions.php 内の profilestartdate(定期支払いの請求開始日) に過去の日付が入っている場合に出る。現在か未来の時間に書き換えてやればok。

現在の時間を取得して入れる
----------------------------------------------
PROFILESTARTDATE=".date("Y-m-d",strtotime("now"))."T0:0:0";
----------------------------------------------

【paypal】エクスプレスチェックアウトの支払いページの社名を変更する

支払いページの社名をサービス名に変更したときの覚書。

支払いページの社名を変更する方法のひとつとしてlogo画像に置き換えるという手段がある。

[ツール]-[ビジネス設定]-(買い手の手続きを)[カスタマイズする]-会社のロゴの追加の[作成]から、logo画像を指定したページスタイルをメインにするだけ。

しかしこの方法だと、スマホから見た場合にlogo画像は表示されず、以前の社名のまま。スマホにはlogo画像は表示しない仕様ということかな。

他の方法を探してみると、SetExpressCheckout API のパラメーターに情報を追加することで可能らしい。

関連パラメーター
-----------------------------------------------
//logo画像を指定
$nvpstr = $nvpstr . "&LOGOIMG=" . urlencode('http://example.com/paypal_logo_img.gif');

//header画像を指定
$nvpstr = $nvpstr . "&HDRIMG=" . urlencode('http://example.com/header_img.gif');

//ページスタイルを指定
//上の二つはページスタイルを指定して変更される点と同じ。だからページスタイルが設定してあればこの一行でもいいし、設定画面でメインスタイルに指定していればなくてもいい。
//$nvpstr = $nvpstr . "&PAGESTYLE=mystyle";

//これがスマホ支払いページの社名を書き換えるパラメーター
$nvpstr = $nvpstr . "&BRANDNAME=サービス名";
-----------------------------------------------
青文字の部分は環境に合わせる

パラメーターを追記する場所は、paypalfunctions.php 内にある。

paypalfunctions.php の中を抜粋
-----------------------------------------------
function CallShortcutExpressCheckout( $paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL)
{
//------------------------------------------------------------------------------------------------------------------------------------
// Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation

$nvpstr="&PAYMENTREQUEST_0_AMT=". $paymentAmount;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_PAYMENTACTION=" . $paymentType;
$nvpstr = $nvpstr . "&RETURNURL=" . $returnURL;
$nvpstr = $nvpstr . "&CANCELURL=" . $cancelURL;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_CURRENCYCODE=" . $currencyCodeType;

//ここら辺に追記すれば SetExpressCheckout API にパラメーターが渡る。

-----------------------------------------------

SetExpressCheckout API で使用できるパラメーター(公式)

パラーメータについて全部でないけど日本語でまとめてあるページ

【paypal】本番環境でだけAPIのエラーが出る

sandbox環境では問題ないのに本番環境だとエラーが出る。

エラー内容
--------------------------------------------
SetExpressCheckout API call failed. Detailed Error Message: Security header is not validShort Error Message: Security errorError Code: 10002Error Severity Code: Error
--------------------------------------------

APIの認証がうまくいっていないらしい。

対処法
paypalfunctions.phpを開いてSandboxFlag を false に書き換える。

書き換え内容
--------------------------------------------
//$SandboxFlag = true; //sandbox用
$SandboxFlag = false; //本番用
--------------------------------------------