さて、ここからが本題の、「Webサーバとして最低限必要なもの」のインストールです。
このエントリーは、「さくらのクラウドに CentOS 7 をインストール」の続きです。基本的に CentOS 7 であれば、ほとんど同じ環境が再現できるのではないかなぁと思いますが、やはり環境によっては向き不向きのようなものが出てきます。
ここでは、 WordPress をマルチサイトで動かすことを前提としての事前作業を書いていきます。
環境によって出来る操作などが異なってくるため、この通りに行えば必ずうまくいくとも限りませんのでご了承ください。
目次
前回までのおさらい
さくらのクラウドに CentOS 7 をインストール
さくらのクラウドの CentOS 7 でユーザー作成とSSHの設定をする
CentOS 7 に Vim エディタをインストール
前回までで、ようやく「Webサーバとして使うための事前準備」ができた状態となります。
今回は、Webサーバを構築し、WordPressをインストールするまでをいっきに説明します。
・・・のつもりでしたが、長くなりすぎるので分割することにしました。
まず、 root アカウントで作業ができるよう、suコマンドを実行しておいてください。
1 2 |
su パスワード:(root のパスワード) |
今回のための事前準備
CentOS 7 の標準リポジトリにないパッケージを使用するため、外部のリポジトリを使用するための準備を行います。
「リポジトリ」という言葉にあまり慣れていませんが、 Windows でいう EXE ファイルや、それを解凍した後の、必要な物が詰まったフォルダ、あるいは Program Files のようなものという解釈。
「外部リポジトリ」って言葉になってくると、ざっと調べた感じだと「github のようなところから必要な物をダウンロードするための機能」なのかしら?
epel リポジトリのインストール
1 |
$ yum -y install epel-release |
インストールするアプリがCentOS標準のリポジトリのアプリと混合しないように、必要なときにのみ明示的に「–enablerepo」を指定しなければ「epel」リポジトリを使用出来ない設定にしておきます。
1 |
$ vim /etc/yum.repos.d/epel.repo |
[epel] の6行目、
1 |
enabled = 1 |
を変更します。
1 |
enabled = 0 |
※ 勝手にアップデートを実行するのを防ぐ “priority = 0” と同じようなものと思っていましたが、違うようです。でも、コマンド入力で –enabled をつけないと実行されないという意味では同じようなものと思っていてもいいのかな?
remi リポジトリの追加
次の2つを実行します。
1 2 |
$ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi $ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm |
1 2 3 |
$ ls /etc/yum.repos.d CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Vault.repo epel-testing.repo remi-php70.repo remi.repo CentOS-CR.repo CentOS-Sources.repo CentOS-fasttrack.repo epel.repo remi-safe.repo |
remi-php70.repo 、 remi-safe.repo 、 remi.repo が追加されています。
上記 ls の結果は一例です。必ずこの通りとは限りません。
PHP7 のインストール
yum を使って PHP7 をインストールします。
1 |
$ yum install --enablerepo=epel,remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-mysql php-gd |
Nginx は PHP を php-fpm で動かします。忘れずにインストールします。
また、WordPressは画像のリサイズを自動で行いますが、それには gd モジュールが必要です。これも忘れずに。
PHPやモジュールのアップデートで更新をかける場合は、以下のようにします。
PHP7本体とGDモジュールの更新をかける際の例。
1 |
$ yum update --enablerepo=epel,remi-php70 php php-gd |
また、PHPのメジャーアップデートの適用のようなことを行う場合は
1 2 |
$ yum-config-manager --disable remi-php70 $ yum-config-manager --enable remi-php71 |
とすれば、次回の yum update から php7.1 が適用されます。
PHP のバージョンを確認
PHP7 のインストールが完了したら、バージョンの確認を行います。
1 2 3 |
PHP 7.0.4 (cli) (built: Mar 2 2016 18:03:26) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies |
※執筆当時、PHP7の最新版は7.0.4です。
文字コードの設定
php.ini の文字コードに関する設定を変更します。
デフォルトのままだと、WordPress で日本語の名前のファイルをアップロードした際に文字化けが発生してしまいます。
1 |
vim /etc/php.ini |
1 |
mbstring.http_input = auto |
という行を探し、
1 |
mbstring.http_input = pass |
に変更します。
php-fpm の設定
PHP7 のインストールと同時に行った php-fpm の設定を行います。
php-fpm の実行ユーザとグループを nginx にし、nginx との連携ができるようにします。
古いファイルの名前を変更し、新しいファイルに内容をコピーしてバックアップをとっておきます。
新しいファイルを編集します。
1 2 3 |
$ cd /etc/php-fpm.d $ cp -p www.conf www.conf_$(date +%Y%m%d-%H%M%S) $ vim www.conf |
それぞれ user と group の名前を変更します。
24 25 |
#user = apache user = nginx |
26 27 |
#group = apache group = nginx |
Nginx のインストール
Nginx 公式からリポジトリをインストールし、その後に Nginx をインストールします。
Nginx リポジトリとパッケージのインストール
1 2 |
$ yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm $ yum install --enablerepo=nginx nginx |
Nginx の設定をする
バーチャルホストとして1つのサーバに複数のドメインを割り当てる場合、Nginx の設定ファイルの作成には、2つの方法があります。
今回は、 WordPress でマルチサイトを構築する想定で、1つのファイルに複数の設定を行う方法を明記します。
まず、編集用のファイルを開き、デフォルトファイルをバックアップします。
1 2 3 |
$ cd /etc/nginx/conf.d $ cp -p default.conf default.conf_$(date +%Y%m%d-%H%M%S) $ vim default.conf |
WordPress 用の設定を書き込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log main; error_log /var/log/nginx/error.log; root /usr/share/nginx/html; index index.php index.html; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location / { try_files $uri $uri/ =404; } #error_page 404 /404.html; # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } ############### example.jp ############### server { listen 80; server_name example.jp; access_log /var/log/nginx/example-jp.access.log main; root /usr/share/nginx/example.jp; index index.php index.html; location = /favicon.ico { log_not_found off; access_log off; try_files $uri $uri/ $uri.php?$args /index.php?$args; } location ~ /wp-admin { rewrite /wp-admin$ $scheme://$host$uri/ permanent; } location ~ /files/$ { rewrite /files/$ index.php last; } location ~ ^/[_0-9a-zA-Z-]+.*/wp-.*/.* { if (!-e $request_filename) { rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last; rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last; rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last; } } location / { try_files $uri $uri/ @wordpress; } location ~ \.php$ { try_files $uri @wordpress; client_max_body_size 32M; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp$fastcgi_script_name; include fastcgi_params; } location @wordpress { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp/index.php; include fastcgi_params; } } ############### fuga.example.jp ############### server { listen 80; server_name fuga.example.jp; access_log /var/log/nginx/fuga-example-jp.access.log main; root /usr/share/nginx/example.jp; #WordPressの設定でサブドメインに飛ぶのでここはサブドメインを含まない index index.php index.html; location = /favicon.ico { log_not_found off; access_log off; try_files $uri $uri/ $uri.php?$args /index.php?$args; } location ~ /wp-admin { rewrite /wp-admin$ $scheme://$host$uri/ permanent; } location ~ /files/$ { rewrite /files/$ index.php last; } location ~ ^/[_0-9a-zA-Z-]+.*/wp-.*/.* { if (!-e $request_filename) { rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last; rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last; rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last; } } location / { try_files $uri $uri/ @wordpress; } location ~ \.php$ { try_files $uri @wordpress; client_max_body_size 32M; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp$fastcgi_script_name; include fastcgi_params; } location @wordpress { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp/index.php; include fastcgi_params; } } ############### hoge.example.jp ############### server { listen 80; server_name hoge.example.jp; access_log /var/log/nginx/hoge-example-jp.access.log main; root /usr/share/nginx/example.jp; #WordPressの設定でサブドメインに飛ぶのでここはサブドメインを含まない index index.php index.html; location = /favicon.ico { log_not_found off; access_log off; try_files $uri $uri/ $uri.php?$args /index.php?$args; } location ~ /wp-admin { rewrite /wp-admin$ $scheme://$host$uri/ permanent; } location ~ /files/$ { rewrite /files/$ index.php last; } location ~ ^/[_0-9a-zA-Z-]+.*/wp-.*/.* { if (!-e $request_filename) { rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last; rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last; rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last; } } location / { try_files $uri $uri/ @wordpress; } location ~ \.php { client_max_body_size 32M; try_files $uri @wordpress; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp$fastcgi_script_name; include fastcgi_params; } location @wordpress { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/example.jp/index.php; include fastcgi_params; } } |
サイトごとに設定ファイルを分ける場合には、
ファイル名に “example.jp.conf” や “hoge.example.jp.conf” 、また “fuga.example.jp.conf” など分かりやすいものにして、それぞれの設定を conf.d 直下に置くと読み込まれます。
「事前作業」と銘打っていますが、 Nginx の設定あたりは自身の環境と相談しながらのほうが、本当は望ましいと思います。
上記は、あくまでも設定作業を行った最終形態がこれだったというものです。
php-fpm と Nginx を起動
Nginx と php-fpm を起動します。
1 2 |
$ systemctl start nginx.service $ systemctl start php-fpm.service |
システムの再起動などを行った際に自動的にサービスが起動するよう、自動起動の設定を行います。
1 2 |
$ systemctl enable nginx.service $ systemctl enable php-fpm.service |
MariaDB の(再)インストール
※2016年12月28日、デフォルトの MariaDB 削除について追記。
今回は、データベースに MariaDB を使用します。 MySQL もインストールすることはできますが、CentOS 7 からは標準のデータベースサーバが MariaDB になったようです。
MariaDB は MySQL との互換性のあるデータベースで、 MySQL よりも処理性能がアップしており、拡張性が上がっています。
自由に使えるサーバで今更 MySQL を選ぶ理由もないので、 MariaDB を使うのですが、デフォルトで入っている MariaDB はバージョンが古いのでいちど削除します。
1 |
$ yum remove mariadb mariadb-server mariadb-libs |
そして、インストールしましょう。
1 |
$ yum install mariadb mariadb-server mariadb-libs |
MariaDB を起動
インストールが完了したら、まず起動します。ついでに自動起動設定も行いましょう。
1 2 |
$ systemctl start mariadb.service $ systemctl enable mariadb.service |
MariaDB の設定
MariaDB を起動したら、次は MariaDB の初期設定を行います。
1 |
$ mysql_secure_installation |
上記を入力すると、いろいろ質問されますので以下のように答えていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Enter current password for root (enter for none):(空のままエンター) # MariaDBのrootユーザパスワード入力。インストール直後は何も設定されていないので「Enter」キーを押下する。 Set root password? [Y/n] # rootユーザのパスワードを設定するかどうかの確認。「y」を入力後、パスワードを設定する。 Remove anonymous users? [Y/n] # 初期設定で作成されている「anonymous」ユーザを削除するかの確認。「y」を入力する。 Disallow root login remotely? [Y/n] # MariaDBの「root」ユーザのリモートログインを禁止するかの確認。「y」を入力し、リモートログインを禁止する。 Remove test database and access to it? [Y/n] # 初期設定で作成されている「test」データベースを削除するかの確認。削除する場合は「y」を入力する。 Reload privilege tables now? [Y/n] # 今設定したユーザ設定をすぐに反映させるかの確認。「y」を入力する。 |
上記で “y” を入力する場面では、「空のままエンター」も同じ挙動です。
文字コードの設定
1 |
vim /etc/my.cnf.d/server.cnf |
設定内容
[mysqld]の部分の設定を変更する
1 2 3 |
[mysqld] character_set_server = utf8mb4 # 上の1行を追加 |
MariaDBを再起動
次のコマンドを入力し、再起動して設定を反映させます。
1 |
systemctl restart mariadb.service |
MariaDB に データベース名と管理ユーザ名を登録
MariaDB に、 WordPress で使用するデータベース名と管理ユーザ名を登録します。
1 2 3 4 5 6 |
$ su パスワード:(root のパスワード) $ mysql -u root -p Enter password:(mariaDB のインストール時に設定したパスワード) MariaDB [(none)]> create database hogehoge( WordPress で使用したいデータベース名); grant all privileges on hogehoge.* to "fugafuga(管理ユーザとして使いたいユーザ名)"@"localhost" identified by "(管理ユーザに設定するパスワード)"; |
最後に、設定を反映させるためのコマンドを入力します。
1 |
FLUSH PRIVILEGES; |
お疲れさまでした
以上で、 WordPress をマルチサイトで動かすための事前準備が整いました。
次回はいよいよ WordPress をインストールします。
参考にしたサイト
CentOS 7 MariaDB インストール、及び初期設定
CentOS7 + MariaDB + Nginx + PHP7 + GCP (+WordPress) の環境構築メモ – Foreignkey, Inc.
CentOS7 + Php7 + Nginx + Php-fpm環境にwordpressインストール | Server-memo.net
CentOS7 に Nginx をインストールする | SaintSouth.NET
nginxでwordpressのパーマリンクをデフォルト以外に対応する – Qiita
php-fpm+nginxでword pressのマルチサイトを作る – びぼろく!
余談
じつは、この構築記事を書くために頑張っていたのですが、変なところ(PHP-FPMの設定)で躓いていてしまいました。
以前にも書いたとおり、ソースビルドで頑張っていて苦戦していたのです。
そのうちに server-memo.net さんの記事が上がっていて、それを参考にさせていただきました。感謝の言葉しかありません。
そのため、この記事に書いてあることは server-memo.net さんとかぶっている部分が多々あります。