うえださんが通りますよ

nginxでWordPress環境をつくった。気分的にMariaDBで。

Google大好きなうえだです。

Googleが最近AWSに対抗してGCPに力入れてるみたいなので、わざわざGCPで構築した。

300ドル分無料で使えるのでお試しあれ。

環境

Google Compute Engine 上の ubuntu 16.04 LTS

timezoneの変更

AWSにしろGCPにしろサーバーのタイムゾーンを忘れないように。

$ sudo dpkg-reconfigure tzdata

日本なら Asia -> Tokyo を選ぶ。

install nginx

$ sudo apt update
$ sudo apt install nginx

とりあえず設定はあとで。

install php

phpは7系。

$ sudo apt -y install php php-cgi php-cli php-mysql php-gd php-apcu php-fpm php-pear php-xmlrpc php-mbstring php-mcrypt

php-fpm

nginxではデフォでPHPを実行できないとかなんとかで、FastCGIのphp-fpmと繋いでPHPの実行環境を構築する

nginxがソケットを通じてphp-fpm.phpの実行を依頼する感じだと思ってる。ので、設定をする。

$ cd /etc/php/7.0/fpm/pool.d/
$ sudo cp www.conf www.conf.org
$ sudo vim www.conf

www.conf に以下の記述をする(コメントインするだけかも) 1

listen = /run/php/php7.0-fpm.sock
listen.mode = 0660 #limit access permission to socket

php-fpm の再起動忘れない。

$ sudo /etc/init.d/php7.0-fpm restart

nginxの設定

サンプル。

server {
   listen 80;
   server_name xxx.xxx.com; # domain
   access_log /var/log/access.log;
   error_log /var/log/error.log;

   location / {

        if (!-e $request_filename) {
            rewrite ^ /index.php last;
        }


        root /var/www/sample/public_html;
        index index.html index.htm index.php;

        location ~ .php$ {
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

一応だけど

  • マルチドメイン対応していなければserver_nameの記述はしなくていい。そのとき上記の設定は/etc/nginx/sites-enabled/defaultに直接書いていい。
  • マルチドメインの場合ドメインごとのserver{}の設定が必要。/etc/nginx/conf.d/内のファイルはすべてnginxに読み込まれるので、ここにドメイン毎にファイル作って設定書いたらいいと思う(というのは独断と偏見)。

nginx再起動

設定を変えたら再起動忘れない(リロードコマンドあったっけ)

$ sudo /etc/init.d/nginx restart

MariaDBインストール

mySQLを使いたくない気分だった。

sudo apt install mariadb-server

セキュリティは地味に大事に

$ sudo mysql_secure_installation

mySQLとの互換性を大事にしてるおかげでちょいちょいコマンドがややこしいけど、シェル上ではみんなmysqlコマンド系でMariaDBは動かせる。

まずrootのパスワードセットするよう求められるのでy押しとこう。

ちなみに、MariaDBインストール時は不思議な仕様で、root権限でmysql -u rootと打つとログインできる(つまりsudo mysql -u rootでも可)。 まぁrootさんはなんでもできるって考え方は割りかし自然ではある。

データベースとユーザ作成

WordPressに扱わせるデータベースとユーザを作成する。

ちなみに確かこれもMariaDBの仕様だった気がするけど、MariaDB上のrootのパスワード設定しても、実行元もroot権限じゃないとログインできない。つまりsudo mysqlしないと-u rootできない。

$ sudo mysql -u root -p
MariaDB [(none)]> create database wp_sample;
MariaDB [(none)]> create user 'username'@'localhost' identified by 'password';
MariaDB [(none)]> grant all on wp_sample.* to 'username'@'localhost' identified by 'password';

Wordpress インストール

wgetってなんだかんだつよいよな。

$ cd
$ mkdir tmp
$ cd tmp
$ wget https://wordpress.org/latest.tar.gz
$ tar xvzf latest.tar.gz
$ cd wordpress
$ sudo cp -r * /var/www/sample/html
$ cd /var/www/sample/html
$ sudo cp wp-config-sample.php wp-config.php
$ sudo vim wp-config.php

先程作成したユーザとデータベース情報をwp-config.phpに記載する。

phpmyadminのインストール

これは欲しい人だけ。Apacheだとスムーズに入れられるけど、nginxさんはそうもいかないので、一応補足。

$ sudo apt -y install phpmyadmin php-mbstring php-gettext

Configuring phpmyadminて画面が出るんだけれど、nginxは選択肢になくてapache2はある。仕方ないのでapache2を選んどく。

するとapache2のための自動設定するか的な質問が表示されるので、そっとNoを選ぶ。

MariaDBの設定

なんでだか下記の設定が必要。plugin=''''はダブルクオーテーションじゃなくてシングルクォーテーション2つなので気をつけよう(僕は間違えた人)。

$ sudo mysql -u root -p mysql
Enter password:
  ...
MariaDB [mysql]> update user set plugin='' where user='root'; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


MariaDB [mysql]> flush privileges; 
Query OK, 0 rows affected (0.00 sec)

nginxの追加設定。

phpmyadminにアクセスするための設定をnginxに追加する。

server {
    ...
    # setting for phpmyadmin
    location /phpmyadmin {
        root /usr/share;
        index index.php;


        # setting for phpmyadmin
        location ~ ^/phpmyadmin.+\.php$ {
            fastcgi_pass   unix:/run/php/php7.0-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    ...
}

これ調べてるときにlocationでドキュメントルート使い分けられることを知った。感動。

他の設定ファイルもlocationにドキュメントルートの設定記述してあるのはこうやってドキュメントルートをアクセスパス毎に変えたりすることがあるから。

あ、nginxの再起動忘れないで。

$ sudo service nginx restart

おわり

WordPressってなんだかんだつよい。


  1. もしphp-fpmのソケットの所有者的なの( user とか groupとか)変えたら、/etc/nginx/conf.dにかかれてるnginxの実行ユーザとグループも同じものに変えておくこと(デフォルトはwww-dataだったような。いじらなければ問題ないはず)

nginxでCGI実行環境を整える

MovableTypeのサイトをAWSに移行した際のメモ。

環境はAWSubuntu 16.04 LTS。PerlCGI環境を整えた。

nginxインストー

$ sudo apt -y install nginx

CGI実行ラッパをインストー

nginxはCGIを実行できないらしく。CGIFCGIでラップするfcgiwrapを用いる。

$ sudo apt -y install fcgiwrap

nginx設定

nginxの大元の設定ファイルは

/etc/nginx/nginx.conf

で、当該ファイルのincludeで読み込むファイルに下記を追記することで、.cgi のファイルをCGIとして実行できる。

server {
~~~ 中略 ~~~
    location ~ \.cgi$ {
        root /path/to/root;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
~~~~~~~~~~
}

nginxを再起動しておくこと。

$ sudo service nginx restart

fcgiwrapの設定

/etc/init.d/fcgiwrapを編集する

 FCGI_CHILDREN

この数だけCGI実行プロセスがforkされる?

ぶっちゃけよくわかっていない。

サーバのスペックや実行アプリケーションの処理コスト(起動数?)とかで最適化するものなのか。

FCGI_USER
FCGI_GROUP

CGIを実行するユーザとグループ。 nginx側の設定に合わせる。

aptでnginxを普通に入れてたら単純にnginxでいい。

FCGI_SOCKET_OWNER
FCGI_SOCKET_GROUP

/var/run/fcgiwrap.socketの所有者。直前行のコメントにも書いてあるけどコメントアウトする。

設定したらfcgiwrapを再起動。

$ sudo systemctl restart fcgiwrap

テスト

正常にアクセスできるか確認する。

#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "<html>";
print "<head><title>Test</title></head>";
print "<body>";
print "<p>This is CGI Test</p>";
print "</body>";
print "</html>";

忘れちゃならないのは実行権限をつけておくこと。

$ chmod 755 testcgi.cgi

アクセスすると、unable to resolve host が表示された。。

/etc/hostsにホスト名を追加する

$ sudo echo "127.0.1.1 $(hostname)" >> /etc/hosts

127.0.1.1はubuntudebianのよくわからない仕様で必要らしい。

とりあえずこんな感じ。

Ubuntu16.04 にPhantomJSをnodeでインストールする際にエラーになる

詰まったのでメモ。

$ sudo npm install -g phantomjs

実行

> phantomjs@2.1.7 install /usr/local/lib/node_modules/phantomjs\ > node install.js

sh: 1: node: not found\ npm ERR! Linux 4.4.0-51-generic\ npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "-g" "install" "phantomjs"\ npm ERR! node v4.2.6\ npm ERR! npm v3.5.2

あちゃー。

解決策がgithubに記載されていた。

https://github.com/Medium/phantomjs#im-on-debian-or-ubuntu-and-the-installer-failed-because-it-couldnt-find-node

Some Linux distros tried to rename node to nodejs due to a package conflict. This is a non-portable change, and we do not try to support this. The official documentation recommends that you run apt-get install nodejs-legacy to symlink node to nodejs on those platforms, or many NodeJS programs won't work properly.

ので、nodejs-legacyをインストールする。

$ sudo apt-get install nodejs-legacy

これでphantomjsをインストールできるようになった。めでたしめでたし。