投稿

9月, 2014の投稿を表示しています

WordPressで$_SESSIONが使えない

イメージ
ページ遷移のログを簡易的に$_SESSIONに保存して使いまわそうとしたら動作しなかったので調査。環境: CentOS 6.5, nginx 1.6.2, php-fpm 5.4.33initにフックしてsession_startしても、各ページでsession_idするたびに新たに新しいIDになって引き継げない。function hoge_init() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'hoge_init');調べてみるとPHPの設定でsession.cookie_pathの設定が「/tmp」になってた。
# less /etc/php.inisession.cookie_path = /tmpcookie_pathはクッキーを保存するパス(URI)。一致したアクセスのみクッキーを使えるようになる。cookie_pathを直したら動いた。他のサーバーをみると「/」だったので、session.save_pathと勘違いして書き換えてたみたい。設定した覚えがないのでどっかのバージョンは/tmpに設定されるかも。ちなみにsession.save_pathの設定は/etc/php-fpm.d/www.confに記載してある。ちょっと深追いしてWordPressと_SESSIONの関係を調査。WordPressはグローバル変数として_SESSIONを扱っていない。Php session not working in wordpress page template - Stack OverflowGlobal Variables | WordPress Codexvar_dump($GLOBALS);
するとWordPressが生成したグローバル変数が出力される。ということで$_SESSIONを使うのはやめて、update_user_metaを使うことにした。< Related Posts >CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめ【PHP】セッションタイムアウトの時間を設定する

WordPressのWP_Cronを使って非同期処理

イメージ
WordPressに投稿するとアプリにプッシュ通知する仕組みを作っているときの覚書。環境: CentOS 6.5, WordPress 4.0.0Linuxのcronとかpthreadに頼らずにやってみた。WordPressにはwp_schedule_single_eventという登録したフックを一度だけ実行する関数がある。Function Reference/wp schedule single event | WordPress Codexソースをみると10分の間に同じリクエストがくると無視されるが、$argsが違えばスケジュールに登録される。同じ記事に対して何度もプッシュ通知が来てもウザいのでちょうどいい。コードサンプルは上の公式サイトを参考に。でも念のためLinuxのCronに10分ごとに/wp-cron.phpにリクエストを送る処理書いた。。。
# vi /etc/cron.d/wordpressMAILTO=""# Excute WordPress WP_Cron
*/10 * * * * root curl http://hoge.com/wp-cron.php > /dev/null 2>&1参考サイト:Better wp-cron using linux's crontab< Related Posts >【Titanium, Android】Notificationからアプリにデータを渡すTitaniumアプリでPush Notification【Android版】Titaniumアプリでプッシュ通知(Push Notification)【iOS版】

【Titanium】ビルドしたときにzipalignエラー

イメージ
ネットで拾った古いソースコードを古いSDKでビルドしたときに下記エラーに遭遇した。環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA, Android SDK Tools 23.0.2[ERROR] Unable to find Android SDK tools: zipalign.
[ERROR] You have an incomplete or out-of-date installation.
[ERROR] Verify your Android SDK packages or reinstall the Android SDK by running 'titanium setup android' or manually downloading from http://appcelerator.com/android-sdk.下記サイトを参考にAndroid SDKにあるzipalignをコピーするUnable to find Android SDK tools: zipalign | Community Questions & Answers | Appcelerator Developer Center$ cd /Applications/android-sdk-macosx/
$ cp build-tools/19.1.0/zipalign tools/これでビルドは通った。元に戻すときは削除するだけ。
$ rm -rf tools/zipalign< Related Posts >Titaniumを使ったアプリと苦労した事とかのまとめ2013年Titanium CLIでAndroid向けにCompile(Build)と実機でDebug

MariaDB(MySQL)設定のチューニング

イメージ
5年前にも書いたけど、調べ直したときの覚書。環境: MariaDB 10.0.13参考サイトServer System Variables - MariaDB Knowledge BaseMySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System VariablesDSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング!変数名デフォルト説明max_connections151最大同時接続数。
Node.jsから非同期で処理する場合は一気に増加するので多めに設定。thread_pool_sizeCPUの数同時実行するスレッドグループの数。
デフォルトのままでいい。
参考:Thread pool in MariaDB 5.5 - MariaDB Knowledge Basethread_cache_size0キャッシュするスレッドの数。
"pool-of-threads"の場合無視される。table_open_cache400全てのスレッドでオープンするテーブルの数。
多すぎても少なすぎてもダメらしい。
参考:Optimizing table_open_cache - MariaDB Knowledge Base
参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.8 MySQL でのテーブルのオープンとクローズの方法key_buffer_size134217728MyISAMのインデックスをキャッシュするメモリ容量。全てのスレッドで共通。
実メモリの25%が妥当らしい。
参考:Optimizing key_buffer_size - MariaDB Knowledge Basesort_buffer_size2Mソートするときにスレッドごとに使うメモリ容量。大きすぎるとメモリが足りなくなるので注意。read_rnd_buffer_size262144ソート後にレコードを読み込むときに使用するメモリ容量。これもスレッドごと。join_buffer_size128KBインデックスを使わないテーブル結合に使われるメモリ容量。read_buffer_size128KBスレッドごとのシーケンシャルスキャンに使うメモリ容量。
参考:第2回 一番の基本,シーケンシャルスキャン…

ロードバランサとしてHAProxyかNginxか

イメージ
ロードバランサにHAProxyとNginxで迷ったときの覚書。ベンチマークはHAProxyの方が速いみたい。architecture/elb-benchmark.wiki at master · eucalyptus/architecture | GitHubHAProxyは1.5からHTTPSもサポート。YUMのリポジトリにあるのは1.4が主流。http, httpsをロードバランスするだけならNginxの方がいいかな?Nginxでロードバランサするときは下記記事が参考になりそう。Nginx + WordPress ロードバランサー篇 | サーバーワークス エンジニアブログ< 2014/09/23 Modified >
Nginxの死活監視に不安があったけど、ちゃんと指定ポートに応答がなかったら別サーバーにリクエストを投げてくれた。< Related Posts >Nginxを設定してWordPressにリバースプロキシするMariaDB, MySQLの冗長化、負荷分散の構成を考える

MariaDB Galera Clusterをインストールしてデータベースをクラスター化

イメージ
新サービスのサーバー構成を考えているときの覚書。環境: CentOS 6.5 x86_64, MariaDB Galera Server 10.0.13前の記事も参考に。SE奮闘記: MariaDB, MySQLの冗長化, 負荷分散の構成を考えるサービス全体のサーバー構成。ロードバランサー02やWeb02がいればさらに安心できる。ちなみにMariaDB Galera Clusterの最小ノード数は「3」。今回はデータベースをクラスター化するまで。参考サイトMariaDB Galera Clusterを試す (1) | さくらインターネット研究所Galera - MariaDB Knowledge BaseCentOS 6.5 で MariaDB の Galera Replication Cluster を試す | CUBE SUGAR STORAGE目次YUM経由でインストール 起動と設定 2台目以降のノード設定 クラスターに参加1.YUM経由でインストール公式サイトを参考にYUMのリポジトリを追加する。MariaDB - Setting up MariaDB Repositories[web01]# vi /etc/yum.repos.d/MariaDB.repo[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1インストール実行
[web01]# yum search MariaDB
[web01]# yum install MariaDB-Galera-serverepelリポジトリを使ったので、前の記事を参考に登録した方がいいかも。クラスター構成なので常に稼働する前提。メンテナンスで停止するときは手動で起動するため自動起動はしないようにしておく。
[web01]# chkconfig mysql off2.起動と設定公式ドキュメントに従う。Getting Started with MariaDB Galera Cluster - MariaDB Knowledge Base設定ファイルを編集
[web01]# vi /etc/my.cnf.d/s…

Nginxを設定してWordPressにリバースプロキシする

イメージ
フロントエンドにNginxのサーバーを立てて、バックエンドのWordPressにリバースプロキシする設定しているときの覚書。環境: CentOS 6.5, Nginx 1.2.6, WordPress 4.0システム構成は下図。ポイントは外部と通信するときはHTTPSで暗号化して、内部ではHTTPでやりとりする。参考サイトNginx https reverse proxy to WordPress with Apache, http and different port | cmanios以下「https://hoge.com/demo/」アクセスしたときにweb01のWordPressを表示する設定。SSLのバージョンに注意。nginx - httpsだからというだけで安全?調べたら怖くなってきたSSLの話!? - Qiitalv01のnginx設定server {
    listen 80;
    server_name hoge.com www.hoge.com;
    return 301 https://hoge.com$request_uri;
}server {
    listen       443 ssl;
    server_name  hoge.com;    root /home/httpd/httpdocs/;    #
    # SSL
    #
    ssl on;
    ssl_certificate      /etc/nginx/ssl.d/2014_hoge_cert.pem;
    ssl_certificate_key  /etc/nginx/ssl.d/2014_hoge_nopass_key.pem;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_prefer_server_ciphers   on;
    #
    # Header
    #
    proxy_set_header X-R…

Nginxの設定(Config)変数の値を確認する方法

イメージ
Nginxでリバースプロキシして、バックエンドにあるWordPressを表示するように設定をゴニョゴニョしているときの覚書。環境: Nginx 1.6.2php-fpmとの連携を記述するときに「$document_root」の値を確認したい。How to output variable in nginx log for debugging - Server Faultadd_headerする方法が一番簡単。
# vi /etc/nginx/conf.d/01.wordpress.conf#
# Demo
#
location /demo {
    root  /home/httpd/hoge/web-demo;
    try_files $uri $uri/ =404;add_header debug_nginx1 "$document_root";
add_header debug_nginx2 "$fastcgi_script_name";
}これでブラウザでアクセス。Google Chromeの開発ツールでは「Response Headers」に表示される。その設定が反映されたか確認するのに便利。< Related Posts >CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめNginx+PHP-FPMのTuning設定

【Titanium, Android】Notificationからアプリにデータを渡す

イメージ
新着プッシュ通知(Notification)をアプリ側に表示して、それを押したら新着記事を表示する方法を調査したときの覚書。Androidで嵌った。環境: Titanium SDK 3.3.0.GAプッシュ通知を受け取るまでは前の記事を参考に。Notificationをタップして発行するIntentにpushExtraでセットした値が取れない。試したこと。Windowの「focus」イベントで渡されたActivityを参照
Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT) Windowの「focus」イベントで渡されたActivityを参照。引数のイベントオブジェクトから参照。
e.source.activity.intent.getStringExtra(Ti.Android.EXTRA_TEXT) 起動後にrequireされた別ファイルでゴニョゴニョしているときに参照。
Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT)どれもダメ。どうやらIntentが渡されるActivityを勘違いしているみたい。そもそも今起動中のActivityは何?android - View the Task's activity stack - Stack Overflowこのサイトを参考に今起動中のActivityを表示。
$ cd /Applications/android-sdk-macosx/platform-tools/
$ ./adb shell dumpsys activity | grep -i run  Running activities (most recent first):
      Run #3: ActivityRecord{4216fae0 com.hoge.appdemo/org.appcelerator.titanium.TiActivity}
      Run #2: ActivityRecord{426a7da0 com.hoge.appdemo/.HogeAppActivity}
      Run #1: ActivityRecord{41c99bf0 c…

TitaniumアプリでPush Notification【Android版】

イメージ
前回はiOSについて調査。今回はAndroid端末にプッシュ通知する方法を調査したときの覚書。開発環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA, Android 4.0.3
サーバー:CentOS 6.5参考サイトOverview | Google Cloud Messaging | Android DevelopersGoogle Cloud Messaging for Android (GCM)を使ってみた - azukinohirokiの日記Androidでのpush通知について | Don't Fall - Titanium Mobileユーザー会サポートBBS目次Google Cloud Messaging(GCM)を有効に GCMとの通信用モジュールを探す Titaniumモジュールをビルドする環境を整える Titaniumモジュールのビルド実行 アプリからモジュールを利用 サーバーからプッシュ通知テスト デバッグと検証してみた1.Google Cloud Messaging(GCM)を有効にiOSはApple Push Notification service(APNs)経由でプッシュ通知を送る。Androidの場合はGoogle Cloud Messaging(GCM)経由。GCMのAPI Keyを取得Google API Consoleにアクセス プロジェクトを作成。 プロジェクトの「Overview」を開くと左上に「Project Number」が表示されているのでこれをメモ。あとで「sender_id」としてアプリ側に記述する。 APIs & auth → APIsから「Google Cloud Messaging for Android」を有効に APIs & auth → Credentialsから「Server Key」を作成。2.GCMとの通信用モジュールを探すiOSみたいにネイティブにサポートしてないので、公開されているモジュールを利用する。liccowee/Google-Cloud-Messaging--Titanium- | GitHub「dist/com.activate.gcm-android-0.6.zip」をそのまま利用しても問題なかった。…

Titaniumモジュールをビルドする環境を整える

イメージ
このTitaniumモジュールをビルドする環境を作ったときの覚書。環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA参考Android Module Development Guide | Titanium 3.X - Appcelerator DocsGoogleCloudMessaging - Google-Cloud-Messaging--Titanium- モジュールを作る - Qiita目次Android NDKをインストール Android SDK 2.3.3 (API 10)をインストール ビルドツールApache Antをインストール1.Android NDKをインストールTitaniumはNDK Revision 9をサポートしているらしいのでr9dをダウンロードする。
$ cd /Applications/
$ curl -O http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
$ tar jxvf android-ndk-r9d-darwin-x86_64.tar.bz2
$ rm android-ndk-r9d-darwin-x86_64.tar.bz2環境変数を定義
$ vi ~/.profile# Android NDK
export ANDROID_NDK=/Applications/android-ndk-r9d確認
$ source ~/.profile
$ echo $ANDROID_NDK;2.Android SDK 2.3.3 (API 10)をインストール必須らしいので、android-sdk-macos/tools/androidを実行してインストール。環境変数を定義してあるか確認。
vi ~/.profile# Android SDK
export ANDROID_SDK=/Applications/android-sdk-macosx確認
$ source ~/.profile
$ echo $ANDROID_SDK;環境が整ったか確認
$ titanium setupWhere do you want to go? k3.ビルドツールApache Antをインストール公式サイトからダウンロード。
$ curl -O …

Titaniumアプリでプッシュ通知(Push Notification)【iOS版】

イメージ
アプリ側にプッシュ通知しようと調査したときの覚書。まずはiOSから。開発環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA
サーバー:CentOS 6.5, PHP 5.4.32参考サイトSubscribing to push notifications - Titanium 3.X - Appcelerator Docspush通知について | Don't Fall - Titanium Mobileユーザー会サポートBBSApple Push Notification Services in iOS 6 Tutorial: Part 1/2 | Ray Wenderlich目次APNsとの通信下準備。証明書署名要求(CSR)を作成 iOS Dev CenterでPush Notification可能なApp IDを作成 App IDと証明書署名要求を提出して証明書を取得 Linuxサーバーで使いやすいようにPEMフォーマットに変換 プッシュ通知を受け取るデバイス用にProvisioning Profile作成 アプリにプッシュ通知がきたときの動作を記述 サーバーから通知テスト1.APNsとの通信下準備。証明書署名要求(CSR)を作成iOSの場合はApple Push Notification service(APNs) へプッシュ通知したい情報を送ると各端末に自動でプッシュしてくれる。APNsから信頼してもらうために署名要求を提出して、署名(サイン)してもらった証明書を取得する必要がある。まずはMac上で証明書署名要求(CSR)を作る。Keychain Accessを起動 Keychan Access → Certificate Assistant → Request a Certificate From a Certificate Authority...を選択 「User Email Address」「Common Name」を入力して「Saved to disk」を選択してContinue. パスフレーズを入力実際はLinuxサーバーからAPNsにアクセスするので、証明書署名要求(CSR)を作成する過程で作られる秘密鍵をエクスポートしておく。Keychain Accessの「Keys」を見ると、さ…