2015年11月19日木曜日

静的WordPress向けNginxのfastcgi_cache設定

nginx_wordpressWordPressで開発した静的ウェブサイトを公開するためにnginxの設定を見直したときの覚書。

環境: CentOS 6.7, nginx 1.8.0, PHP 5.6.15

fastcgi_cacheはPHP-FPMなどのバックエンドの結果をキャッシュする機能。

Nginxの設定ファイルの記述はWordPressの公式サイトを参考にした。

 

設定ファイルをGistにアップしたのでこっちを見ながらの方が分かりやすいかも。

 

目次

  1. FastCGIキャッシュ機能を有効に
  2. Nginxの設定ファイルを準備(キャッシュなし)
  3. キャッシュ機能が有効な設定ファイル
  4. Gzipの設定ファイル

 


1.FastCGIキャッシュ機能を有効に

Nginx全体の設定なのでhttpディレクティブに記述する必要がある。
# cd /etc/nginx/
# less nginx.conf

http {
    # FastCGI Cache
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=WORDPRESS:100m inactive=1d;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
}

ゾーン名: WORDPRESS
共有メモリ使用サイズ: 100M
保持期間: 1日間

 


2.Nginxの設定ファイルを準備(キャッシュなし)

各サイトごとの設定
# cd conf.d/

共通の設定ファイルを作って、各サイトでincludeさせる。

まずはアクセス制限用設定ファイルを作成
# mkdir global
# vi global/wordpress_restrictions.conf

#
# Global Restrictions for WordPress site
# Designed to be included in any server {} block.</p>
#

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
    deny all;
}

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

 

シングルサイト用WordPress設定ファイル。まずはfastcgi_cacheを使わない設定。
# vi global/wordpress_dev.conf

#
# WordPress single site rules.
# Designed to be included in any server {} block.
#

index   index.php;
charset utf-8;

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    access_log off; log_not_found off; expires max;
}

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_intercept_errors on;

    client_max_body_size 5M;
}

 

これらのファイルをincludeしてサイトが表示できるか確認。
# vi 01_hoge.conf

server {
    listen       80;
    server_name  dev.hoge.jp;

    root    /home/httpd/project/web/wordpress;

    # WordPress Setting
    include conf.d/global/wordpress_restrictions.conf;
    include conf.d/global/wordpress_dev.conf;
}

設定ファイルを再読み込みしてブラウザで確認
# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

 


3.キャッシュ機能が有効な設定ファイル

今度はfastcgi_cacheを有効にした設定。

前のをコピーして使う
# cp global/wordpress_dev.conf global/wordpress_live.conf

キャッシュに関わる設定を追記
# less global/wordpress_live.conf

#
# WordPress single site rules.
# Designed to be included in any server {} block.
#

index   index.php;
charset utf-8;


#
# fastcgi_cache start
# https://codex.wordpress.org/Nginx#Nginx_fastcgi_cache
set $no_cache 0;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
    set $no_cache 1;
}
if ($query_string != "") {
    set $no_cache 1;
}

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $no_cache 1;
}

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $no_cache 1;
}


# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    access_log off; log_not_found off; expires max;
}

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_intercept_errors on;

    client_max_body_size 5M;

    # Enable FastCGI cache
    fastcgi_cache_bypass $no_cache;
    fastcgi_no_cache $no_cache;

    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m;
}

 

これをincludeしてブラウザで確認
# less 01_hoge.conf

server {
    listen       80;
    server_name  dev.hoge.jp;

    root    /home/httpd/project/web/wordpress;

    # WordPress Setting
    include conf.d/global/wordpress_restrictions.conf;
    #include conf.d/global/wordpress_dev.conf;
    include conf.d/global/wordpress_live.conf;
}

 

nginx再読み込み
# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

2回目以降の読み込みが速くなっているはず。

 

キャッシュをクリアする仕組みを用意しておく
# vi global/fastcgi_cache_purge.conf

#
# FastCGI Cache Purge
#
location ~ /purge(/.*) {
    # Uncomment the following two lines to allow purge only from the webserver
    #allow 127.0.0.1;
    #deny all;

    fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}

。。。と思ったけど、yumでインストールするとfastcgi_cache_purgeモジュールが有効になっていないらしい。

コマンドで削除する
# rm -rf /var/cache/nginx/fastcgi/*

 


4.Gzipの設定ファイル

おまけでgzip用の設定も。
# vi global/gzip.conf

gzip         on;
gzip_vary    on;
gzip_proxied any;
gzip_types   text/plain
             text/xml
             text/css
             application/xml
             application/xhtml+xml
             application/rss+xml
             application/atom_xml
             application/javascript
             application/x-javascript
             application/x-httpd-php;
gzip_disable "MSIE [1-6]\.";
gzip_buffers 16 8k;

これをincludeしてブラウザで確認
# less 01_hoge.conf

server {
    listen       80;
    server_name  dev.hoge.jp;

    root    /home/httpd/project/web/wordpress;

    # Gzip
    include conf.d/global/gzip.conf;

    # WordPress Setting
    include conf.d/global/wordpress_restrictions.conf;
    #include conf.d/global/wordpress_dev.conf;
    include conf.d/global/wordpress_live.conf;
}

nginx再読み込み
# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

 

関係ないけどRedisを利用したオブジェクトキャッシュを有効にしたら、パフォーマンスが悪くなった。

 

< Related Posts >

2015年11月17日火曜日

TCP/IPとUNIX Socketの接続でどれくらい違うか

tcp-ip_unix-socket_connectionNginxからPHP-FPMの接続とPHP-FPMからMariaDBの接続をTCP/IPとSocketで比較してみた。

環境: CentOS 6.7, nginx 1.8.0, PHP 5.6.15, MariaDB 10.0.22

基本的な概念は下記記事が分かりやすい。

 

リクエストはWindows上のab.exe(Apache Bench)からMac上のVMware Fusionの仮想マシン(CentOS)にあるWordPressに対して行う。

まずはPHP-FPMもMariaDBもTCP/IP接続で計測

C:> .\ab.exe -n 50 -c 5 http://dev.hoge.or.jp/

1回目:14.03 [#/sec]
2回目:14.00 [#/sec]
3回目:19.92 [#/sec]
平均: 15.98 [#/sec]

PHP-FPMへの接続をUNIX Socketに変えてみる。
PHP-FPMの設定
# less /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/www.sock

Nginxの設定
# less /etc/nginx/conf.d/hoge.conf

#fastcgi_pass  127.0.0.1:9000;
fastcgi_pass   unix:/var/run/php-fpm/www.sock;

サービス再起動
# /etc/rc.d/init.d/php-fpm restart
# /etc/rc.d/init.d/nginx restart

sockファイルをnginxから読み取れるように権限を変更しないと「502 Bad Gateway」になる
# chown nginx.www /var/run/php-fpm/www.sock

計測実行

1回目:18.35 [#/sec]
2回目:17.64 [#/sec]
3回目:14.01 [#/sec]
平均: 16.66 [#/sec]

ちょっとだけ速くなった。

 

次はMariaDBへの接続をUNIX Socketに変えてみる。

YUM経由でインストールした場合は/var/lib/mysql/mysql.sockがデフォルトらしい。

wp-config.phpを変更

//define('DB_HOST', 'localhost');
define('DB_HOST', 'localhost:/var/lib/mysql/mysql.sock');

計測実行

1回目:18.23 [#/sec]
2回目:14.70 [#/sec]
3回目:18.44 [#/sec]
平均: 17.12 [#/sec]

 

もっと大量のデータを取れば違いが出るかもしれないが、体感速度は何も変わらない。

Web案件ではTCP/IPで統一することにした。proxy_cacheやfastcgi_cacheで体感速度を上げる。

アプリ案件の場合は、Node.jsからDBに接続するときにUNIX Socketを使った方がよさそう。

 

< Related Posts >

2015年11月16日月曜日

アプリを別のアカウントへ移行(譲渡)

app_transferAndroidアプリ、iPhoneアプリを別アカウントへ移行させたときの覚書。

 

目次

  1. Androidアプリを移行
  2. iOSアプリを譲渡

 


1.Androidアプリを移行

公式ヘルプを参考に

「デベロッパー コンソールの登録に使用した取引 ID」が少し分かりにくい。Googleペイメントでデベロッパー登録したときの取引ID。

google-payment

別料金もかからずすぐに反映された。

 


2.iOSアプリを譲渡

下記サイトが参考になる。

。。。一週間経っても移行先のアカウントにアプリが表示されないため、サポートに問い合わせてみた。

その後2回ぐらいサポートに督促のメールを送って、申請から約1ヵ月後に移行先アカウントにアプリが表示された。

メンバーセンターのApp IDsも移行される。

「Provisioning Profiles」は新規作成する。

別料金はかからなかった。

 

< Related Posts >

2015年11月10日火曜日

titaniumでビルドしたAPKファイルを解凍して中身をチェック

android_unziptitaniumでビルドしたAPKの中身がどうなっているか調査したときの覚書。

環境: Titanium SDK 3.5.1.GA

参考サイト

apkファイルはzip形式でアーカイブされているだけなので、unzipで解凍できる。
$ mkdir temp
$ cd temp
$ cp ../project/build/android/bin/hoge.apk ./
$ unzip hoge.apk

assetsディレクトリに画像やフォントファイルがそのまま出力されている。

ソースコードはclasses.dexに入っているらしい。

これを変換するツールをダウンロードする。

ダウンロードしたdex2jarを解凍。実行可能に
$ unzip dex2jar-2.0.zip
$ chmod +x dex2jar-2.0/*.sh

実行
$ ./dex2jar-2.0/d2j-dex2jar.sh classes.dex

エラー

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/googlecode/dex2jar/tools/Jar2Dex : Unsupported major.minor version 51.0

JDK 1.7でないとダメみたい。

前の記事などを参考にJDK 1.7にして再実行。
$ ./dex2jar-2.0/d2j-dex2jar.sh classes.dex

dex2jar classes.dex -> ./classes-dex2jar.jar

jarを展開
$ jar -x < classes-dex2jar.jar

ダウンロードしたjadを解凍して実行可能に
$ unzip jad158g.mac.intel.zip
$ chmod +x jad

変換実行
$ ./jad -d output -r -s java **/*.class

outputディレクトリに読めるソースコードが展開される。

titaniumで作成したjsファイルは/com/hoge/AssetCryptImpl.javaに難読化されて格納されている。

ファイル名とエンコードされたハッシュ値の範囲が書いてあるので、復元できなくもない。

難読化されているとはいえパスワードとか重要な値はソースコードに書かない方がいいみたい。

 

< Related Posts >

2015年11月9日月曜日

【Titanium】JDK 1.7だとエラーになるのでJDK 1.6をインストール

jdk17_16Titaniumの開発でAndroidデバイスにインストールして動作確認しようとしたらエラーになったときの覚書。

環境:Mac OS X El Capitan 10.11.1, Titanium SDK 5.0.2.GA

エラーメッセージ
$ appc ti build -p android -T device

[ERROR] Titanium requires JDK 1.6 when building on Mac OS X.
[ERROR] You can download it from http://appcelerator.com/jdk-osx
[ERROR] If you still see this message, then you may need to set the JAVA_HOME to help Titanium locate the JDK.
[ERROR] To see which JDKs Titanium finds, run "appc ti info --types jdk --output json".

参考になったフォーラムの投稿記事

結局JDKをインストールするしかないみたい。

公式サイトからダウンロードする

インストールされた場所を確認
$ ls /Library/Java/JavaVirtualMachines/

1.6.0.jdk       jdk1.7.0_80.jdk

1.7と切り替えたいので下記記事が参考になった。

java6に切り替えてみる。
$ export JAVA_HOME=`/usr/libexec/java_home -v 1.6`

確認
$ echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

titaniumコマンドを使って確認
$ ti info --types jdk

デフォルトで1.6を使うように設定しておく
$ less ~/.bash_profile

# Use JDK 1.6
export JAVA_HOME=`/usr/libexec/java_home -v 1.6`

 

< Related Posts >

2015年11月6日金曜日

TV SlideViewの代替アプリ「sMedia TV Suite」を試す

movie_transfer_mobileTV SlideViewのプラグインZenFone 2 Laserに未対応で「お出かけ転送」出来ないので、代わりのDTCP-IP対応アプリを探したときの覚書。

自宅の環境

まずは昔使っていたTwonky Beamを試してみた(700円)。

転送途中でなぜかWifiが切断される。
→ あとでルーターの設定とかいじってたら直った。

他にもDTCP-IP対応アプリがあったので購入してみた。

3つとも使ってみて、簡単な比較表を作ってみた。

  TV SlideView Twonky Beam sMedio TV Suite
値段 500円 700円 900円
動画操作 CMスキップ
(たまに失敗する)
30秒スキップ
10秒戻し
30秒スキップ
10秒戻し
スキップが安定しない
お出かけ転送 レコーダーがSony製ということもあり転送が安定してる
転送はバックグラウンドで行うので他の作業ができる
BDZ-EW510から転送した動画の音飛びがひどい
nasneとの連携は問題なし
転送中はアプリを切り替えてはダメ
BDZ-EW510との接続がうまくいかないことが多い
nasneとの連携は問題なし
転送中はアプリを切り替えてはダメ
SDカード保存 × ×
使い勝手 使いやすい シンプルで分かりやすい 無駄なページが多くて使いにくい
感想 録画番組を削除する目的で使用中 悪くはない 「SDカード保存」が決めてでこれを使っている

sMedio TV SuiteのUI改善を期待

 

< Related Posts >

2015年11月3日火曜日

PhpStorm10.0でTitanium開発用コード補完設定

phpstorm_titaniumPhpStorm 10.0にアップグレードしてTitanium用コード補完を設定したときの覚書。

 

環境(WindowsからMac上のソースコードにアクセス)

Windows: PhpStorm 10.0, Node.js 4.2.1
Mac: Node.js 0.10.37

 

目次

  1. 設定からダウンロードできない
  2. tsdtypingsをインストール
  3. PhpStorm側で設定
  4. Globalを個別に設定

 


1.設定からダウンロードできない

PhpStormのSettings → Languages & Frameworks → JavaScript → Librariesから「Download...」しようとしてもtitaniumがなくなっている。。。

最近はTSDというTypeScirptで書かれた書式設定用パッケージマネージャーを使うらしい。

 


2.tsdtypingsをインストール

Macのコンソール上でtsdをインストール
$ sudo npm install tsd -g

titanium用書式設定を検索
$ tsd query titanium

インストール
$ tsd install titanium --save

tsd.jsonとtypingsディレクトリが作成された。package.jsonとnode_modulesディレクトリの関係と同じ。


<2016/03/22 追記>
tsdがdeprecatedになったのでtypingsに変更
$ sudo npm remove tsd --global
$ sudo npm install typings --global

検索
$ typings search --name titanium

既存のtsdからアップグレード
$ rm -rf typings
$ typings init --upgrade
$ typings install
$ rm tsd.json

 


3.PhpStorm側で設定

Librariesの設定画面で「Add...」からtypingsディレクトリを選択する。

エディタ内でTiとか打ってコード補完されるか確認

 


4.Globalを個別に設定

ただL()がUndefinedだと怒られる。

前は設定で直った気がするけど、今回はダメなので直に指定する。

typings/tsd.d.tsに下記のように追記する。

/// <reference path="titanium/titanium.d.ts" />
var L = Global.L;

他にもあるようならtypings/titanium/titanium.d.tsの"declare module Global"を参照しながら設定する。

そのうちGlobalをグローバルとして読み込むようになっているかもしれない。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives