Ubuntu 16.04 + PHP7.2 + Nginx + MariaDB + Durpal8.4.3 環境構築

# 事前準備

    $ sudo apt-get update
    $ sudo apt-get upgrade

# PHP7.2 のインストール
    $ sudo apt-get install software-properties-common
    $ sudo add-apt-repository ppa:ondrej/php
    $ sudo apt-get update
    $ sudo apt-get install php7.2
    $ sudo apt-get install php7.2-mbstring php7.2-mysql php7.2-xml php7.2-gd php7.2-zip

# Apacheの削除
php7.2をインストール時にapacheがインストールされるのでそれを削除

    $ dpkg -l | grep apache
    ii  apache2                             2.4.18-2ubuntu3.5                          amd64        Apache HTTP Server
    ii  apache2-bin                         2.4.18-2ubuntu3.5                          amd64        Apache HTTP Server (modules and other binary files)
    ii  apache2-data                        2.4.18-2ubuntu3.5                          all          Apache HTTP Server (common files)
    ii  apache2-utils                       2.4.18-2ubuntu3.5                          amd64        Apache HTTP Server (utility programs for web servers)
    ii  libapache2-mod-php7.2               7.2.0-2+ubuntu16.04.1+deb.sury.org+2       amd64        server-side, HTML-embedded scripting language (Apache 2 module)
    $ sudo apt-get purge apache2 apache2-utils apache2-bin apache2-data
    $ sudo apt-get autoremove
    $ whereis apache2
    apache2: /etc/apache2
    $ sudo rm -rf /etc/apache2

# Nginxのインストール
    $ sudo apt-get install nginx

# 各種設定
    $ php --ini | grep Loaded
    Loaded Configuration File:         /etc/php/7.2/cli/php.ini
    
    $ sudo vi /etc/php/7.2/cli/php.ini
    672 post_max_size = 10M
    776 cgi.fix_pathinfo=0
    825 upload_max_filesize = 10M

    $ sudo vi /etc/php/7.2/fpm/php.ini
    672 post_max_size = 10M
    776 cgi.fix_pathinfo=0
    825 upload_max_filesize = 10M

    $ sudo vi /etc/nginx/sites-available/default
    51         location ~ \.php    $ {
    52                 include snippets/fastcgi-php.conf;
    53
    54         #       # With php7.0-cgi alone:
    55         #       fastcgi_pass 127.0.0.1:9000;
    56         #       # With php7.0-fpm:
    57                 fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    58         }

    $ sudo vi /etc/nginx/nginx.conf
    # httpの中に追加
    client_max_body_size 10m; # defaule 1m

    $ sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

# 起動確認
    $ sudo systemctl restart nginx
    $ sudo systemctl restart php7.2-fpm
    $ sudo su -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php'

**http://\<your host or ip\>/info.php** にアクセス。

# MariaDBのインストール
    $ sudo apt-get install mariadb-client mariadb-server
    $ sudo systemctl start mysql
    $ sudo mysql_secure_installation
    Enter current password for root (enter for none): Enter
    
    Set root password? [Y/n] Y
    New password:
    Re-enter new password:
    
    Remove anonymous users? [Y/n] Y
    
    Disallow root login remotely? [Y/n] Y
    
    Remove test database and access to it? [Y/n] Y
    
    Reload privilege tables now? [Y/n] Y
    
    $ sudo mysql -u root -p
    Enter password:
    
    MariaDB [(none)]> create database drupaldb;
    MariaDB [(none)]> create user drupaluser@localhost identified by 'drupaluser@';
    MariaDB [(none)]> grant all privileges on drupaldb.* to drupaluser@localhost identified by '*************';
    MariaDB [(none)]> flush privileges;
    MariaDB [(none)]> \q
    
    $ sudo systemctl status mysql

# 自己署名証明書準備
    $ sudo mkdir -p /etc/nginx/ssl
    $ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/drupal.key -out /etc/nginx/ssl/drupal.crt

各種質問はすべて空でEnter

    $ sudo chmod 600 /etc/nginx/ssl/drupal.key

# Drupal用のVirtualHostの設定
    $ sudo mkdir -p /var/www/drupal8
    $ sudo vi /etc/nginx/sites-available/drupal8
    server {
        server_name drupal.me; ## <-- ホスト設定はご自身でお願いします
        root /var/www/drupal8; ## <-- Your only path reference.
    
        listen 80;
        listen [::]:80;
        listen 443 default ssl;
    
        ssl_certificate      /etc/nginx/ssl/drupal.crt;
        ssl_certificate_key  /etc/nginx/ssl/drupal.key;
    
        # Redirect HTTP to HTTPS
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
    
        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
    
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        # Very rarely should these ever be accessed outside of your lan
        location ~* \.(txt|log)$ {
            allow 192.168.0.0/16;
            deny all;
        }
    
        location ~ \..*/.*\.php$ {
            return 403;
        }
    
        location ~ ^/sites/.*/private/ {
            return 403;
        }
    
        # Allow "Well-Known URIs" as per RFC 5785
        location ~* ^/.well-known/ {
            allow all;
        }
    
        # Block access to "hidden" files and directories whose names begin with a
        # period. This includes directories used by version control systems such
        # as Subversion or Git to store control files.
        location ~ (^|/)\. {
            return 403;
        }
    
        location / {
            # try_files $uri @rewrite; # For Drupal <= 6
            try_files $uri /index.php?$query_string; # For Drupal >= 7
        }
    
        location @rewrite {
            rewrite ^/(.*)$ /index.php?q=$1;
        }
    
        # Don't allow direct access to PHP files in the vendor directory.
        location ~ /vendor/.*\.php$ {
            deny all;
            return 404;
        }
    
        # In Drupal 8, we must also match new paths where the '.php' appears in
        # the middle, such as update.php/selection. The rule we use is strict,
        # and only allows this pattern with the update.php front controller.
        # This allows legacy path aliases in the form of
        # blog/index.php/legacy-path to continue to route to Drupal nodes. If
        # you do not have any paths like that, then you might prefer to use a
        # laxer rule, such as:
        #   location ~ \.php(/|$) {
        # The laxer rule will continue to work if Drupal uses this new URL
        # pattern with front controllers other than update.php in a future
        # release.
        location ~ '\.php$|^/update.php' {
            fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
            # Security note: If you're running a version of PHP older than the
            # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
            # See http://serverfault.com/q/627903/94922 for details.
            include fastcgi_params;
            # Block httpoxy attacks. See https://httpoxy.org/.
            fastcgi_param HTTP_PROXY "";
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_intercept_errors on;
            # PHP 5 socket location.
            #fastcgi_pass unix:/var/run/php5-fpm.sock;
            # PHP 7 socket location.
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }
    
        # Fighting with Styles? This little gem is amazing.
        # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
        location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
            try_files $uri @rewrite;
        }
    
        # Handle private files through Drupal. Private file's path can come
        # with a language prefix.
        location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7
            try_files $uri /index.php?$query_string;
        }
    
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            try_files $uri @rewrite;
            expires max;
            log_not_found off;
        }
    }

    $ sudo ln -s /etc/nginx/sites-available/drupal8 /etc/nginx/sites-enabled/
    $ sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    $ sudo systemctl restart nginx


# Durpalのインストールと設定
    $ sudo apt-get install git drush
    $ cd /var/www/drupal8
    /var/www/drupal8$ sudo wget https://ftp.drupal.org/files/projects/drupal-8.4.3.tar.gz
    /var/www/drupal8$ sudo tar -xzf drupal-8.4.3.tar.gz
    /var/www/drupal8$ sudo mv drupal-8.4.3/* .
    /var/www/drupal8$ sudo rm -rf drupal-8.4.3 drupal-8.4.3.tar.gz
    
    /var/www/drupal8$ sudo cp sites/default/default.services.yml sites/default/services.yml
    /var/www/drupal8$ sudo cp sites/default/default.settings.php sites/default/settings.php

    /var/www/drupal8$ sudo mkdir -p sites/default/files
    /var/www/drupal8$ sudo chmod a+w * sites/default/*

**https** でサイトにアクセス

<img width="500" alt="durpal-setup-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/4c7e9d55-60da-6958-21f4-37716390340b.png">
<img width="500" alt="durpal-setup-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/26794e97-a0ea-5cc9-10ef-c7468044d416.png">
<img width="500" alt="durpal-setup-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/2d4ebabc-b742-9a77-9604-ea827a724a4e.png">
<img width="500" alt="durpal-setup-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/a8489fb4-312a-fa80-2641-629aec30f512.png">
<img width="500" alt="durpal-setup-5.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/c99a2b64-f604-3194-ebc2-98e2bda4647a.png">
<img width="500" alt="durpal-setup-6.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/ffd294a5-eb86-b3a3-e75e-8e31376d7518.png">
<img width="500" alt="durpal-setup-7.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/45b4c235-98a2-8e46-99f4-160cacfcf59b.png">
![durpal-setup-8.png](https://qiita-image-store.s3.amazonaws.com/0/77947/924c16dc-d98d-5764-a557-dddf50e262ad.png)
<img width="500" alt="durpal-setup-9.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/df060f83-c405-9963-47d3-7183b0a0f723.png">
<img width="500" alt="durpal-setup-10.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/62e21389-affe-7df3-d754-5c7d41bda017.png">
<img width="500" alt="durpal-setup-11.png" src="https://qiita-image-store.s3.amazonaws.com/0/77947/e2a28069-8151-a22f-e975-c65c5ec49149.png">

一部エラーが表示されましたが、無事にインストール終了。

# セットアップ完了後
    $ sudo chmod 644 /var/www/drupal8/sites/default/settings.php
    $ sudo chmod 644 /var/www/drupal8/sites/default/services.yml
    $ sudo chown -R www-data /var/www/drupal8/sites/default

# コンテンツ / コメント が正しく表示されない場合
**https://\<your host or ip\>/admin/content/comment** にアクセスした際に正しく表示されない場合、Nginxのエラーログが出力されます。

    [error] 23384#23384: *383 FastCGI sent in stderr: "PHP message: PHP Fatal error:
    Declaration of Drupal\comment\Plugin\Menu\LocalTask\UnapprovedComments::getTitle() must be compatible
    with Drupal\Core\Menu\LocalTaskDefault::getTitle(?Symfony\Component\HttpFoundation\Request $request = NULL)
    in /var/www/drupal8/core/modules/comment/src/Plugin/Menu/LocalTask/UnapprovedComments.php on line 14"
    while reading response header from upstream

PHPを直接修正します。

    $ sudo vi /var/www/drupal8/core/modules/comment/src/Plugin/Menu/LocalTask/UnapprovedComments.php

追加

    use Symfony\Component\HttpFoundation\Request;

編集

    public function getTitle() {
    ↓
    public function getTitle(Request $request = NULL) {

# 新規コンテントが追加できない場合
**https://\<your host or ip\>/node/add/****にアクセスした際に正しく表示されない場合、Nginxのエラーログが出力されます。

    2017/12/27 06:57:40 [error] 1317#1317: *12 FastCGI sent in stderr: "PHP message: PHP Fatal error:
    Declaration of Drupal\Core\TypedData\ComputedItemListTrait::getValue() must be compatible
    with Drupal\Core\Field\FieldItemList::getValue($include_computed = false)
    in /var/www/drupal8/core/modules/path/src/Plugin/Field/FieldType/PathFieldItemList.php on line 13"
    while reading response header from upstream

PHPを直接修正します

    $ sudo vi /var/www/drupal8/core/modules/path/src/Plugin/Field/FieldType/PathFieldItemList.php

    /**
     * {@inheritdoc}
     * @todo Revisit the need when all entity types are converted to NG entities.
     */
    public function getValue($include_computed = FALSE) {
      $values = [];
      foreach ($this->list as $delta => $item) {
        $values[$delta] = $item->getValue($include_computed);
      }
      return $values;
    }

これを追加です。