サーバー構築。WordPressを Ubuntu 16.04、Apache、PHP7.0、MySQL環境にインストール

apacheとwordpressのインストールubuntu 16.04 LTSが今年(2016年)の 4月21日にリリースされた。

CentOSであったり、ubuntuあるいは他のディストリビューションの Linuxを使って外部へサーバーを公開しているほとんどの人は、何年かに一度 Linux-OSのアップグレード作業を行うこととなる。つい先日まで、このサイトは、ubuntu 12.04.1上で動いていて、その ubuntu 12.04.1は 2017年4月にサポートが切れてしまう。つまり、自分の場合、アップグレードの期限がその時までであった。

さて、このサーバーを立ち上げたのは 2013年5月。3年以上前だ。サーバーの入れ替えをする際に、各アプリケーションの再インストールや設定が必要で、実はその方法をすっかり忘れてしまっている。何年かに一度、このような作業をやらなければならないわけで、都度思い出したり、調査したりするのはとてもも面倒。なので、最低限動作するまでの過程を自分用メモで残しておくことにした。サイトの環境は次の通り

構築するサイトのサーバー環境
OS ubuntu16.04
webサーバー Apache2.4
データベース MySQL5.7
スクリプト言語 PHP 7.0
ドキュメントルート /var/www/wordpress
マルチプロセッシングモジュール prefork MPM

※ここに記載した設定、操作等は、自分用メモです。それぞれのサイトに応じさらに適切な設定を加えることを推奨します。

インストールと初期設定

Apacheのインストール

悩みどころはマルチプロセッシングモジュール。旧来型の prefork MPMでいくか、新しい event MPMに変更するか。さらに言えば、Apacheではなく Nginxを使うか。考えた末に出た結論は、旧来型の prefork MPM。理由はメンテが楽だから(笑

なお、prefork MPMから event MPMへはここに記載する設定が完了した後でも変更は可能。

sudo apt-get install apache2
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.backup
sudo vi /etc/apache2/sites-available/000-default.conf

#変更前
DocumentRoot /var/www/html

#変更後
DocumentRoot /var/www/wordpress
sudo service apache2 restart
  • 101:Apacheのインストールは基本これ一行。
  • 102:大事な設定ファイルのバックアップ。
  • 103∼109:DocumentRootの変更。

.htaccessの有効化

.htaccessを有効にするために、Apacheの設定変更を行う。

.htaccessは、ApacheのURL書換エンジンである mod_rewriteが有効であるときに動作する。

ubuntu(Debian系)の場合、インストールされているApacheの各モジュールはmods-availableディレクトリに格納されていて、mod-enableディレクトリにシンボリンクを張ることで有効となる。専用のコマンド a2enmod(有効)/ a2dismod(無効)が準備されている。同様に、サイトの設定は、sites-availableにあるファイルをsites- enableへシンボリックリンクを張ることで各ファイル内で設定した内容が有効となる。専用コマンドは、a2ensite(有効)/ a2dissite(無効)。Apacheを設定する上で、Red Hat系(CentOSなど)と Debian系(ubuntuなど)とで大きく異なる点である。

#有効化
sudo a2enmod rewrite

#メッセージの確認
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart

#Apacheを再起動
sudo service apache2 restart
  • 102∼108:モジュールの有効化。再起動後に有効となる。
sudo vi /etc/apache2/apache2.conf

#変更前
<Directory /var/www/html>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted

#変更後
<Directory /var/www/wordpress>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted

#Apacheを再起動
sudo service apache2 restart
  • 110:/www配下にwordpressをディレクトリとして展開するため、対象ディレクトリを変更。
  • 112:NoneをAllに書換。

ところでWordPressは、インストールすると自動的に次のような .htaccessを生成してくれる。 .htaccessを使わずに Apacheの設定ファイルに記述したほうがパフォーマンスは上がるのだが、WordPressはパーマリンクの設定変更や、一部のプラグインにより、.htaccessは書き換えられてしまう。場合がある。参考までにインストール直後に自動生成される .htaccessを示しておく。

#以下の .htaccessは WordPressをインストール後でないと確認出来ません。
sudo cat /var/www/wordpress/.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
  • 105:リクエストされたファイル名が存在した場合は、そのままレスポンス。それ以外は次の行へ。
  • 106:リクエストされたディレクトリ名が存在した場合は、そのままレスポンス。それ以外は次の行へ。
  • 107:すべてのリクエストは/index.phpでレスポンス。




PHPのインストール

Ubuntu 16.04 LTSでは、PHP7.0がインストールされる。ついでに各種ライブラリなども追加。WordPressで使用する(したい)プラグインの中には古いバージョンのほうが安定するものもある。大抵それら古いバージョンのプラグインは PHP7.0環境下では動作してくれない。過渡期所以である。

sudo apt-get install libapache2-mod-php php-mysql php-mbstring php-curl php-gd php-mcrypt php-xml php-xmlrpc

最低限必要なライブラリは、

  • libapache2-mod-php ⇒Apacheとの連携モジュール
  • php-mysql ⇒PHPからMySQLへ接続の接続モジュール
  • php-mbstring ⇒日本語などマルチバイト文字を使う時には必須

それ以外は使う予定が無ければ、敢えて追加する必要は無い。導入するWordPressの機能やプラグインを使う上で、上記以外のライブラリが必要となる場合がある。例えば

  • php-curl ⇒アクセスログ取得の為のプラグインが使う場合がある
  • php-gd ⇒画像ライブラリ WordPressサイトアイコン登録時に必要
  • php-mcrypt ⇒クッキー管理などなど、色々必要
  • php-xml ⇒PHPからXMLを扱うときに必要
  • php-xmlrpc ⇒WordPressへの自動投稿に必要

その時は、次の例のように追加インストール。

#php-curlを追加インストールする方法(例)
sudo apt-get install php-curl
sudo service apache2 restart

MySQLのインストール

MySQL用のデータベース名、ユーザー名及びデータベースパスワードをあらかじめ準備しておく。

sudo apt-get install mysql-server
	mysql -u root -p
	mysql>status;
	mysql>create database wordpress;
	mysql>create user 'ユーザー名'@'localhost' identified by 'データベースパスワード';
	mysql>GRANT ALL PRIVILEGES ON wordpress.* TO 'ユーザー名'@'localhost';
	mysql>FLUSH PRIVILEGES;
	mysql>exit;
  • 101:MySQLのインストールはこの 1行だけ。
  • 102:MySQLにrootでログインし、データベース作成の準備。
  • 104:データベース名を入力。ここでは wordpressを使用。
  • 105:データベース接続 ユーザー名及びパスワードを入力。
  • 106:実行権限を設定。

WordPressのインストール

WordPress本体は、/var/www/直下に設置。その上でドキュメントルートを /var/www/WordPressとすることで、サブディレクトリを隠匿。

cd /var/www/
sudo apt-get install wget
sudo wget https://wordpress.org/latest.tar.gz
sudo tar xvfz latest.tar.gz
ls -la

WordPressと MySQLの接続設定

MySQLのユーザー名とデータベースパスワードと同一にする。

cd /var/www/
sudo cp wordpress/wp-config-sample.php wordpress/wp-config.php
sudo vi wordpress/wp-config.php
	/** WordPress のためのデータベース名 */
	define('DB_NAME', 'wordpress');
	/** MySQL データベースのユーザー名 */
	define('DB_USER', 'ユーザー名');
	/** MySQL データベースのパスワード */
	define('DB_PASSWORD', 'データベースパスワード');

以上の設定で、初期設定でのインストールは終了。ubuntuを再起動した後にブラウザを立ち上げ、ブラウザのアドレズバーに「http://localhost/」と打ち込む。WordPress設定画面が表示されればOK。

http://localhost/

その他(パフォーマンスとセキュリティ)

基本の「apache2.conf」の他、各種ファイルを設定。パフォーマンスやセキュリティに関わることなので慎重に。

DNSの逆引きを停止

リクエスト毎に DNSの逆引きがなされる。有効にすると速度低下が著しい。

sudo vi /etc/apache2/apache2.conf
#変更前
HostnameLookups On

#変更後
HostnameLookups Off

#Apacheを再起動
sudo service apache2 restart
  • 103,106:[HostnameLookups]を Offに。

デフォルトでは Offとなっているはず。Onになっていれば変更。

ディレクトリリスティングの変更

ファイル名が省略された場合(「/(スラッシュ)」で終わるリクエスト)のアクセス優先順位を index.phpが一位となるよう変更。WordPressでの運用なので、index.phpひとつだけ。

sudo vi /etc/apache2/mods-available/dir.conf
#変更前
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm

#変更後
DirectoryIndex index.php

#有効化
sudo a2enmod dir
#Apacheを再起動
sudo service apache2 restart

日本語のコンテンツであることを明示

明示的にjaとする。

sudo vi /etc/apache2/mods-available/mime.conf
#変更前
# DefaultLanguage nl

#変更後
DefaultLanguage ja

#有効化
sudo a2enmod mime
#Apacheを再起動
sudo service apache2 restart

使用言語の優先順位変更

思い切って jaのみに。他言語の国の方々は ……、まあ使っているブラウザさんに頑張っていただくとしか ……

sudo vi /etc/apache2/mods-available/negotiation.conf
#変更前
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

#変更後
LanguagePriority ja

#有効化
sudo a2enmod negotiation
#Apacheを再起動
sudo service apache2 restart

prefork MPMを調整

小規模サイトらしく。

Apache全盛時代の頃の人は、かなり気を使って設定していた項目。現在の潤沢なハードウエアリソースの元では慎重に設定する人は少ない。かなりいい加減でも動いてしまう。自分もかなりいい加減な人なのでまずは適当に設定。実際には、サイトを立ち上げた後に SNMPなどを使って負荷を監視しつつ手を加えていくもの。※記載した設定はサンプルなので、サイトに応じ設定ください。

sudo vi /etc/apache2/mods-available/mpm_prefork.conf
#変更前
<IfModule mpm_prefork_module>
	StartServers		 5
	MinSpareServers		 5
	MaxSpareServers		 10
	MaxRequestWorkers	150
	MaxConnectionsPerChild   0
</IfModule>

#変更後
<IfModule mpm_prefork_module>
	StartServers		 10
	MinSpareServers		 10
	MaxSpareServers		 20
	MaxRequestWorkers	 40
	MaxConnectionsPerChild   0
</IfModule>

#有効化
sudo a2enmod mpm_prefork

#Apacheを再起動
sudo service apache2 restart
  • StartServers:起動時に生成する子プロセスの数。初期値は 5。
  • MinSpareServers:子プロセスの最小個数。。初期値は 5。
  • MaxSpareServers:子プロセスの最大個数。初期値は 10。
  • MaxRequestWorkers:以前のMaxClients。最大同時リクエスト数。初期値は 150。
  • MaxConnectionsPerChild:子プロセスが扱うリクエスト数の上限。初期値は 0(0は上限無しの意)。※後述
このように設定したときの動作は、
  1. サーバ起動時に、一つの親プロセスと StartServers設定値である 10個の子プロセスが生成される。
  2. 子プロセスにリクエストが無ければ、MinSpareServers設定値であるプロセス数まで徐々にプロセスを Killする。ここでは、StartServers=MinSpareServersなので、何も動作しない。
  3. リクエストが増し、IDLE中のプロセスの数が MinSpareServersより少なくなると MinSpareServersになるまで新たな子プロセスを forkする。その上限は動作中のプロセスとIDLE中の合計が MaxRequestWorkers設定値である 40までである。
  4. 動作中のプロセスがリクエスト終了のため減り、IDLE中へ移行するプロセスが増え MaxSpareServersを超えると、プロセスが Killされる。
  5. リクエストがさらに減っていくと、徐々に MinSpareServers設定値までプロセスは戻る。

物理メモリが潤沢であれば、負荷に応じた値を共通(StartServers=MinSpareServers=MaxSpareServers=MaxRequestWorkers)に設定しても良い。こうすることで、CPU負荷は減らせる。またレスポンス向上が見込まれる。逆に値に差を持たせると、CPU負荷は増えるものの、物理メモリは節約出来る。

MaxConnectionsPerChildを無制限にすると、プロセスが消費するメモリの総量の上限が無いものと同意なため、避ける。要はメモリーリーク対策。ただ、時々再起動し、メモリをクリアに出来るのであれば、無制限であったほうが、CPU負荷の高い fork回数は減る。このサーバーは玩具扱いでしょっちゅう再起動を掛けているので無制限のままにしている。

KeepAliveの設定

負荷を見ながら適度に変えていくのが正しい。まずはこの当たりで設定。※記載した設定はサンプルなので、サイトに応じ設定ください。

sudo vi /etc/apache2/apache2.conf
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 10

Apacheサーバー情報の非表示

常に最新のバージョンにしておくのが最善。であってもなるべく必要以上に出力しない設定に。

sudo vi /etc/apache2/conf-available/security.conf
#変更前
#ServerTokens Minimal
ServerTokens OS
#ServerTokens Full

#ServerSignature Off
ServerSignature On

#変更後
#ServerTokens Minimal
#ServerTokens OS
#ServerTokens Full
ServerTokens Prod

ServerSignature Off
#ServerSignature On

#Apacheを再起動
sudo service apache2 restart
  • 104,112:[ServerTokens OS]をコメントアウト。
  • 107,116:[ServerSignature Off]を有効に。
  • 114:[ServerTokens Prod]を追記。
  • 108,117:[ServerSignature On]をコメントアウト。

クロスサイトトレーシング対策

Basic認証による接続は行わないし、でも念のため。

sudo vi /etc/apache2/conf-available/security.conf

TraceEnable off

#Apacheを再起動
sudo service apache2 restart
  • 103:デフォルトで Offとなっているはず。Onになっていれば変更。

ディレクトリの一覧表示を抑止

ディレクトリに含まれるファイル一覧を非表示に。

sudo vi /etc/apache2/apache2.conf
#変更前
<Directory /var/www/wordpress>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

#変更後
<Directory /var/www/wordpress>
    Options -Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

#Apacheを再起動
sudo service apache2 restart
  • 104、111:Indexesの前にマイナス記号を付加。




コンテンツを圧縮

コンテンツを圧縮して、転送量を減らす。

#まずは圧縮したいMIMEタイプ(Content-Type)を追加登録
sudo vi /etc/apache2/mods-available/mime.conf
AddType image/x-icon .ico
AddType image/svg+xml .svg
AddType application/x-font-ttf .ttf
AddType application/x-font-woff .woff
AddType application/x-font-opentype .otf
AddType application/vnd.ms-fontobject .eot

#Apache 2.4では、「AddOutputFilterByType」が非推奨。なので「FilterProvider」を使う。
#圧縮したい MIMEタイプ(Content-Type)を列記
sudo vi /etc/apache2/mods-available/deflate.conf
#変更前
<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		AddOutputFilterByType DEFLATE text/html text/plain text/xml
		AddOutputFilterByType DEFLATE text/css
		AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
		AddOutputFilterByType DEFLATE application/rss+xml
		AddOutputFilterByType DEFLATE application/xml
	</IfModule>
</IfModule>

#変更後
<IfModule mod_deflate.c>
	DeflateCompressionLevel 1
	<IfModule mod_filter.c>
		FilterDeclare COMPRESS
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'text/html'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'text/css'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'text/plain'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'text/xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'text/x-component'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/javascript'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/json'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/ecmascript'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/xhtml+xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/rss+xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ 'application/atom+xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'image/svg+xml'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'image/x-icon'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/x-font-ttf'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/font-woff'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/x-font-otf'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/vnd.ms-fontobject'"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'font/opentype'"
		FilterChain COMPRESS
		FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
	</IfModule>
</IfModule>

#正規表現で次のようにまとめてしまっても良い。お好きな方を。
<IfModule mod_deflate.c>
DeflateCompressionLevel 1
	<IfModule mod_filter.c>
		FilterDeclare COMPRESS
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^text/(html|css|plain|xml|x-component)#i"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^application/(javascript|json|ecmascript|xml|xhtml+xml|rss+xml|atom+xml|x-font-ttf|font-woff|x-font-otf|vnd.ms-fontobject|x-font-ttf)#i"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^image/(svg+xml|x-icon)#i"
		FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'font/opentype'"
		FilterChain COMPRESS
		FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
	</IfModule>
</IfModule>

#モジュールの有効化
sudo a2enmod filter
sudo a2enmod deflate

#Apacheを再起動
sudo service apache2 restart

ブラウザにキャッシュさせる

キャッシュさせたい MIMEタイプ(Content-Type)を列記。画像、動画、そしてフォント+アルファ程度で

sudo vi /etc/apache2/mods-available/expires.conf

<ifModule mod_expires.c>
	ExpiresActive On
	ExpiresDefault "access plus 1 seconds"
	ExpiresByType image/png "access plus 1 months"
	ExpiresByType image/jpeg "access plus 1 months"
	ExpiresByType image/gif "access plus 1 months"
	ExpiresByType image/x-icon "access plus 1 months"
	ExpiresByType image/svg+xml "access plus 6 months"
	ExpiresByType image/x-icon "access plus 1 months"
	ExpiresByType application/x-font-ttf "access plus 1 months"
	ExpiresByType application/font-woff "access plus 1 months"
	ExpiresByType application/x-font-otf "access plus 1 months"
	ExpiresByType application/vnd.ms-fontobject "access plus 1 months"
	ExpiresByType application/x-javascript "access plus 15 days"
	ExpiresByType application/javascript "access plus 15 days"
	ExpiresByType text/javascript "access plus 15 days"
	ExpiresByType text/css "access plus 15 days"
	ExpiresByType video/mp4 "access plus 1 month"
</ifModule>

#モジュールの有効化
sudo a2enmod expires

#Apacheを再起動
sudo service apache2 restart

phpバージョン表示の無効化

sudo vi /etc/php/7.0/apache2/php.ini
#変更前
expose_php=On

#変更後
expose_php=Off

#Apacheを再起動
sudo service apache2 restart
  • 103:デフォルトで OFFとなっているはず、Onの場合は変更。

php使用メモリのサイズ調整

phpが使用可能なメモリ上限は、phpの環境設定ファイルである php.ini以外に WordPress自身でも管理・制御している。次のファイルは「/var/www/wordpress/wp-includes/default-constants.php」で、メモリに関連する箇所を抜粋したもの。

これらの値が十分でない時は phpのプロセスが停止し、中途半端であったり真っ白なページが表示されてしまう。

sudo vi /var/www/wordpress/wp-includes/default-constants.php

#中略

function wp_initial_constants() {

#中略

	// Define memory limits.
	if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MEMORY_LIMIT', $current_limit );
		} elseif ( is_multisite() ) {
			define( 'WP_MEMORY_LIMIT', '64M' );
		} else {
			define( 'WP_MEMORY_LIMIT', '40M' );
		}
	}

	if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} else {
			define( 'WP_MAX_MEMORY_LIMIT', '256M' );
		}
	}

	// Set memory limits.
	$wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT );
	if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) {
		@ini_set( 'memory_limit', WP_MEMORY_LIMIT );
	}

#以下略
  • 109∼118:「WP_MEMORY_LIMIT」はWordPressが使用するメモリー使用量で、マルチサイトであれば、60Mbyteを、そうでなければ 40Mbyteに設定される。
  • 120∼128:「「WP_MAX_MEMORY_LIMIT」は、WordPressが使用するメモリー上限値で、php.ini等で設定された値が無制限もしくは 256Mbyteより大きければそのまま。そうでなければ 256Mbyteが設定値となる。
  • 131∼134:php.ini等で設定された値が「WP_MEMORY_LIMIT」の値より小さければ、「WP_MEMORY_LIMIT」の値を php.iniの「memory_limit」に上書きしている。

このように、条件によっては php.iniで設定した環境設定を上書きすることとなるため、注意が必要である。Apache以外で phpの別プロセスを走らせる場合は、別プロセスの phpが使用するメモリが枯渇する可能性がある。したがって、php.iniで設定する「memory_limit」は無制限値である「-1」もしくは、「WP_MAX_MEMORY_LIMIT」に格納されるであろう値より大きくすることが望ましい。


様々な事を勘案し、default-constants.phpを次のように変更。自作PCなので、物理メモリは潤沢(8G)。ちなみに、このサイトのWirdPressのメモリ使用量は、上限 512Mに対し、10M+アルファしか使われていない。ここに記載している例はかなりメモリを無駄遣いしていると言える。ただ、せっかく 8Gのメモリを挿しているのに、2G程度しか使っていないのは、これはこれでお金の無駄遣いである。サイトの負荷をモニタリングしつつ設定することが肝要。なお、phpの使用メモリの変更に伴い、prefork MPMを再調整を要する場合がある。

厄介な点は、WordPressの更新により上書きされる可能性があること。したがって、更新の都度に内容を確認し、設定し直す必要がある。

sudo vi /var/www/wordpress/wp-includes/default-constants.php

#中略

function wp_initial_constants() {

#中略

#WP_MEMORY_LIMITの 64M,40Mを 256M、128Mへ変更
	// Define memory limits.
	if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MEMORY_LIMIT', $current_limit );
		} elseif ( is_multisite() ) {
			define( 'WP_MEMORY_LIMIT', '256M' );
		} else {
			define( 'WP_MEMORY_LIMIT', '128M' );
		}
	}

#WP_MAX_MEMORY_LIMITを必要に応じ変更(ここでは初期値 256Mから 512Mへ)
	if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
		if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} elseif ( -1 === $current_limit_int || $current_limit_int >  536870912 /* = 512M */ ) {
			define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
		} else {
			define( 'WP_MAX_MEMORY_LIMIT', '512M' );
		}
	}

	// Set memory limits.
	$wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT );
	if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) {
		@ini_set( 'memory_limit', WP_MEMORY_LIMIT );
	}

#以下略

#Apacheを再起動
sudo service apache2 restart
  • 115:マルチサイトの時の[WP_MEMORY_LIMIT]の値を 256Mに設定。
  • 117:マルチサイト以外の時の[WP_MEMORY_LIMIT]の値を 128Mに設定。
  • 125:現在の[memory_limit]の値が 512Mより大きければそのまま変更無し。
  • 128:現在の[memory_limit]の値が 512M以下であれば 512Mを設定。

php.ini内の項目も必要に応じ変更する

sudo vi /etc/php/7.0/apache2/php.ini

#中略

#memory_limitを調整(ここでは初期値が無制限なので変更無し)
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

#中略

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = -1
  • 114:[memory_limit]の値を無制限である -1に設定。

アップロード・POSTファイルサイズの調整

最近では、WordPress投稿記事にファイルサイズが大きな動画などをアップロードするサイトが増えている。ファイルのアップロードサイズの上限初期値は 2Mbyteになっていて、これでは少々心許ない。実際、このサイトの記事の中には、10MBの動画ファイルがアップロードされ埋め込まれている。

上限サイズを必要に応じて増やしてあげる。ここでは、最大アップロードファイルサイズを 30Mbyteに設定。ついでに POSTサイズも変更。

sudo vi /etc/php/7.0/apache2/php.ini

#中略

#post_max_sizを調整
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;

#中略

; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 8M
#20Mに変更
post_max_size = 20M

#upload_max_filesizeを調整
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

#中略

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M
#20Mに変更
upload_max_filesize = 30M
  • 116,118:POSTデータの最大サイズ。初期値は 8M。
  • 129,131:最大アップロードサイズの変更。初期値は 2M。

エラーチェック

#文法チェック
sudo apache2ctl -t
Syntax OK

#状態チェック
sudo apache2ctl -V
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2016-07-14T12:32:26
Server’s Module Magic Number: 20120211:52
Server loaded:  APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with….
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (Ipv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT=”/etc/apache2”
 -D SUEXEC_BIN=”/usr/lib/apache2/suexec”
 -D DEFAULT_PIDLOG=”/var/run/apache2.pid”
 -D DEFAULT_SCOREBOARD=”logs/apache_runtime_status”
 -D DEFAULT_ERRORLOG=”logs/error_log”
 -D AP_TYPES_CONFIG_FILE=”mime.types”
 -D SERVER_CONFIG_FILE=”apache2.conf”

#モジュールチェック
sudo apachectl –M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 expires_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 rewrite_module (shared)
 security2_module (shared)
 setenvif_module (shared)
 status_module (shared)
 unique_id_module (shared)
  • 102:設定のテスト。Syntax OKの表示が出れば「構文上」は問題なし。

その他、不要なモジュールを排除とか、ディレクトリやファイルの所有権・アクセス権等の変更やら。環境に応じて設定。それらは割愛。




コメントを残す

メールアドレスが公開されることはありません。

認証のため計算結果を半角数字で入力願います *