nginxを使用し、railsとwordpressが混ざり合ったページをドメインごとに割り当てて、見せる。
そのためにはまずこのWebアプリケーションをローカルで見ることができるようにする。
使用した環境
Mac OS X 10.9.5
nginx 1.8.1
mysal 14.14 Distrib 5.7.11
php-fpm 5.4.30
wordpress
流れとしては、
rails起動
nginx起動
mysql起動
php-fpm起動
ローカル接続
サイト全ページ閲覧
的な流れ。
nginxインストール
まず最初にnginxをインストール。
$ brew install nginx
$ nginx//nginxの起動
難なくインストールされたので、コマンドでnginxサーバを起動してみる。
nginxに関してエラーが出力される。
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
と思いきや、エラーではなく、同じコマンドを打ったので、すでに起動しているとのこと。エラーなのかと思ってしまい、これになにげに時間を取られた。
sudoコマンドを入れなければ認証されないので、
$ sudo nginx -s reload //nginxの再起動
、、、何も応答がない。エラーも何も出力されないらしい。が、再起動したみたいなんでOK
mysqlインストール
次にmysqlをインストールとおもいきや、Macにはデフォルトで入っていたので、起動させてみる。
$ sudo mysql.server start
すぐさまエラー。
ERROR! the server quit widthout updating PID file ~
この場合は、mysql以下のディレクトリの所有者を_mysql
のものにしてくれというエラーなので、
$ chown -R _mysql:_mysql /usr/local/var/mysql
上記のコマンドで所有者を変更し、エラー改善できたはずだが、違うエラーが出力された。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
これは、「指定場所にソケットがないよ」というエラーだったので確認。
指定場所にmysql.sockを作り、再度起動コマンド、、、
起動完了。
php-fpmインストール
phpやnginxというワードでググっていると、phpにはモジュール版とCGI版の二つがあり、nginxではモジュール版は動かせないので、CGIの中でもfastCGIを使用するとのこと。
そこで、php-fpm(php FastCGI Process Manager)が必要だと知った。主に高負荷のサイトで有用な追加機能を用意しています。と書いてあるが、あまりイメージ湧かず、、、
$ brew install php-fpm
難なくインストールできたので、起動。
$ sudo php-fpm
エラー発生。
failed to open error_log(/usr/var/log/php-fpm.log): nosuch file
php-fpm.logファイルが無いよと言われているので、上記指定先へphp-fpm.logファイル作成後、再起動コマンド。
failed to open error_log(/usr/var/log/php-fpm.log): Permission denied (13)
またエラーだ。これは、ログファイルにエラーを書き込めないからファイル自体の権限を緩めろと言われているので、
$ chmod 755 /usr/var/log/php-fpm.log
を実行。
なおった~
起動完了。
nginx設定
まず初めに何をするか。nginx.confファイルを編集し、サーバを設定していく。みたい。
ここからチンプンカンプン。。
様々なサイトを見て、最終的にこういう設定にした。
nginx.conf
worker_processes auto;
error_log /usr/local/var/log/nginx/error.log; //エラーを吐き出す場所の設定
pid /usr/local/var/run/nginx.pid;
events{ worker_connections 1024; }
http{
include mime.types; //同階層にあるmime.typesをインクルード
server_names_hash_bucket_size 512;
default_type application/octet-stream;
acces_log /usr/local/var/log/nginx/access.log; //アクセスログを吐き出す場所を指定
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
server{
client_max_body_size 20M; //wordpressのためのサイズ設定
listen 80; //デフォ値:80
server_name test.local; //デフォ値:localhost
charset utf-8;
try_files $uri $uri/ /index.php?q=$uri&$args; //この一行を挿入しなければPHP環境が動かないらしい。。。
ssi on; //SSI設定
location / { //「test.local」でアクセスしたとき、wordpress記事を見せる
root /Users/ユーザ名/Projects/wordpress; //のちにダウンロードするwordpressファイル直下をドキュメントルートに設定
index index.html index.htm index.php;
include wordpress.conf; //同階層のワードプレス用設定ファイルをインクルードする(後にアップ予定です汗)
}
location ~* /(ja|en|fr|pt)/your { //「test.local/ja/your」でアクセスしたとき、railsサーバで動くrailsアプリケーションを見せる
include rails.conf; //同階層のレイルズ用設定ファイルをインクルードする。
}
location /assets/ {
include rails.conf;
}
location /common/ {
include rails.conf;
}
location ~ /\.ht {
deny all;
}
location /wp-config.php {
deny all;
}
error_page 500 502 503 504 /50x.html; //エラーページ指定
location = /50x.html {
root html
}
}
include servers/*;
}
locationディレクティブはパスごとに割り振るサーバを決められる。
上記では、rootはwordpressのコンテンツに割り振り、~*/ja/yourのパスにはrailsのサーバに処理を割り振っている。
両者で共有する設定のみをrails.confファイルへとまとめ、location毎にrails.confファイルをインクルードし、設定をかけた。
rails.conf
index index.html index.htm index.php
proxy_pass http://127.0.0.1:3000; //「test.local/ja/your」でアクセスしたとき、[
「127.0.0.1:3000」で動作中のrailsアプリケーションを見るようにプロキシ設定する
proxy_set_header host $host
allow all;
nginx.conf内のlocationで設定しているパスの時に、インクルードしたrails.conf内のproxy_passで設定しているローカル環境に飛ばす仕組み。
test.local/ja/yourで接続すると、railsアプリケーションがブラウザに出力された。
rails環境下の出力が終わったので、次はwordpress環境下のページをパス変更して接続した際に出力させる作業をする。
まずは、、、
wordpressインストール
http://ja.wordpress.org/
まずは上記サイトからwordpress圧縮ファイルをダウンロード。
圧縮ファイルを解凍する。
解凍したファイルを「/Users/ユーザ名/Projects」に移動。
移動後、wordpress用にデータベースを作成するので、mysqlコマンドラインへ接続。
$ mysql -u ユーザ -p
MySQLのユーザパスワードを入力
$ mysql> CREATE DATABASE データベース名;
$ mysql> quit;
上記のnginx.confファイルの設定で、http://test.local/にアクセスするとwordpressサイトに飛ぶ(ドキュメントルートとして設定したから)ので、ユーザを登録をする(ユーザ名、パスワード等)。
wordpressファイル内にある「wp-config.php」をvimもしくはエディタで開いて編集。
wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', '先ほど設定したデータベース名' );
/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'MySQLのユーザ名' );
/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'MySQLのユーザパスワード' );
/** MySQL のホスト名 */
define( 'DB_HOST', '' );
/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );
/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );
そして先ほどwordpressで登録したユーザ情報を入力し、保存。先ほど作成したデータベースの中にデータが格納されていくことになる。
再度http://test.local/へ接続。
wordpressでのマイページが出力されれば、環境の構築成功。
wordpress環境のページを見れるようにする
ログイン後
左記メニューバーにある、外観ボタンを押す。
上記画面へ移行するので、この場所にwordpressアプリケーション環境をテンプレートとして使用できるようにすれば成功なのだが、、
プラスボタンの「新しいテーマを追加」ではできないとのこと。
ググった結果、先ほど「/Users/ユーザ名/Projects/」に置いたwordpressファイル内の「Users/ユーザ名/Projects/wordpress/wp-content/themes」にwordpressテンプレートファイルを設置すると(僕の場合はrailsアプリケーションの中にテンプレートファイルがあった。)、上記の外観ページ内にテンプレートとしてウェブアプリケーションが出現するのでそれを選択。
再度http://test.local/に接続すると、、、
ウェブアプリケーションへの接続ができていた。
と思いきや、ヘッダフッダがないし、railsアプリとwordpress記事の行き来ができない。。。
シンボリックリンク
ヘッダやフッダのみ読み込めていない理由が、URLの階層の違いだった。
読み込む階層が違った。
現在の階層:【test.local/ja/】
読み込むべき階層:【test.local/】
なのでシンボリックリンクを使用し、test.local/ja/にアクセスしたとき、test.local/を見に行くように設定することでヘッダフッダを読み込むことに成功。
$ ln -s 参照先ディレクトリパス 参照元ディレクトリパス
このコマンドでシンボリックリンクが作成できる。