Apache から NGINX へ

NGINX

初見でニンジンと読んだのは自分だけでしょうか。Apach よりもはやくなるらしい、という情報を鵜呑みにしてやってみました。

Apache と nginx の違い

よくわかんないから分かったとこだけ。

Apache : あぱっち
NGINX : えんじんえっくす

と、読むのだそうです。あと PHP の実行環境。Apache は PHP をインストールしたらそのまま使えるけど、 nginx は PHP-FPM というものが必要。で、その PHP-FPM というのは PHP の FastCGI 実装のひとつ。FPM は FastCGI Process Manager の略。

FastCGI ってなんですか(´・ω・`)

まず CGI (Common Gateway Interface) は、ウェブサーバ上でユーザプログラムを動作させるための仕組み。わかる。CGI は、ユーザーから要求がある度にプロセスの生成と破棄が行われるので、要求が多ければ多いほど繰り返して重くなる。サーバーに負荷がかかりまくる。

そんな問題を解決するのが FastCGI とかいうもの。プロセスをメモリ上に置いとくことで、毎回のムダをなくし、プログラム動作速度の向上およびサーバ負荷の低下が可能となる。

ということで、NGINX では PHP を CGI 版のすごいやつで動かすらしいです。

Apache の場合はモジュールとして PHP スクリプトを起動。Apache の一部として処理される。PHP をインストールすると自動的に PHP モジュールもインストールされて、Apache はデフォルトでその PHP モジュールを読み込む。

言葉にしてみるとさっぱり理解が追いつきませんが、なんとなく NGINX のほうが響きがカッコイイのでやってみます。

環境

  • “Ubuntu 14.04.4 LTS”
  • PHP 7.0.3

代わり映えしないですね。

NGINX のインストール

NGINX サイトが配布する PGP キーを追加

# curl http://nginx.org/keys/nginx_signing.key | apt-key add -

リポジトリを一覧に追加

これやらないと古いバージョンが入る。

# sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
# sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"

アップデート後、nginxをインストール

# aptitude update
# aptitude install nginx

あとなんかこういうエラーでたけど

そのまま同じことをして解決。

# dpkg -P nginx-common

# apt-get install -f

# apt-get purge nginx*

# apt-get purge -s nginx*

そんなこんなで

# nginx -v
nginx version: nginx/1.8.1

できました。

PHP-FPM

これがないと php が動かないんだそうです。

# aptitude install php7.0-fpm
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

あら?

# aptitude search php7
i A php7.0-cli                      - command-line interpreter for the PHP scrip
i A php7.0-common                   - Common files for packages built from the P
i   php7.0-fpm                      - server-side, HTML-embedded scripting langu
i A php7.0-json                     - JSON module for PHP
i A php7.0-opcache                  - Zend OpCache module for PHP
i A php7.0-readline                 - readline module for PHP

はいってた。

# ls /etc/php/7.0/fpm
conf.d  php-fpm.conf  php.ini  pool.d

だけど色々とうまくいかなくて php7.0 自体のインストールをやり直すことにしました。

ここを参考に。というか他に日本語で書いてあるとこを参考にしてたけど一向に解決しなかった。いつもお世話になっているので今度 DigitalOcean の VPS でも借りようかな。

# add-apt-repository ppa:ondrej/php

エラー。

# aptitude install -y language-pack-en-base
# LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php

からの

# aptitude update

# aptitude upgrade

ここで事実が発覚

Resolving dependencies...
The following NEW packages will be installed:
  php-pear{a} php7.0-xml{a}
The following packages will be upgraded:
  libwebp5 libwebpmux1 php-common php-gettext php7.0-cli php7.0-common
  php7.0-fpm php7.0-json php7.0-opcache php7.0-readline
10 packages upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 3,720 kB of archives. After unpacking 3,926 kB will be freed.
Do you want to continue? [Y/n/?] y

やっぱりちゃんと入ってなかった。ひどい。

# aptitude install php7.0

本体はインストールされてたみたいで変化なしだった。

# aptitude install php7.0-mysql

あとこれ入ってなかった。

php-fpm

# vi /etc/php/7.0/fpm/pool.d/www.conf
user = www-data
group = www-data 

ほか覚えてません。つらい。

www-data は apache のユーザーをそのまま使いました。

NGINX 設定ファイルを変更

# cd /etc/nginx/conf.d/
# ls
default.conf  example_ssl.conf

この conf.d に入ってれば起動時に認識してくれる。自分はファイル分けました。

# vi sample.conf

とりあえず phpinfo が見れれば nginx と php がまともに動いてることになるので、そのような目標を持って。

upstream php {
    server unix:/var/run/php/php7.0-fpm.sock;
}

WordPress はこれがないとエラー吐いた。

server {
    listen       80;
    server_name  ドメイン;

    charset     utf-8;
    access_log  /var/log/nginx/log/access.log main;
    error_log   /var/log/nginx/log/error.log info;

    root   /usr/share/nginx/html;
    index  index.html index.php;

ドメインのとこはバーチャルホスト。っていうかバーチャルサーバ?どっち?同じ意味?

charset で文字コードの指定をして access_log でアクセスログの場所。ディレクトリがない場合は作っとかないとエラー吐く。うしろについてる main はフォーマットで Apache と同じ combined もある。みたい。よくわかんない。

エラーログも設定中は info にしておきました。でも info レヴェルのエラーログなんてちっとも残ってなかったよ。一番多かったの emerg だったから損した(余計悪い

ディレクトリの指定は Apache のものをそのまま使っても特に問題ないと思うけど、気分転換にコピーして変えました。

    #error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ .php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi.conf;
    }

    location ~ /¥.ht {
        deny  all;
    }

めんどくさかったのが fastcgi_pass で、これが php5-fpm とはぜんぜん違う場所だったので最初てきとうにやって悩んでた。調べるの大事。これでだめならログを見る。そして google 先生に教えを請う。

fastcgi_param はなんか流行ってるよ!って見たから fastcgi.conf にリネームしてみました。

   try_files $uri $uri/ /index.php?q=$uri&$args;
}

最後にパーマリンクの設定。

あと自業自得だけどスペルミスで動かなかったりしたので、

# service nginx configtest

で、エラーがないか確認。

してからの

# service nginx reload

WordPress が動くようにする

まるごとコピーしてもってくる。所有者とかそこらへんは chown しないと管理画面で権限ないです事件が起きます。今回はユーザーを変更していないので

# chown -R www-data:www-data wordpressディレクトリ

そして途中からあらゆる CSS や JavaScript が崩れた。っていうか .CSS とか .JS が 404 エラー。存在するのに存在しないってシュレディンガーの猫か。

#vi /etc/nginx/nginx.conf

#sendfile on;
sendfile off;

こう。エラーログの残らないときはブラウザキャッシュをクリアするとしあわせになれるかもしれません。あとオリジナルサイズの画像以外すべて認識しなくなった。まるっとコピーしたから ls で確認すると存在してる。プラグインでリサイズしてみたら、なんとリサイズ自体ができないという。

調べてみると PHP 拡張モジュールの GD とかいうのがないといけないらしいです。

# aptitude install php-gd

プラグインでサムネイル生成。

あとアップロードサイズ

# vi /etc/php/7.0/fpm/php.ini

# service php7.0-fpm reload

今までは apache の php.ini を書き換えてたのでこっちを書き換えてアップロードの最大サイズ変更。

Apache と NGINX の自動起動

Apache が既に自動起動するようになっているので、それを停止して、代わりに NGINX が自動的に起動するようにします。

# sysv-rc-conf --list apache2
apache2      0:off      1:off   2:on    3:on    4:on    5:on    6:off

ていうかもうちゃんと動いてるし Apache いらないんですが、全部消しちゃうのもこわいので設定は残しておきます。さらば。

# aptitude remove apache2
The following packages will be REMOVED:
  apache2
0 packages upgraded, 0 newly installed, 1 to remove and 1 not upgraded.
Need to get 0 B of archives. After unpacking 474 kB will be freed.
The following packages have unmet dependencies:
 apache2-mpm-prefork : Depends: apache2 (= 2.4.7-1ubuntu4.9) but it is not going to be installed.
 libapache2-mod-php5 : Depends: apache2 (>= 2.4) but it is not going to be installed.
The following actions will resolve these dependencies:

     Remove the following packages:
1)     apache2-mpm-prefork
2)     libapache2-mod-php5
3)     php5
4)     phpmyadmin

phpmyadmin も消えちゃうのか。

The following packages will be REMOVED:
  apache2 apache2-mpm-prefork{a} dbconfig-common{u} libapache2-mod-php5{a}
  libjs-codemirror{u} libjs-jquery-cookie{u} libjs-jquery-event-drag{u}
  libjs-jquery-metadata{u} libjs-jquery-mousewheel{u}
  libjs-jquery-tablesorter{u} libjs-jquery-ui{u} libjs-underscore{u}
  libmcrypt4{u} libonig2{u} libqdbm14{u} php-gettext{u} php5{a} php5-cli{u}
  php5-gd{u} php5-json{u} php5-mcrypt{u} php5-readline{u} phpmyadmin{a}
0 packages upgraded, 0 newly installed, 23 to remove and 1 not upgraded.
Need to get 0 B of archives. After unpacking 48.9 MB will be freed.

この jquery よくわからなくて調べたけどいらないっぽい。よかった。

# sysv-rc-conf --list nginx
nginx        0:off      1:off   2:on    3:on    4:on    5:on    6:off

あれ?

# sysv-rc-conf nginx on
# sysv-rc-conf --list nginx
nginx        0:off      1:off   2:on    3:on    4:on    5:on    6:off

NGINX デフォルトで ON になってるんだって(´・ω・`)

おしまい。