Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

Microsoft AzureにWindows2008を入れてWordPressが動作する環境を構築する その6

1 Comment wordpress,,,

その5まででなんとかWordpressが動作するようになったが、ISS用にLinuxとは別の設定を行う必要がある。

プラグインのインストール・削除ができない

プラグインが削除できない

wp-content/plugins/ フォルダに対して、Users(サーバ名\Users)へフル権限を与える

プラグインをインストール出来るようにする。

プラグインをインストールしようとすると

「インストールに失敗しました: ダウンロードに失敗しました。No working transports found」
「インストールに失敗しました: ダウンロードに失敗しました。 ファイルストリーミングの送り先となるディレクトリが存在しないか、書き込み不可になっています。」

などのエラーメッセージが出る。

wp-config.phpに84行目あたり、define('WP_DEBUG', false);の後くらいに

define('WP_TEMP_DIR','C:\temp');

を追記。
(Windows上では半角¥だが、Dreamweaverなどのエディタでは逆スラッシュであることに注意)

C:¥tempフォルダを作ってからphp.iniのupload_tmp_dirを検索し、コメントアウトして

upload_tmp_dir = "C:\temp"

と書き換える。

また、php.iniの

extension=php_curl.dll
extension=php_openssl.dll

をコメントアウトして有効化。

パーマリンクを変更すると、リンクエラーが出る

・test-site.com/index.php/slug/ といったurlになる
・リンクが500エラーになる

まずリライトモジュールをIISにインストールする。
こちらから「view all」をクリックして

ページ内で「URL Rewrite」と検索し、ファイルをダウンロード、サーバにインストールする。
インストールが済んだらServer Managerを開きなおすと「URL rewrite」のアイコンが追加されている。

その後、wordpressがインストールされているフォルダに移動し、web.configという名前で下記の内容でファイルを作る。
(LinuxではWordpressは.htaccessを自動作成するが、Windowsでは.htaccessは使えず作成されない、代わりにweb.configというファイルを使用してリライトやアクセス制限を設定する。)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
 <rules>
 <rule name="wordpress" patternSyntax="Wildcard">
 <match url="*"/>
 <conditions>
 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
 </conditions>
 <action type="Rewrite" url="index.php"/>
 </rule>
 </rules>
</rewrite>
</system.webServer>
</configuration>

再度Wordpressのパーマリンク設定に行くと、index.phpが含まれないURLに変更可能。

パーマリンクを変更すると画像がアップロード出来なくなった

デフォルトのパーマリンク(domain.com/p=1111 など)ではアップロード出来ていた画像が、
「アップロード中にエラーが発生しました。後ほど再度お試しください。」
エラーが出てアップロードできなくなる。
(デフォではユーザとしてアップロードされていた画像が、変更後アップロードした画像ファイルは、IUSRが所有者になる)

→ uploadsディレクトリに「IIS_IUSERS」の権限フルコントロールを付与する。

確認箇所

・php.iniでextension=php_gd2.dll がコメントアウトされているか?
phpinfoでGDが読み込まれているかどうかを確認。読み込まれていればphpinfoに以下の項目が表示される。

・extension_dirの読込先は合っているか? (extension_dir = "C:\phpのフォルダ\ext")

・設定変更後IISを再起動

参考・こちらこちら

メール送信エラー

メールフォームプラグインなど(当環境では主にContactform7を使用しています)を使用してメールを送信することが出来ない。

SMTPサーバをインストールする

サーバマネージャ「Features (Rolesの下)」を右クリック「Add Features」をクリック。

SMTP Server と Telnet Client にチェックを入れる。
選択時に

このようなメッセージが出るがAdd Required Role Serviceを押下。

そのままNext

そのままInstall

インストールが終わると、FeatureにSMTP ServerとTelnet Clientが追加されている。

リレーの設定

Start → Administrative Tools → IIS 6.0 Manager をクリック

[SMTP Virtual Server #1]を右クリック「Propaties」

上記手順で設定すると

メールの送信が可能になった。

参考

日本語URLが文字化けする

投稿名などをURLにしていた場合、日本語のタイトルを投稿すると自動的に日本語のURLが生成される。
が、シングルページで表示すると500エラーが出る。

※2017/12/15時点では、Window2008サーバをWindows Updateで最新版にアップデートした時点で文字化けなく表示された。
(但し、日本語と英語が混じるURLでは文字化けする。アクセスは可能))

対策

Windowsサーバでスタート→コマンドプロンプトを右クリック→Run as Administrator(管理者権限で実行)をクリック。
※レジストリの操作を伴うので、最悪サーバが壊れる可能性があります。まずWindows Updateを行って日本語URLが表示される場合は行わないほうが吉。

reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO 

と入力。
その後IISを再起動。

日本語スラッグでも

エラーが出ないで表示されるようになった。
※日本語OSの場合、レジストリの当該箇所が
「REQUEST_URI¥0PATH_INFO」
として登録されてしまうケースがあるようだが、英語OSでは
REQUEST_URI
PATH_INFO
の2行で登録される。
この場合は直接レジストリを変更すれば反映された。

未解決問題

スラッグに日本語と英語が混じる場合、自動転送エラーが出る場合がある。
僕はリダイレクトや正規表現に詳しくないので、教えてエラい人。

URLの頭が日本語、最後が英語の場合、日本語文字列が「?」にはなるが表示される。

URLの頭が英語、最後が日本語の場合、自動転送エラー。

英語が混じると、日本語URL部分が全て???になってしまう・
頭が日本語でかつ文字数が偶数の場合は文字化けしなく、奇数の時だけ文字化けするなどからマルチバイトの処理をどうこうだとは思うのだが、Azureが今日で期限切れなので、ギブアップ。

Microsoft AzureにWindows2008を入れてWordPressが動作する環境を構築する その5

No Comment wordpress,,

その4はこちら

WordPressのダウンロード、インストール

WordPress公式から最新版をダウンロードする。
ダウンロードしたWordpressをフォルダごと(C:\inetpub\wwwroot\wordpress)に展開する。

http://IPアドレス/wordpress/

にアクセスすると

http://IPアドレス/wordpress/wp-admin/setup-config.php

にリダイレクトされ、

「wp-config.php ファイルが見つかりません。開始する前にこのファイルが必要です。~」

というメッセージが出る。
wp-config-sample.phpを複製してwp-config.phpという名で保存し、テキストエディタで

/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name_here'); //作成したデータベース名(全ページではtest-db)

/** MySQL データベースのユーザー名 */
define('DB_USER', 'username_here'); //ユーザー名(初期ではroot)

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here'); //MySQLを作成した時のパスワード

上記を修正。
するとインストール画面が表示され、

入力項目を埋めるとインストール出来る。

ログインも可能。
トップページも表示される。

その6へ。

Microsoft AzureにWindows2008を入れてWordPressが動作する環境を構築する その1

No Comment wordpress,,

WordPressでサーバがWindows2008 RC2 SP1指定という案件があったので、折角なのでWindowsのクラウドサービスAzureを使って仮想テスト環境を構築。
非常に手間だったのでメモを残す。
※不具合・ご指摘大歓迎です。

で、結論から言うと、

・Windows環境でWordpressを動かすのはやめておいたほうがいい…
・Azure扱いやすい、UIが分かりやすい、けどとにかく高い

です。
特にhtaccessで簡単に設定できてたリダイレクト・Basic認証などがweb.configで書かないといけないところ、キャッシュ系プラグインがほぼ対応していない事、権限周りの煩わしさ、日本語URLのバグなどで泣きそうになる。

Azureのアカウントを作る。

クレジットカードがあれば20,000円分無料で1か月試用が可能なので、早速申し込む。

Azureダッシュボード。
綺麗で見やすく、カスタマイズしやすい。

Virtual Machineの作成

メニューのVirtual Machinesを選択し、「Virtual Machineの作成」をクリック。
お勧めに出る「Windows Server → Windows2008 R2 SP1」を選択。

「デプロイモデルの選択」はそのまま「作成」を押す。

基本設定を適当に埋め、仮想マシンのサイズ選択。

最初からお勧め環境が出てくるが、「すべてを表示」を選択すると月額57万円のサーバとか出てきて笑う。
もちろん価格は変動するが、僕が見た時点で一番安い環境が1vCPU,1GBメモリ,SSD2GB,iops800で1,500円。
※IOPS = (I/O per Second)。ディスクが1秒当たりに処理できるI/Oアクセスの数
※データディスク = 接続可能なデータディスクの最大数

まぁ試用なのでお勧めから適当なものを選択。
次のオプション機能の設定も触らずOKを押す。
検証が終了したらそのまま「作成」。デプロイにしばらく時間がかかる。

デプロイ終了後、デスクトップから仮想環境にアクセスできる。
「接続」を押してWindowsサーバへリモートアクセス。

資格情報には基本設定で入力したユーザー名とパスワードを入力。

Windowsにアクセス出来た。

IISのインストール

Microsoft Internet Information Services(WEBサーバ)をインストールする。

Startボタン右側のServer Managerを起動し、Rolesを右クリックして「Add Roles」を選択。
IISにチェックを入れてNext。

Select Role ServicesもそのままNext。

インストール完了後、IIS Managerに「Default Web Site」が作られている。

Default Web Siteを右クリック→Exploreでルートフォルダの位置(C:\inetpub\wwwroot)がわかる。

※ファイルの拡張子表示はエクスプローラーでaltキーでメニュー表示→Tools → Folder Options→ Viewタブの
「Hide extentions for known filetypes」のチェックを外す。
※右側Actionの「Browse *:80(http)」をクリックで、ローカルからブラウザ確認が可能。

Azure Network Security Groupでポートを開放

もちろんこのままではリモートからサイトが見れない、FTP接続もできないので、Webサーバの80番ポートと21番FTPのポートを開放。

AzureポータルからリソースのNetwork Security Group(盾のアイコン、名前は入力したID-nsg)をクリックし、ネットワークセキリュティグループを表示、「受信セキリュティ規則」に

ソース : IP Address
発信元IPアドレス範囲 : 自分のIP/32
発信元ポート範囲 : 任意。(webサーバは80,FTPは21。テスト環境なので今回は全ポート*を入力。)

を追加することで、自分だけがアクセス可能。
優先度、名前などは適宜変更。

設定が完了すると、リモートのブラウザから

初期ページが表示される。

静的IPの割り当て

Azureのリソースを停止したときにIPが変わってしまうのを防ぐため、IPを静的に変更する。
「パブリックIPアドレス→構成」
を選択し、「割り当て」を動的→静的に変更。

タイムゾーンの変更

タスクバー右側の時間を右クリック→Change date and time settingsをクリック。
Change time zone → (UTC+9:00) Osaka,Sapporo,Tokyoを選択。

FTPサーバのインストール、設定

・Web Manager(IIS)を右クリック「Add Role Services」でFTPをインストール。
・Defalut Web Siteの「FTP Authentication」で「Basic Authentication」を「Enable」に設定。
・Defalut Web SiteのFTP SSL Settingsで「SSL Policy」を「Allow SSL connections」に設定。
(※SSLを使用しない設定だと、デフォルトのファイアーウォールがブロックする仕様、との事)
・FTPソフトではActive接続を選択。

Windows Firewallの設定

AzureのNSGを使用するので、今回は特に設定しない。

HTMLの表示

Default Web Siteのルート(C:\inetpub\wwwroot)に適当にメモ帳でindex.htmlを作成&UTF8で保存すると、ブラウザで

表示される。

その2へ。

外部WordPressサイトから投稿記事をRSSで読み込み、表示

No Comment wordpress,,

■やりたい事…Wordpressサイト1の投稿記事を、他サーバにあるWordpress2サイトで取得、表示。

同一DBサーバのWPから記事を持ってくる方法は他にあるみたいけど、設定が煩雑なのとDBサーバに外部接続用のユーザを作ったりしないといけないのでレンタルサーバでは荷が重いか。

今回はWordpress自体が出力しているRSSを取得・表示する方法。
(出典・モンキーレンチ様。こことかこことか)

<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('http://hogehoge.com/feed'); // RSSの取得元URL
if (!is_wp_error( $rss ) ) : $maxitems = $rss->get_item_quantity(3); // 記事数
	$rss_items = $rss->get_items(0, $maxitems); 
endif;
?>

<ul>
<?php
if ($maxitems == 0): echo '<li>記事はありません</li>';
else :
date_default_timezone_set('Asia/Tokyo');
foreach ( $rss_items as $item ) : ?>

<li><a href="<?php echo $item->get_permalink(); ?>" target="_blank" rel="bookmark"><?php echo $item->get_title(); ?>
<span class="news-date"><?php echo $item->get_date('(Y/m/d)'); ?></span></a>
</li>

<?php endforeach; ?>
<?php endif; ?>
</ul>

で可能。
ただ、上記でRSSを取得した場合、取得した側のWordpressで最大12時間のキャッシュが効いてしまって最新記事が取得できないことがある。
なので、取得先Wordpressサイト1のfunction.phpに追記して、キャッシュ時間を変更する。

return 数値を秒で指定する。30分なら1800を入力することで、30分ごとにRSSキャッシュを更新してくれる。

add_filter( 'wp_feed_cache_transient_lifetime', function(){'return 1800;';});

上記はPHP5.3から使用可能な無名関数を使用。
ちなみにそれ以前のverの場合は

add_filter( 'wp_feed_cache_transient_lifetime', create_function( '$a', 'return 1800;' ) );

と匿名関数(create_functionで定義)を使うか、

function return_rss_num() {
	return 3600;
}
add_filter( 'wp_feed_cache_transient_lifetime' , 'return_rss_num' );

関数を作って入れることになる。

匿名関数と無名関数の違いはこちら

PHP5.3以降を使用している場合は、PHPマニュアルにもあるように無名関数を使用したほうがよさそう。

警告 / この関数は、内部的に eval() を実行しているので、 eval() と同様にセキュリティ上のリスクがあります。 さらに、パフォーマンスやメモリ使用効率の面でも問題があります。
PHP 5.3.0 以降を使っている場合は、この関数ではなく、ネイティブの 無名関数 を使うべきです。(出典・PHPマニュアル)

他にも無名関数は匿名関数の倍の処理速度だそうで。

WordPress カスタムフィールドの日付を使って今月の投稿を取得

1 Comment wordpress,

前提:
ミュージシャンのライブスケジュール用に、
カスタムフィールド(key:live_date)にDATE型の値(yyyy-mm-dd)を入れている。
その値を元に、指定した範囲の投稿を取得。(今月のライブなど)

※Wordpressには投稿日時を指定するdate_queryというパラメータがあるが、投稿日時自体は予約投稿などに使いたいので、今回はカスタムフィールドにライブ日時を設定している。

カスタム投稿用のパラメータcompareで、BETWEENなどの演算子が使え、しかもtype='DATE'と指定する事で、yyyy-mm-ddをそのまま比較する事が出来る。
具体的には、

$args = array(
	'order' => ASC,
	'orderby' => 'meta_value',
    'meta_query' => array(
       'relation' => 'AND',
       array(
         'key' => 'live_date',
         'value'=>array( '2016-05-01', '2016-05-31' ), //ここに配列で範囲をDATE型で設定。
         'compare'=>'BETWEEN',
	 'type'=>'DATE'
       )
    )
);
$wp_query = new WP_Query($args);

みたいな形。
ほんと凄い進化だねwordpress。