NGINX + uWSGI + PHP-FPM サーバー構築備忘録

0. はじめに

さくらの VPS の標準の OS って Cent OS 5.5 で、ぼくもそのまま開発鯖を運用していた。 でも Cent OS ってオワコン説が囁かれて久しい。 そこで、同じ RHEL クローンの Scientific Linux 6 に入れ替えた。

構成

OS
Scientific Linux 6
ウェブサーバー
NGINX
データベースサーバー
MySQL
バックエンドサーバー
uWSGI, PHP-FPM

注意

  • 登場するディレクトリやファイルは、以下の手順でインストールした場合の場所を示しています。ご自分で設定した場合は適宜読み替えてください。
  • 手順は記載の時に間違いの内容に留意していますが、間違えている可能性もあります。もし、発見された場合は、コメント欄や @yosida95 までお知らせ下さい。
  • ここを参考にした作業によって発生したいかなる損害についても私は責任をおいません。自己責任でお願いします。

1. OS インストール

これは環境によって割愛するけど、普通に CD でブートして後は質問されたことに答えていけばインストール終わる。 GUI だし割りとわかりやすいのでは。 さくらの VPS でも VNC 越しに GUI インストール!!

2. NGINX インストール

NGINX の公式サイトから、安定版のソースをダウンロードして、解凍、インストール。

$ wget http://nginx.org/download/nginx-1.x.x.tar.gz
$ tar jxf nginx-1.x.x.tar.gz
$ ./configure  # オプションはお好みで。
$ make
$ make install

/etc/init.d/nginx の作成

$ /etc/init.d/nginx (start|stop)

って出来たほうが楽ちんだし、再起動したときの自動起動もできるよね!!ってことで、「http://shiken.infrabu.info/nginx/nginx%E3%82%92%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%EF%BC%88%EF%BC%8B%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%EF%BC%89/」様の中段、「 nginx 管理スクリプト」の項に記述されているシェルスクリプトを使わせて頂きました。

$ chkconfig --add nginx
$ chkconfig nginx on

ってやると自動起動できて便利

3. MySQL インストール

最初は最新の rpm をダウンロードしてきて入れてたんだけど、誤って削除しちゃったから面倒になって yum で入れちゃた (∀`*ゞ)テヘッ

$ yum install mysql-server
$ mysql_install_db
$ mysql_secure_installation

4. PHP-FPM のインストール

PHP の公式サイト から適当なミラーサイトを選んでソースをダウンロード、解凍、インストール。

$ wget (ミラーサイトのURI)
$ tar jxf php-5.x.x.tar.bz2
$ cd php-5.x.x
$ ./configure --enable-fpm --with-mysql=/usr --with-libdir=lib64  # 残りのオプションはお好み
$ make
Build complete.
Don't forget to run 'make test'.
$ make test # 私のこと忘れないでね///って言われたので。
$ make install
$ cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
$ vim /usr/local/etc/php-fpm.conf
 25 pid = run/php-fpm.pid  # コメントアウトされているので、;を削除する
105 listen=localhost:9000
# 105行目付近、Listenするソケット。デフォルトでこうなっているが、都合が悪い場合は開いているポートを指定する。
# 160行目付近以降、pmで始まる行がコメントアウトされているので、;を削除する。

$ cp ./sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm
$ chkconfig --add php-fpm  # 自動起動の設定
$ chkconfig php-fpm on
$ vim /etc/init.d/php-fpm
 16 php_fpm_BIN=/usr/local/sbin/php-fpm
 17 php_fpm_CONF=/usr/local/etc/php-fpm.conf
 18 php_fpm_PID=/usr/local/var/run/php-fpm.pid
$ /etc/init.d/php-fpm start  # 起動

5. uWSGI のインストール

pip でインストールできるので、それを使う。 pip が入っていない場合は、 uWSGI のプロジェクトページからソースダウンロードしてインストールするか、すでに setuptools が入っているのなら easy\_install pip で pip を入れてから次のコマンドを実行。

$ pip install uwsgi

6. 動作確認

とりあえず、 nginx.conf を弄って拡張子が php なリクエストと py なリクエストをそれぞれ php-fpm と uWSGI に投げるように記述。

$ cd /usr/local/nginx
$ vim nginx.conf
server {  # 動作確認なので、最初から設定されているserverでやります。
    listen 80;
    server_name '' _;
    location / {
        root html;
        index index.html index.htm;
    }
    location ~ / \.php$ {
        fastcgi_pass   localhost:9000;  # デフォルト値。上記php-fpm.confで設定した値。
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
        include           fastcgi_params;
    }
    location ~ / \.py$ {
        uwsgi_pass   localhost:8000;  # 以下uWSGI起動時に--socketで指定する値。
        include           uwsgi_params;
    }
}
$ /etc/init.d/nginx restart

まずは、PHPから。

$ cd /usr/local/nginx/html
$ vim test.php
<?php
    phpinfo();
?>
$ chmod 755 test.php

次にみんな大好き Python

えーと、 WSGI をしゃべれないといけないんで、ぼくの独断と偏見から Flask を使います (ー`дー´)キリッ

$ cd /usr/local/nginx/html
$ vim test.py
#-*- coding: utf-8 -*-

from flask import Flask

app = Flask(__name__)


@app.route('/test.py')
def test():
    return 'Hello, World!'
$ chmod 755 test.py

Python たん(;´Д`)ハァハァは手がかかる可愛い子なので、アプリケーション毎に uWSGI を起動してやる必要があります。

$ uwsgi --socket localhost:8000 --pythonpath /usr/local/nginx/html/ --module test:app

他にもオプションがありますが、テストなのでこの程度。 実運用なら、 -M オプションを追加して --daemonize (ログファイルのパス) を指定してやるのが良いでしょう。 また、 virtualenv をご利用の方は、 --virtualenv ( Virtualenv へのパス) も必要です。

表示確認と行こうか

http://127.0.0.1/test.phphttp://127.0.0.1/test.py にアクセスして、それぞれお馴染みの phpinfo(); と Hello, World! が表示されれば OK !!

もし、うまく行かなかったら

  • ソースファイルがダウンロードされてしまうようなら、 nginx.conf の設定が間違っている可能性が大きいです。
  • (Chrome|ブラウザ) さんからのエラーページがでたら……。バックエンドサーバーになにか問題があるようです。たとえば、 --module や、 --pythonpath の間違え……。
  • NGINX からのエラーメッセージがでるようなら、バックエンドサーバーが立ち上がっていないか、バックエンドサーバーの IP アドレスないし port が間違っています。同一のマシン内で立ち上げているのならまっさきにポート番号を確認してください。

以上です

ありがとうございました。

備忘録という形で書いたので、なくすよう努力はしたのですが、もしかするとぼくの中での暗黙の了解的な部分が入っているかもしれません。 その際は「ここなにやってるか分からねーぞ、この野郎」って感じでお申し付け下さい。

何か質問がありましたら割りと丁寧にお答えしますが、分からないことは分からないと答えるので悪しからずご了承ください。

P.S.

いえーーーーい!! @red_kanchi みてるーーーーーー???