Drupal 開発環境をローカルに構築


#1.virtualbox + vagrant でcentos7のbox作成

(1) box追加

```bash:
vagrant box add drupal https://atlas.hashicorp.com/chef/boxes/centos-7.0/versions/1.0.0/providers/virtualbox.box 
vagrant init  drupal
```

##(2) 共有フォルダ設定

+ Vagrantfileに以下設定

```bash:Vagrantfile
 # plugin vagrant_vbudgest on
config.vbguest.auto_update = true
#syncedfolder設定
config.vm.synced_folder "./drupal", "/home/vagrant/drupal", :create =>true, :group => 'vagrant', :user => 'vagrant', :mount_options => ['dmode=777', 'fmode=666']

config.vm.network "forwarded_port", guest: 80, host: 8080

config.vm.network "private_network", ip: "192.168.33.32"

config.vm.synced_folder "./drupal", "/home/vagrant/drupal", :create =>true, :group => 'vagrant', :user => 'vagrant', :mount_options => ['dmode=777', 'fmode=666']
```

+ vagrant up時に共有フォルダ関連でエラーは以下対応を実施

```bash:
vagrant ssh
sudo yum -y update kernel
sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
exit

vagrant halt
vagrant up
```

#2.NGINXのインストール
```bash:
sudo yum -y update
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum -y install nginx
sudo service nginx start
sudo systemctl enable nginx.service
#確認
systemctl list-unit-files -t service | grep nginx
```

#3.phpのインストール
`sudo yum -y install php php-mysql php-mbstring php-common php php-cgi php-fpm php-gd`

#4.mysqlのインストール
```bash:
sudo yum -y install mysql
sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
sudo yum -y install mysql-server
sudo service mysqld start
sudo systemctl enable mysqld.service

#mysqlのrootユーザのパスワード変更(drudru)
mysql -u root
UPDATE mysql.user SET Password=PASSWORD('drudru') WHERE User='root';
FLUSH PRIVILEGES;
exit
sudo service mysqld restart

#drupal用データベース作成
mysql -u root -p
CREATE DATABASE drupal DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

grant all on drupal.* to drupal@localhost identified by "palpal";
flush privileges;


#確認
mysql -u drupal -p
(password: palpal)
```

#５．PHP-FPM設定
```bash:
cd /etc/php-fpm.d
sudo cp www.conf www.conf.org
　＊user,groupをvagrantに変更 , pm = staticに変更 ,pm.max_childern=3 ,
request_terminate_timeout = 300 を設定


sudo service php-fpm restart
sudo systemctl enable php-fpm.service
```

#6.drupalのインストール
```bash:
cd ~/
mkdir wk
cd wk
wget http://ftp.drupal.org/files/projects/drupal-7.38.tar.gz
tar xzvf drupal-7.38.tar.gz
cd drupal
cp -r ./* ~/drupal
cd ~/drupal
＊robots.txt以外のtxtファイルは削除
sudo chown vagrant:vagrant ./
#シンボリックリンク作成
sudo ln -fs /home/vagrant/drupal /var/www/drupal
sudo chmod +x /home/vagrant
```

#7.SWAP作成
```bash:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 　
sudo mkswap /swapfile
sudo swapon /swapfile
sudo service mysqld restart

mysql_secure_installation
```

現在のルートパスワードを入力します。デフォルトでは、ルートアカウントにはパスワードが設定されていないので、Enter を押します。
と入力してパスワードを設定し、安全なパスワードを 2 回入力します。
sukisuki19

「Y」と入力して匿名ユーザーアカウントを削除します。
「Y」と入力してルートログインを無効にします。
「Y」と入力してテストデータベースを削除します。
「Y」と入力して権限テーブルを再ロードし、変更を保存します。

#8.nginxの設定
```bash:/etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  nginx;
worker_processes 1;
#worker_cpu_affinity 01 10;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}
```

```/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    access_log /var/log/nginx/localhost/access.log;
    error_log /var/log/nginx/localhost/error.log;
    #charset koi8-r;


    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
```

```/etc/nginx/conf.d/virtual.conf
#ここから本体の設定
server
{
listen 80;
server_name drupal.dev;
#ログの場所を指定
access_log /var/log/nginx/drupal/access.log;
error_log /var/log/nginx/drupal/error.log;
root /var/www/drupal;
index index.php index.html;

# drupalのフォルダ
location / {
root /var/www/drupal;
index index.php index.html;

# パーマリンク用の設定
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.+?($/wp-.*) $1 last;
rewrite ^.+?(/.*\.php)$ $1 last;
rewrite ^ /index.php last;
}
}
# wp-config.phpへのアクセスをすべて拒否します。
location ~* /wp-config.php {
deny all;
}

#静的file
location ~* ^.+.(jpg|jpeg|gif|png|css|js|flv|swf|ico|xml)$ {
access_log off;
expires 30d;
root /var/www/drupal;
}
# Pass PHP scripts to PHP-FPM
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/drupal$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi_params;

}
location ~ /\.ht {
deny all;
}
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last;
}

```

```bash:
#logフォルダの作成とnginx再起動
sudo mkdir /var/log/nginx/localhost
sudo mkdir /var/log/nginx/drupal
sudo chown -R vagrant:vagrant /var/log/nginx
sudo service nginx restart
``` 

#9.drupalのセットアップ
192.168.33.33 drupal.dev をhostsに追加
ブラウザでhttp://drupal.dev に接続し、セットアップ
日本語化はhttps://localize.drupal.org/node/893を参考に
＊本番環境ではセットアップ後に

#10. VM側追加設定　
#(1) Xdebugのインストール

```bash:
#epelの登録
sudo yum -y install epel-release

#epelから　edebugインストール 
sudo yum -y install php-pecl-xdebug --enablerepo=epel

#確認
php -v
#結果以下のようにXdebugのバージョン情報が出力される
PHP 5.5.26 (cli) ・・・
with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
```

php.iniに以下を追加

```bash:php.ini
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_host = 192.168.33.1
```

##(2) 環境変数の設定
```bash:
export PHP_IDE_CONFIG="serverName=drupal.dev"
```

##(3) ついでに・・PHPUnitのインストール
```bash:
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/local/bin/phpunit
phpunit --version
```

##(4) ついでに・・タイムゾーンをJSTに
```
timedatectl list-timezones 
sudo timedatectl set-timezone Asia/Tokyo
```

＊ここまでの状態で　　box化とgit化

#11.PHPStormの設定
##(1)PHPRemoteDebug設定
###①設定
+ PhpStorm メニュー→[Run]→[Edit Configurations…]　で、
[Run/Debug Configurations] ダイアログを開く

+ [+] をクリックして、[PHP Remote Debug] を選択
![Kobito.xjS5SV.png](https://qiita-image-store.s3.amazonaws.com/0/72578/21f9dbac-28cc-78b4-a52b-e689ebdcedfe.png "Kobito.xjS5SV.png")

+  Servers の参照 ... ボタンを押下し、サーバ設定を以下のように行い、 OKボタンで登録。
![Kobito.NqpvfI.png](https://qiita-image-store.s3.amazonaws.com/0/72578/c1668185-bb4a-4047-1069-b686d86b8c4f.png "Kobito.NqpvfI.png")

+ Servers に設定したサーバ名が反映されている事を確認、session id はdummyで何か入れて、OKボタンで登録。
![Kobito.jfkFPp.png](https://qiita-image-store.s3.amazonaws.com/0/72578/816c30df-c8c0-cd14-7f71-b8910e6dbb68.png "Kobito.jfkFPp.png")

###②動作確認
+ PhpStorm にて　リモートデバッグを有効にし、最初の行でBreakする用に設定
+ [Run] – [Start Listen for PHP Debug Connections] 
+ [Run] – [Break at first line in PHP Scripts]

設定後の状態
![Kobito.AJI6Ma.png](https://qiita-image-store.s3.amazonaws.com/0/72578/6ec29a77-7b4c-2de5-0e58-9baf7d9e0890.png "Kobito.AJI6Ma.png")

+ ブラウザで適当なphpファイルを叩く
→PhpStormでデバッグモードに
![Kobito.PhbScn.png](https://qiita-image-store.s3.amazonaws.com/0/72578/5cf8b355-078d-9d07-c894-d42c1459fd99.png "Kobito.PhbScn.png")


+ CLIで適当なphpファイルを叩く

```bash:
vagrant ssh 
php XXX.php
```

→PhpStormでデバックモードに。