CentOS 6.5 + nginx 1.6.1 + Laravel 4.2のインストールメモ

Vagrant内で構築していますが、汎用的に使えるかと思います。

## インストールするパッケージ

* PHP5.5（or 5.6）
* php-mcrypt（暗号とハッシュの生成に利用される）
* php-mysql（PDOを入れたいだけだけど、どうせ使うので）
* Composer（PHPライブラリの依存関係管理に利用される）
* php-fpm
* php-opcache（php5.5以上ではapcではなくopcacheを使用する）
* nginx
* Laravel

※PHP5.6で入れたい場合は以降の「--enablerepo=remi-php55」を「--enablerepo=remi-php56」に置き換えて実行することでインストールできます。

## php5.5のインストール

### epelとremiリポジトリの追加
```bash
$ sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/epel.repo
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/remi.repo
```

### yumでPHP5.5をインストール

```bash
$ sudo yum install php --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

```ini:/etc/php.ini
# 応答ヘッダーにPHPのバージョン等を出力しない
expose_php = Off
# ログレベル。本番環境では E_ALL とする
error_reporting = E_ALL | E_STRICT
# ブラウザでのエラー表示。本番環境では Off とする
display_errors = On
# エラーをログに残す
log_errors = On
# 攻撃の内容を詳しく知る為に 4KB 程に設定
log_errors_max_len = 4096
# エラーログ出力先
error_log = "/var/log/php_error.log"
# 文字エンコーディング
default_charset = "UTF-8"

# タイムゾーン
date.timezone = "Asia/Tokyo"

# デフォルト言語
mbstring.language = Japanese
# 内部文字エンコーディング
mbstring.internal_encoding = UTF-8
# HTTP入力文字エンコーディングのデフォルト
mbstring.http_input = auto
# 文字エンコーディング検出順序のデフォルト
mbstring.detect_order = auto
```

## php-mcryptのインストール
```bash
$ sudo yum install php-mcrypt --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

## php-mysqlのインストール
```bash
$ sudo yum install php-mysql --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

## php-opcacheのインストール
```bash
$ sudo yum install php-opcache --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

設定は推奨設定を使用

```ini:/etc/php.d/opcache.ini
# PHP の CLI 版に対してオペコード・キャッシュを有効にします。 
opcache.enable_cli=1
# OPcache によって使用される共有メモリ・ストレージのサイズ。（MB単位）
opcache.memory_consumption=128
# インターン (intern) された文字列を格納するために使用されるメモリ量。（MB単位） 
opcache.interned_strings_buffer=8
# OPcache ハッシュテーブルのキー（すなわちスクリプト）の最大数。 
opcache.max_accelerated_files=4000
# 更新のためにスクリプトのタイムスタンプをチェックする頻度。（秒単位） 
# 0にすると、OPcacheは、リクエストごとに更新をチェックします。
# ※開発モードの時は0にしないと、変更したコードの更新されず混乱する場合があるので注意。
opcache.revalidate_freq=60
# 有効にすると、それぞれに割り当てられたブロックを解放しない、高速シャットダウン・シーケンスが使用されます。
# しかし、リクエスト変数のすべてのセットをひとまとめに割当てを解除することは、Zend Engineのメモリ・マネージャに依存します。
opcache.fast_shutdown=1

```


## Composerのインストール
```bash
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```

## php-fpmのインストール

### yumでインストール
```bash
$ sudo yum install php-fpm --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

### 設定をnginx用にする
```ini:/etc/php-fpm.conf

# epollを使用する
- ;events.mechanism = epoll
+ events.mechanism = epoll
```
参考：[epollとは](http://kamiyasu2.blog.fc2.com/blog-entry-45.html)



```ini:/etc/php-fpm.d/www.conf
# Unix Socket通信で通信を行う（処理がちょっと早いらしい）
- listen = 127.0.0.1:9000
+ listen = /var/run/php-fpm.sock

# unix socketのパーミッションを設定する
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

# ユーザーとグループ設定
user = nginx
group = nginx

# 許可クライアントを自身のみに。
listen.allowed_clients = 127.0.0.1
```

## Laravel4.2のインストール
### Composerを使用してインストール

```bash
$ composer create-project laravel/laravel project-name --prefer-dist
```

### タイムゾーンと地理情報の設定

```php:app/config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```

### ディレクトリのパーミッションの設定

```bash
$ chown -R nginx app/storage
```


## nginxのインストール

### nginx公式リポジトリを登録する

```bash
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```
こうなってればOK

```ini:/etc/yum.repos.d/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
```

### yumでインストール

```
$sudo yum install -y nginx
```

### Laravelの設定をする
```nginx:/etc/nginx/nginx.conf
user  nginx;
# nginxのworkerプロセスの数を設定します。通常はCPUのコア数以下に設定します。
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    # 一つのworkerプロセスが同時に処理できる最大コネクション数を設定します。
    worker_connections  1024;
}

#----------------------------------------
# アクセス全般に対してのデフォルト設定
#----------------------------------------
http {
    #---------------------------
    # 基本設定
    #---------------------------
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    charset       utf-8;

    #----------------------------
    # ログフォーマットの設定
    #----------------------------
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # アクセスログの設定
    access_log  /var/log/nginx/access.log  main;

    # vagrantの場合はここをOFFにしないと更新ファイルが反映されない場合がある
    # 参考：http://qiita.com/shoyan/items/12389d5beaa8695b1a53
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #-----------------------------
    # Gzip圧縮の設定
    #-----------------------------
    # Gzip圧縮をONにする
    gzip  on;
    gzip_http_version 1.1;
    # Gzip圧縮レベル（通常は１でよい。それ以上はあまり効果無し）
    gzip_comp_level   1;
    # proxy 経由でのアクセス時の gzip 圧縮の設定
    gzip_proxied      any;
    # httpヘッダーに"Vary: Accept-Encoding"がつくようになる
    gzip_vary         on;
    # 圧縮されたレスポンスを格納するために使うバッファ数とバッファサイズ
    gzip_buffers      4 8k;
    # 1000バイト以上のファイルでGzip圧縮を有効にする
    gzip_min_length   1000;
    # 圧縮を有効にするMINEタイプ（text/htmlは常時圧縮対象となるので、指定不要）
    gzip_types        text/plain
                      text/xml
                      text/css
                      text/javascript
                      application/xml
                      application/xhtml+xml
                      application/rss+xml
                      application/atom_xml
                      application/javascript
                      application/x-javascript
                      application/x-httpd-php;
    # IE1～6(特に6は不安定な場合があるらしい)のでgzip圧縮を無効にする
    gzip_disable      "MSIE [1-6]\.";
    # NetscapeもGzip圧縮を無効にする
    gzip_disable      "Mozilla/4";


    #-----------------------------
    # その他の設定
    #-----------------------------
    # 413 Request Entity Too Largeが出る場合があるので大きめに設定しておく
    #client_max_body_size    10m;
    #client_body_buffer_size 256k;

    # nginxのバージョン情報を隠す
    server_tokens off;
    # クライアントがリクエストしてきたHostヘッダの文字列をLocationのホスト名として使う
    server_name_in_redirect off;

    include /etc/nginx/conf.d/*.conf;
}
```

```nginx:/etc/nginx/conf.d/laravel.conf
#-----------------------------
# フロントエンドの設定
#-----------------------------
server {
    #--------------------
    # 基本設定
    #--------------------
    listen 80;
    server_name  localhost;

    # ドキュメントルートの設定
    root /vagrant/public;
    index index.html index.htm index.php;

    # アクセスログの設定
    access_log /var/log/nginx/laravel_access.log;
    # エラーログの設定
    error_log /var/log/nginx/laravel_error.log;

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

    location ~ \.php$ {
        try_files                $uri = 404;
        include                  /etc/nginx/fastcgi_params;
        #fastcgi_pass            127.0.0.1:9000;
        fastcgi_pass             unix:/var/run/php-fpm.sock;

        fastcgi_index            index.php;
        fastcgi_split_path_info  ^(.+\.php)(/.+)$;

        fastcgi_param            SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param            PATHINFO        $fastcgi_path_info;
        fastcgi_param            PATH_TRANSLATED $document_root$fastcgi_path_info;
    }

    error_page 404 /index.php;

    #--------------------
    # 静的ファイル設定
    #--------------------
    # 画像やCSSにはキャッシュの有効期限を設定＆アクセスログOFF
    location ~ \.(html|css|js|jpe?g|png|gif|svg|mpg|flv|swf)$ {
        expires 10d;
        access_log off;
        break;
    }

    # .gitや.htaccessにはアクセス禁止
    location ~ /\.(ht|git|svn) {
        deny all;
    }

    # faviconへのアクセスは記録しない
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    # robots.txtへのアクセスは記録しない
    location = /robots.txt {
        access_log off;
        log_not_found off;
    }
}
```

### nginxの起動と自動起動設定

```bash
$ sudo service nginx start
$ sudo chkconfig nginx on
```

### php-fpmの起動と自動起動設定
```bash
$ sudo /etc/init.d/php-fpm start
$ sudo chkconfig php-fpm on
```

### Laravelが正常に動作しているか確認する
```
http://localhost/
```

### vagrantで構築してローカルマシンからアクセス出来ない時には
きっとiptablesが有効になっているでしょう

```bash
$ sudo service iptables stop
```