1b. 開発環境構築(Windows 10+Ubuntu)(備忘録)

Windows 10用「Ubuntu」が“ストア”から入手できるようになりました。
Microsoft、Windows 10用「Ubuntu」を“ストア”でリリース

Windows8.1の時点では、VMware Playerをインストール後、その上にLinuxをインストールする必要があり、開発環境としてLinuxを使う為に都度VMware Playerを立ち上げなくてはならなかったので、面倒で使わなくなってしまってました。(このサイトの開発環境として使うつもりだったのに、開発環境を使わずに本番環境を直接編集した為、マルチリンガルの英語とセツワナのレイアウトが崩れてしまいました。。開発環境で確認できてれば、このような事態にならなかったのに。。)

Windows 10用「Ubuntu」は、Windowsから直接ターミナルが開けます。MacはLinuxベースなので、直接ターミナルを開いてコマンドが実行できて、LAMP環境も構築できるので、多くの開発者がMacに流れていたようです。次PCを購入する時は自分もMacかなと考えてましたが、このままWindowsを使いつづけても良さそうです。(Windowsが好きな訳ではないです。使ったことのないMacの操作をイチから覚えるなら、慣れ親しんだWindowsでもいいかな思っただけで。)
「Windows Subsystem for Linux」はOS Xのライバルとなるか?

Ubuntu のインストール

Windows 10 Insider Preview のインストール

Windows Insider Program のページから、Windows Insider Program に登録します。その後、Windows 10 Insider Preview のインストール ページに沿って、Insider Preview のインストール後、コンピューターが最新の Insider Preview ビルドに更新されるまで待ちます。(※丸1日掛かります)

※Ubuntuをインストールするには、Windows 10 Version 16215.0 以降が必要ですが、2017/8/8時点で配布されているOS buildは15063.540でした。なので、Windows Insider Programに参加して、開発中の次期バージョンのOS Build 16215.0 以降を使用します。開発中の為バグも多く含んでいるので、待てる人は、OS Build 16215.0 以降が本番リリースされてからUbuntuを使用した方がいいかも知れません。

⇒ 2018/06/04 時点で OS build は 17134.81 でしたので、Windows 10 Insider Preview のインストールは不要となりました。

Windows Subsystem for Linuxのインストール

コントロールパネル ⇒ プログラム ⇒ Windows の機能の有効化または無効化 をクリックし、「Windows の機能」画面の「Windows Subsystem for Linux」にチェックを入れて、再起動します。

(参考) Windows 10にUbuntuをインストールする方法

Ubuntu のインストール

ストアからUbuntuを検索し、インストールします。正確には、Ubuntuではなく、UbuntuのBashがインストールとされます(Ubuntuのデスクトップ画面等は利用できないので)。自分はWindowsストアからインストールしたので、Ubuntuというアプリケーション名でインストールされましたが、Bashからインストールすると、Bash on Ubuntu on Windowsというアプリケーション名でインストールされるようです。こちらの呼び方の方が語弊が無くていいと思います。ちょっと長いので、このサイトでは、Windows版Ubuntuと呼ぶことにします。

(参考) Windows 10にUbuntuをインストールする方法

パッケージの全更新

セキュリティの面から、全パッケージを最新に更新しておきます。

# apt-get update					# パッケージを管理しているDBを最新の状態に更新
# apt-get dist-upgrade				# インストールされているパッケージを全更新。追加でパッケージが必要になった場合もインストールしてくれる
# apt-get install build-essential	# gcc, gdb ...などの開発ツールをインストール

(参考) [Ubuntu] apt-get まとめ

SSHの設定

残念ながらターミナルが使いずらいので(コピペが不便)、TeratermからSSH接続できるように設定していきます。

■Windows10上での操作
・Linux上のSSHのためにポートを開ける
・「Windows ファイアウォール」で新しい規則を選び、TCP port22を有効にする
規則の種類 → ポート
プロトコルおよびポート → TCP ポート22
操作 → 接続を許可する
プロファイル → ドメイン、プライベート
名前 → SSH Service (任意の名前)

⇒ 2018/06/04 時点では、開発者モードに設定することで、SSHポートが開放されます。

参考
Windows10 最新バージョンで知らぬ間にSSHdが起動している

■Ubuntu上での操作
・SSH設定

ホストキーを作成
# cd /etc/ssh
# ssh-keygen -t rsa -N '' -f ssh_host_rsa_key	# keygenで秘密鍵、公開鍵を作成
# ls -l											# ssh_host_rsa_key, ssh_host_rsa_key.pubが作成されたことを確認

sshdの設定
# vi /etc/ssh/sshd_config
rsa以外の下記については、先頭に#をつけてコメントアウト
Hostkey /etc/ssh/ssh_host_dsa/key
Hostkey /etc/ssh/ssh_host_ecdsa/key
Hostkey /etc/ssh/ssh_host_ed25519/key

UsePrivilegeSeparation を no に設定
PasswordAuthentication を yes に設定

# service ssh start			# sshサーバ起動
# ssh localhost				# ssh接続できることを確認

アクセス設定(hosts.deny, hosts.allow)
# vi /etc/hosts.deny
ALL:ALL						# 全てを拒否
# vi /etc/hosts.allow
all:127.0.0.1				# localhost全許可
sshd:127.0.0.1				# sshdはlocalhostからの接続を許可(上記でなぜか許可されなかったので別途記載)
sshd:192.168.0.0/16			# sshdはローカルIP 192.168.*.*からの接続を許可

IPアドレスを指定してssh接続できることを確認
# ssh 192.168.1.1			# 端末のIPアドレスが192.168.1.1の場合

・SSHデーモンを自動起動させる
⇒ 上記で開発者モードに設定した為、自動起動されるようになりました。

Windows版Ubuntuは、各デーモンが自動起動する設定になっていても、ランレベルの概念を持っていない為、自動起動しません。

# sysv-rc-conf --list | grep ssh
ssh          2:on       3:on    4:on    5:on
# who -r							# ランレベルの概念がないので、結果が出力されない
# chmod 4755 /usr/sbin/sshd			# setuidを設定(rootユーザ以外から実行されてもrootユーザ権限でコマンドが実行されるよう設定)

# service ssh stop
$ /usr/sbin/sshd			# rootユーザ以外からsshdを起動
$ service ssh status		# 起動できていることを確認

・以下は、Windows上で作業

Windows 側から sshd を起動するコマンドを作成(C:\opt\start-wsl-sshd.js)
  var ws = new ActiveXObject("WScript.Shell");
  ws.Run("C:\\Windows\\System32\\bash.exe -c \"/usr/sbin/sshd -D\"", 0);

管理者としてコマンドプロンプトを起動
C:\> cd \opt
C:\opt> CScript start-wsl-sshd.js		;; Ubuntu側のsshdが起動できていることを確認

ログイン時に sshd を起動するように、タスクスケジューラに登録
C:\> schtasks /create /tn "Start WSL Sshd" /tr c:\opt\start-wsl-sshd.js /sc onlogon

・Windowsでログオフ/ログインし、Ubuntuのsshdが自動起動されていることを確認

# service ssh status

これで、いつでもTeratermから、IPアドレス(127.0.0.1)でSSH接続できるようになりました。もちろん、コマンドプロンプトでipconfigを叩いてIPアドレスを確認後に、そのIPアドレスでSSH接続することも可能です。

参考
Windows10 BashへのSSH接続メモ
Bash on Ubuntu on Windows で sshd を使用する

ホスト名変更

下記でホスト名変更を試みましたが、Windows版Ubuntuのホスト名は変更できないようです(Windowsのコンピュータ名に紐づいていると思われる)。

$ cat /etc/lsb-release			# バージョン確認
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
$ arch							# アーキテクチャを確認
x86_64							# 64bitマシン

# vim /etc/hostname
dev01

# vim /etc/hosts
# This file is automatically generated by WSL based on the Windows hosts file:
# %WINDIR%\System32\drivers\etc\hosts. Modifications to this file will be overwritten.
127.0.0.1       localhost
127.0.1.1       dev01.localdomain dev01		# この行を変更

# /etc/init.d/networking restart			# ネットワークの再起動
 * Running /etc/init.d/networking restart is deprecated because it may not re-enable some interfaces
 * Reconfiguring network interfaces...                                    [ OK ]

# reboot			# 変更されてないのでリブートを試みるも、Windows版Ubuntuにその機能は備わっていない
Failed to connect to bus: No such file or directory
Failed to talk to init daemon.

Windowsを再起動してみましたが、上記変更したファイルが元に戻って(再度書き換えられて)しまっていました。

LAMP環境構築

Apache

# apt-get update				# パッケージを管理しているDBを最新の状態に更新
# apt-get install apache2		# apache2のインストール
  :
# apache2 -v					# バージョン確認
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-09-18T15:09:02
# service apache2 start			# apache2を起動

ブラウザで http://localhost にアクセスし、下記画面が表示されることを確認

PHP

# php -v								# PHPがインストールされていることを確認
PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
	with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
# apt-get install libapache2-mod-php	# apache2用のPHPモジュールをインストール
  :
# service apache2 restart				# apache2を再起動

ブラウザで http://localhost/info.php にアクセスし、下記画面が表示されることを確認

MySQL

# apt-get install mysql-server			# MySQLをインストール
(インストール中に、MySQL の root のパスワードを設定)
  :
# service mysql start					# MySQLを起動

$ mysql -V								# バージョン確認
mysql  Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using  EditLine wrapper

$ mysql -u root -p						# MySQLに接続できることを確認
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

参考
Ubuntu 16.04 LTS 日本語 Remix でLAMPなど

デーモン自動起動設定

apache2mysql も自動起動させたいですが、Windows版Ubuntuなので、下記で自動起動設定になっていても自動起動しません。

$ sysv-rc-conf -list | egrep "apache2|mysql"		# 自動起動設定はON
apache2      0:off      1:off   2:on    3:on    4:on    5:on    6:off
mysql        0:off      1:off   2:on    3:on    4:on    5:on    6:off
$ ps aux | egrep "apache2|mysql" | grep -v grep		# しかし自動起動されていない
$

.profileに起動する記述を記載して、ログイン時に自動起動するよう設定していきます。最初に、sudoコマンド使用時にパスワードを求められないように、visudoコマンドで、sudoersファイルを編集します。

# visudo
  :
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
user01        ALL=NOPASSWD: /usr/sbin/service apache2 start		# 該当行に下記2行を追加
user01        ALL=NOPASSWD: /usr/sbin/service mysql start
  :
ctrl+x で終了

参考
sudo のパスワードを入力なしで使うには

続いて、.profileを変更します。

$ vi $HOME/.profile
  :							# 最終行に以下を追加
# daemon auto-startup
sudo /usr/sbin/service apache2 start
sudo /usr/sbin/service mysql start

$ exit						# Ubuntuから抜ける

再度ログイン
Last login: Sat Oct 21 04:46:08 2017 from 127.0.0.1
 * Starting Apache httpd web server apache2
[Sat Oct 21 04:47:08.717063 2017] [core:warn] [pid 3832] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT		# FQDNを設定していないので、警告が出力されるようです
 *
 * Starting MySQL database server mysqld										[ OK ]
No directory, logging in with HOME=/

$ ps aux | egrep "apache2|mysql" | grep -v grep			# apache2とmysqlが自動起動されていることを確認
root      3833  0.3  0.3 282432 15632 ?        Ss   04:47   0:00 /usr/sbin/apache2 -k start
www-data  3836  0.0  0.0 282456   868 ?        S    04:47   0:00 /usr/sbin/apache2 -k start
www-data  3837  0.0  0.0 282456   868 ?        S    04:47   0:00 /usr/sbin/apache2 -k start
www-data  3838  0.0  0.0 282456   868 ?        S    04:47   0:00 /usr/sbin/apache2 -k start
www-data  3839  0.0  0.0 282456   868 ?        S    04:47   0:00 /usr/sbin/apache2 -k start
www-data  3840  0.0  0.0 282456   868 ?        S    04:47   0:00 /usr/sbin/apache2 -k start
mysql     3886  1.6  0.0 168876   808 ?        S    04:47   0:00 /bin/sh /usr/bin/mysqld_safe
mysql     4308  3.7  3.2 1727056 131412 ?      Sl   04:47   0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=


WordPressのインストール

  • WordPressのインストール
# apt-get update					# パッケージを管理しているDBを最新の状態に更新
# apt-get install wordpress			# wordpressのインストール
# cd /usr/share/doc/wordpress
# view README.Debian				# Apacheとデータベースのセットアップが必要なようなので目を通しておく
  :
# cd examples
# gzip -d setup-mysql.gz
# chmod a+x setup-mysql				# 実行権付与
# ./setup-mysql -n wordpress blog.example.com	# -n の後に mysql のユーザ名とデータベース名を指定(ここではwordpressとした)
# cp apache.conf /etc/apache2/sites-available/wordpress.conf
# cd /etc/apache2/sites-available/
# vim wordpress.conf				# 以下の部分を除いて全てコメントアウト
		NameVirtualHost *:80

		<VirtualHost *:80>
		ServerName blog.example.com		# 自身の環境に置き換える
		DocumentRoot /usr/share/wordpress/
		DirectoryIndex index.php index.html
		ErrorLog /var/log/apache2/wp-error.log
		TransferLog /var/log/apache2/wp-access.log

		# wp-content in /var/lib/wordpress/wp-content
		Alias /wp-content /var/lib/wordpress/wp-content

		<Directory /usr/share/wordpress>
			Options FollowSymLinks
			<IfVersion < 2.3>
				Order allow,deny
				Allow from all
			</IfVersion>
			<IfVersion >= 2.3>
				Require all granted
			</IfVersion>
		</Directory>
		<Directory /var/lib/wordpress/wp-content>
			Options FollowSymLinks
			<IfVersion < 2.3>
				Order allow,deny
				Allow from all
			</IfVersion>
			<IfVersion >= 2.3>
				Require all granted
			</IfVersion>
		</Directory>
		</VirtualHost>

# a2enmod rewrite			# confに記載の通り、下記2行を実行
# a2enmod vhost_alias
# vim /etc/wordpress/config-blog.example.com.php	# 下記を最終行に追記
  :
define('WPLANG', 'ja');         # 言語を日本語に

# a2ensite wordpress.conf		# 編集したconfファイルを有効化
# a2dissite 000-default.conf	# デフォルトのconfファイルを無効化
  • テーマの編集やプラグインのアップデートを可能にする

テーマの編集やプラグインのアップデートを可能にする為に、wp-content配下の所有者を変更します。

WordPressでテーマを編集してプラグインを更新できるようにするには、すべてのテーマとプラグインがWebサーバーユーザー(www-data)によって所有されていることを確認する必要があります。これは/var/lib/wordpress/wp-content/にインストールしたテーマとプラグインで簡単に実行できます:

$ sudo chown -R www-data /var/lib/wordpress/wp-content

しかし、デフォルトのテーマとプラグイン(/usr/share/wordpress/wp-content/にインストールされています)はrootユーザーが所有しています。それらを編集可能にしたい場合は、/var/lib/wordpress/wp-content/内の対応するシンボリックリンクを削除し、そこにデフォルトのテーマとプラグインのフルコピーを置く必要があります。その後、以前のchownコマンドを再実行する必要があります。

README.Debianより引用

# cd /var/lib/wordpress/wp-content					# 以下のディレクトリにあるシンボリックリンクを削除
# rm -r ./themes
# rm -r ./plugins
# rm -r ./languages
# cp -rp /usr/share/wordpress/wp-content/themes .	# /usr/share/wordpress/wp-contentからコピー
# cp -rp /usr/share/wordpress/wp-content/plugins .
# cp -rp /usr/share/wordpress/wp-content/languages .
# chown -R www-data /var/lib/wordpress/wp-content	# Webサーバーユーザー(www-data)に所有者を変更

# 後述のプラグインの更新で、権限の問題で上記では上手くいかなかったので、所有者をftp実行ユーザに変更
# chown -R XXXXX /var/lib/wordpress/wp-content

# 上記でも権限の問題で上手くいかなかったので、デフォルトのテーマとプラグインの所有者もftp実行ユーザに変更
# chown -R XXXXX /usr/share/wordpress/wp-content

# /etc/init.d/apache2 restart						# apacheの再起動

参考
WordPressをubuntu16.04へインストールする方法
UbuntuにWordpressをインストール

  • WordPressのセットアップ

今回は開発環境を構築しているので、実際のWebサーバはblog.example.comではなく、localhostです。従って、Windowsのhostsファイル(C:\Windows\System32\drivers\etc\hosts)で別名を設定しておきます。

(変更前)
#	127.0.0.1		localhost
(変更後)
127.0.0.1		localhost blog.example.com

apache2も起動させておく必要があるので、Teratermでlocalhostにログインして、apache2デーモンを自動起動させておきます。

# service apache2 status
 * apache2 is running

今回の場合であれば、以下URLにアクセスして、WordPressをセットアップしていきます。
http://blog.example.com

必要事項を入力します。パスワードはWordPressが設定したものを使うのがベターですが、localhostの開発環境なので、簡単なパスワードに変更しておきます。その後、WordPressをインストールをクリックします。

完了メッセージが表示されたら、ログインをクリック

ユーザ名とパスワードを入力してログインできることを確認。

  • apache2の再起動

WordPressのインストール後、apache2を再起動します。WordPressのインストール後に、AH00548&AH00558というエラーが発生しているので、対応します。

# service apache2 restart
 * Restarting Apache httpd web server apache2
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/sites-enabled/wordpress.conf:28
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
[Sun Oct 29 17:31:44.303250 2017] [core:warn] [pid 844] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT

# AH00548は、28行目のNameVirtualHostは効果がない(次のリリースで削除される)とのメッセージなので、コメントアウトしておきます。
# vi /etc/apache2/sites-enabled/wordpress.conf
###     NameVirtualHost *:80				# コメントアウト

# AH00558のメッセージを表示しないように、fqdn.confファイルを新規作成し、ServerNameを設定
# vi /etc/apache2/conf-available/fqdn.conf
ServerName	$HOSTNAME						# ServerNameを設定

# a2enconf fqdn
# service apache2 restart					# 再度apache2を再起動して、AH00548&AH00558が表示されなくなったことを確認
 * Restarting Apache httpd web server apache2
[Sun Oct 29 18:15:19.080600 2017] [core:warn] [pid 992] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
										[ OK ]

参考
apache インストール/設定 メモ
apache2再起動時にAH00558が発生する

vsftpdのインストール

WordPressのプラグインの更新等ftp接続が必要になるので、最初に vsftpd で ftpサーバを構築しておきます。

  • vsftpdのインストール
# apt-get update				# パッケージを管理しているDBを最新の状態に更新
# apt-get install vsftpd		# vsftpdのインストール
  • configファイルを編集

# vim /etc/vsftpd.conf

# Example config file /etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
#
# Run standalone?  vsftpd can run either from an inetd or as a standalone
# daemon started from an initscript.
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
listen_ipv6=YES
#
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO					# 匿名ユーザのアクセスを拒否する(デフォルト設定)
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES					# FTP書き込みコマンドを有効にする
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
#local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
#xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES				# アスキーモードのアップロードを許可
ascii_download_enable=YES			# アスキーモードのダウンロードを許可
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd.banned_emails
#
# You may restrict local users to their home directories.  See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
#chroot_local_user=YES
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES			# 設定したディレクトリより上層への移動を禁止する
chroot_list_enable=YES			# リストアップしたユーザはchrootの対象から除外できる
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list	# リストアップのファイルの場所を指定する
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
ls_recurse_enable=YES			# サブフォルダを含む一括アップロード・ダウンロードを出来るようにする
#
# Customization
#
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
#utf8_filesystem=YES

# Specify root directory of chroot
local_root=/usr/share/wordpress		# chroot のルートディレクトリを指定する

# Use localtime
use_localtime=yes					# ローカルタイムを使う
  • アクセス許可をするユーザを設定する

下記コマンドで、アクセスするユーザ名を入力する

# vim /etc/vsftpd.chroot_list
  • vsftpdを再起動する
# service vsftpd restart
  • vsftpdデーモン自動起動設定

Windows版Ubuntuの為、デーモンが自動起動しないので、.profileにvsftpdデーモンを自動起動する設定を追記します。

$ vi $HOME/.profile
  :							# 最終行(apache2,mysqlの下)に以下を追加
# daemon auto-startup
sudo /usr/sbin/service apache2 start
sudo /usr/sbin/service mysql start
sudo /usr/sbin/service vsftpd start
  • 動作確認
$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:XXXXXX):			# ユーザ名を入力
331 Please specify the password.
Password:							# パスワードを入力
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye							# byeで抜ける

参考
さくらVPS(Ubuntu16.04)でFTPを使えるようにする

WordPressの設定

プラグインとテーマの更新

上記でWordPressにログインすると、下記の管理画面が開きます。プラグインをクリックして、必要な更新を確認します。

プラグインチェックボックスにチェックして、全てのプラグインを更新します。

必要な情報を入力し、ftp接続で更新。

プラグイン更新が更新されました。

左側のパネルの更新をクリックして、テーマを更新します。

テーマが更新されました。

実際に表示されるサイトの画面は、サイトを表示をクリックすると確認できます。

まだ記事を投稿していないので、サンプルページが表示されています。

長くなってしまったので、WordPressの設定については、改めて別記事に記載しようと思います。
※VMware Player はソッコーで削除しました!!

Rails環境構築

ノートPCを買い替えたので、上記LAMP環境の再構築もやらなきゃですが、今はRailsの勉強をしているので(Cloud9で)、今回はRailsの環境構築をしていきます。上記のように、Ubuntuをインストールしておきます。

Ubuntu 14.04から「apt-get」ではなくて「apt」コマンドが推奨されているそうなので、下記コマンドでパッケージを最新の状態にします。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04						# バージョンは16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
$ sudo apt update
$ sudo apt upgrade							# 80%まで進んだところのMySQLの箇所で進まなくなる…

$ sudo apt upgrade							# 再実行
E: dpkg は中断されました。問題を修正するには 'dpkg --configure -a' を手動で実行する必要があります。
$ 

上記dpkgコマンドを実行すると、依存関係の問題が大量発生…

$ sudo dpkg --configure -a
python-apt-common (1.1.0~beta1ubuntu0.16.04.2) を設定しています ...
git-man (1:2.7.4-0ubuntu1.4) を設定しています ...
keyboard-configuration (1.108ubuntu15.4) を設定しています ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: パッケージ keyboard-configuration の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
python3-apt (1.1.0~beta1ubuntu0.16.04.2) を設定しています ...
libmspack0:amd64 (0.5-1ubuntu0.16.04.2) を設定しています ...
libssl1.0.0:amd64 (1.0.2g-1ubuntu4.13) を設定しています ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: パッケージ libssl1.0.0:amd64 の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
libisc-export160 (1:9.10.3.dfsg.P4-8ubuntu1.11) を設定しています ...
update-notifier-common (3.168.9) を設定しています ...
libelf1:amd64 (0.165-3ubuntu1.1) を設定しています ...
linux-libc-dev:amd64 (4.4.0-135.161) を設定しています ...
dns-root-data (2018013001~16.04.1) を設定しています ...
libdns-export162 (1:9.10.3.dfsg.P4-8ubuntu1.11) を設定しています ...
initramfs-tools (0.122ubuntu8.12) のトリガを処理しています ...
libpng12-0:amd64 (1.2.54-1ubuntu1.1) を設定しています ...
open-iscsi (2.0.873+git0.3b4b4500-14ubuntu3.5) を設定しています ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: パッケージ open-iscsi の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
libxml2:amd64 (2.9.3+dfsg1-1ubuntu0.6) を設定しています ...
libmagic1:amd64 (1:5.25-2ubuntu1.1) を設定しています ...
libdrm-common (2.4.91-2~16.04.1) を設定しています ...
squashfs-tools (1:4.3-3ubuntu2.16.04.3) を設定しています ...
libglib2.0-data (2.48.2-0ubuntu4.1) を設定しています ...
libc-bin (2.23-0ubuntu10) のトリガを処理しています ...
libldap-2.4-2:amd64 (2.4.42+dfsg-2ubuntu3.3) を設定しています ...
sosreport (3.5-1~ubuntu16.04.3) を設定しています ...
liblwres141:amd64 (1:9.10.3.dfsg.P4-8ubuntu1.11) を設定しています ...
dpkg: 依存関係の問題により openssl の設定ができません:
 openssl は以下に依存 (depends) します: libssl1.0.0 (>= 1.0.2g) ...しかし:
  パッケージ libssl1.0.0:amd64 はまだ設定されていません。

dpkg: パッケージ openssl の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
dnsmasq-base (2.75-1ubuntu0.16.04.5) を設定しています ...
shared-mime-info (1.5-2ubuntu0.2) を設定しています ...
python3-urllib3 (1.13.1-2ubuntu0.16.04.2) を設定しています ...
mysql-server-5.7 (5.7.23-0ubuntu0.16.04.1) を設定しています ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: パッケージ mysql-server-5.7 の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
dpkg: 依存関係の問題により console-setup-linux の設定ができません:
 console-setup-linux は以下に依存 (depends) します: keyboard-configuration (= 1.108ubuntu15.4) ...しかし:
  パッケージ keyboard-configuration はまだ設定されていません。

dpkg: パッケージ console-setup-linux の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
libslang2:amd64 (2.3.0-2ubuntu1.1) を設定しています ...
libx11-data (2:1.6.3-1ubuntu2.1) を設定しています ...
libpolkit-gobject-1-0:amd64 (0.105-14.1ubuntu0.1) を設定しています ...
cloud-init (18.3-9-g2e62cb8a-0ubuntu1~16.04.2) を設定しています ...
新バージョンの設定ファイル /etc/cloud/cloud.cfg をインストールしています ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: パッケージ cloud-init の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
dpkg: 依存関係の問題により console-setup の設定ができません:
 console-setup は以下に依存 (depends) します: console-setup-linux ...しかし:
  パッケージ console-setup-linux はまだ設定されていません。
 console-setup は以下に依存 (depends) します: keyboard-configuration (= 1.108ubuntu15.4) ...しかし:
  パッケージ keyboard-configuration はまだ設定されていません。

dpkg: パッケージ console-setup の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
dpkg: 依存関係の問題により libdns162:amd64 の設定ができません:
 libdns162:amd64 は以下に依存 (depends) します: libssl1.0.0 (>= 1.0.0) ...しかし:
  パッケージ libssl1.0.0:amd64 はまだ設定されていません。

dpkg: パッケージ libdns162:amd64 の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
dpkg: 依存関係の問題により mysql-server の設定ができません:
 mysql-server は以下に依存 (depends) します: mysql-server-5.7 ...しかし:
  パッケージ mysql-server-5.7 はまだ設定されていません。

dpkg: パッケージ mysql-server の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
libisc160:amd64 (1:9.10.3.dfsg.P4-8ubuntu1.11) を設定しています ...
libpolkit-agent-1-0:amd64 (0.105-14.1ubuntu0.1) を設定しています ...
libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.9) を設定しています ...
dpkg: 依存関係の問題により libisccfg140:amd64 の設定ができません:
 libisccfg140:amd64 は以下に依存 (depends) します: libdns162 ...しかし:
  パッケージ libdns162:amd64 はまだ設定されていません。

dpkg: パッケージ libisccfg140:amd64 の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
libx11-6:amd64 (2:1.6.3-1ubuntu2.1) を設定しています ...
dpkg: 依存関係の問題により dnsutils の設定ができません:
 dnsutils は以下に依存 (depends) します: libdns162 (= 1:9.10.3.dfsg.P4-8ubuntu1.11) ...しかし:
  パッケージ libdns162:amd64 はまだ設定されていません。
 dnsutils は以下に依存 (depends) します: libisccfg140 (= 1:9.10.3.dfsg.P4-8ubuntu1.11) ...しかし:
  パッケージ libisccfg140:amd64 はまだ設定されていません。

dpkg: パッケージ dnsutils の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
file (1:5.25-2ubuntu1.1) を設定しています ...
libdrm2:amd64 (2.4.91-2~16.04.1) を設定しています ...
snapd (2.34.2) を設定しています ...
新バージョンの設定ファイル /etc/apparmor.d/usr.lib.snapd.snap-confine.real をインストールしています ...
新バージョンの設定ファイル /etc/profile.d/apps-bin-path.sh をインストールしています ...
libisccc140:amd64 (1:9.10.3.dfsg.P4-8ubuntu1.11) を設定しています ...
libpolkit-backend-1-0:amd64 (0.105-14.1ubuntu0.1) を設定しています ...
ubuntu-core-launcher (2.34.2) を設定しています ...
dpkg: 依存関係の問題により libbind9-140:amd64 の設定ができません:
 libbind9-140:amd64 は以下に依存 (depends) します: libdns162 ...しかし:
  パッケージ libdns162:amd64 はまだ設定されていません。
 libbind9-140:amd64 は以下に依存 (depends) します: libisccfg140 ...しかし:
  パッケージ libisccfg140:amd64 はまだ設定されていません。

dpkg: パッケージ libbind9-140:amd64 の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
git (1:2.7.4-0ubuntu1.4) を設定しています ...
dpkg: 依存関係の問題により bind9-host の設定ができません:
 bind9-host は以下に依存 (depends) します: libbind9-140 (= 1:9.10.3.dfsg.P4-8ubuntu1.11) ...しかし:
  パッケージ libbind9-140:amd64 はまだ設定されていません。
 bind9-host は以下に依存 (depends) します: libdns162 (= 1:9.10.3.dfsg.P4-8ubuntu1.11) ...しかし:
  パッケージ libdns162:amd64 はまだ設定されていません。
 bind9-host は以下に依存 (depends) します: libisccfg140 (= 1:9.10.3.dfsg.P4-8ubuntu1.11) ...しかし:
  パッケージ libisccfg140:amd64 はまだ設定されていません。

dpkg: パッケージ bind9-host の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
apt-transport-https (1.2.27) を設定しています ...
curl (7.47.0-1ubuntu2.9) を設定しています ...
policykit-1 (0.105-14.1ubuntu0.1) を設定しています ...
pollinate (4.33-0ubuntu1~16.04.1) を設定しています ...
initramfs-tools (0.122ubuntu8.12) のトリガを処理しています ...
libc-bin (2.23-0ubuntu10) のトリガを処理しています ...
処理中にエラーが発生しました:
 keyboard-configuration
 libssl1.0.0:amd64
 open-iscsi
 openssl
 mysql-server-5.7
 console-setup-linux
 cloud-init
 console-setup
 libdns162:amd64
 mysql-server
 libisccfg140:amd64
 dnsutils
 libbind9-140:amd64
 bind9-host
$ 
$ sudo dpkg --audit							# 原因を確認
別のプロセスが書き込み対象のデータベースをロックしていて現在それを変更している可能性があるので、以下の問題のいくつかは単にそのせいである可能性があります。
  :
以下のパッケージは最初の設定中に問題が発生したため、設定が終了していません。
dpkg --configure <パッケージ> か dselect で設定 (configure) メニューオプションを使って設定作業を再試行しなければなりません:
 cloud-init           Init scripts for cloud instances
 keyboard-configuration system-wide keyboard preferences
 libssl1.0.0:amd64    Secure Sockets Layer toolkit - shared libraries
 mysql-server-5.7     MySQL database server binaries and system database setup
 open-iscsi           iSCSI initiator tools

$ sudo dpkg --configure cloud-init				# 以下も含めてエラー(他のプロセスがファイルをロックしている等)の場合は、該当ファイルを削除して再実行
$ sudo dpkg --configure keyboard-configuration
$ sudo dpkg --configure libssl1.0.0:amd64
$ sudo dpkg --configure open-iscsi

$ sudo dpkg --configure mysql-server-5.7					# mysql-server-5.7は上手くいかない
mysql-server-5.7 (5.7.23-0ubuntu0.16.04.1) を設定しています ...
invoke-rc.d: could not determine current runlevel
 * Stopping MySQL database server mysqld        [ OK ]
invoke-rc.d: could not determine current runlevel
invoke-rc.d: could not determine current runlevel
 * Stopping MySQL database server mysqld        [ OK ]
invoke-rc.d: could not determine current runlevel
mysql_upgrade: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) while connecting to the MySQL server
Upgrade process encountered error and will not continue.
mysql_upgrade failed with exit status 11
dpkg: パッケージ mysql-server-5.7 の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
処理中にエラーが発生しました:
 mysql-server-5.7

$ sudo apt purge mysql-server mysql-server-5.7 mysql-common		# MySQLの関連パッケージ含めて削除
$ sudo apt autoremove
$ sudo rm -r /etc/mysql											# MySQLのディレクトリも削除
$ sudo rm -r /var/lib/mysql
$ sudo apt install mysql-server mysql-server-5.7 mysql-common	# MySQLの関連パッケージ含め再インストール


Ruby及びRailsのインストール

$ sudo apt install ruby							# Rubyのインストール
$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

$ sudo apt install ruby-bundler					# Bundlerのインストール

$ printf "install: --no-rdoc --no-ri\nupdate:  --no-rdoc --no-ri\n" >> ~/.gemrc		# Railsチュートリアルに沿って記述
$ sudo gem install rails -v 5.1.6				# Railsのインストール
Fetching: concurrent-ruby-1.0.5.gem (100%)
Successfully installed concurrent-ruby-1.0.5
$ rails -v
Rails 4.2.6

$ mkdir environment
$ cd environment
$ rails new hello_app
      create
      create  README.rdoc
      create  Rakefile
$ cd hello_app
$ vi Gemfile									# Railsチュートリアルに沿って記述する


下記の「bundle install」で大量のエラー発生

$ bundle install								# 上記Gemfileの記載に従ってgemをインストール
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.....
Installing rake 12.3.1
Using concurrent-ruby 1.0.5
Installing minitest 5.11.3
Using thread_safe 0.3.6
Installing builder 3.2.3
Using erubi 1.7.1
Using mini_portile2 2.3.0
Installing crass 1.0.4
Using rack 2.0.5
Installing nio4r 2.3.1 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-18bxvg8nio4r-2.3.1/gems/nio4r-2.3.1/ext/nio4r
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-k1o3dq.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-18bxvg8nio4r-2.3.1/gems/nio4r-2.3.1 for inspection.
Results logged to /tmp/bundler20180923-1805-18bxvg8nio4r-2.3.1/extensions/x86_64-linux/2.3.0/nio4r-2.3.1/gem_make.out
Installing websocket-extensions 0.1.3
Using mini_mime 1.0.1
Using arel 8.0.0
Installing bindex 0.5.0 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-15nveudbindex-0.5.0/gems/bindex-0.5.0/ext/bindex
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-1wkzfn2.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-15nveudbindex-0.5.0/gems/bindex-0.5.0 for inspection.
Results logged to /tmp/bundler20180923-1805-15nveudbindex-0.5.0/extensions/x86_64-linux/2.3.0/bindex-0.5.0/gem_make.out
Using bundler 1.11.2
Installing byebug 9.0.6 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-11n5ngvbyebug-9.0.6/gems/byebug-9.0.6/ext/byebug
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-rqg5vn.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-11n5ngvbyebug-9.0.6/gems/byebug-9.0.6 for inspection.
Results logged to /tmp/bundler20180923-1805-11n5ngvbyebug-9.0.6/extensions/x86_64-linux/2.3.0/byebug-9.0.6/gem_make.out
Installing coffee-script-source 1.12.2
Installing execjs 2.7.0
Installing method_source 0.9.0
Installing thor 0.20.0
Installing ffi 1.9.25 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-1fb7331ffi-1.9.25/gems/ffi-1.9.25/ext/ffi_c
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-15d14ya.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-1fb7331ffi-1.9.25/gems/ffi-1.9.25 for inspection.
Results logged to /tmp/bundler20180923-1805-1fb7331ffi-1.9.25/extensions/x86_64-linux/2.3.0/ffi-1.9.25/gem_make.out
Installing multi_json 1.13.1
Installing rb-fsevent 0.10.3
Installing ruby_dep 1.5.0
Installing puma 3.9.1 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-1helrispuma-3.9.1/gems/puma-3.9.1/ext/puma_http11
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-198870b.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-1helrispuma-3.9.1/gems/puma-3.9.1 for inspection.
Results logged to /tmp/bundler20180923-1805-1helrispuma-3.9.1/extensions/x86_64-linux/2.3.0/puma-3.9.1/gem_make.out
Installing tilt 2.0.8
Installing sqlite3 1.3.13 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-1d9e3b4sqlite3-1.3.13/gems/sqlite3-1.3.13/ext/sqlite3
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-1s93vkm.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-1d9e3b4sqlite3-1.3.13/gems/sqlite3-1.3.13 for inspection.
Results logged to /tmp/bundler20180923-1805-1d9e3b4sqlite3-1.3.13/extensions/x86_64-linux/2.3.0/sqlite3-1.3.13/gem_make.out
Installing turbolinks-source 5.2.0
Using i18n 1.1.0
Using tzinfo 1.2.5
Installing nokogiri 1.8.4 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /tmp/bundler20180923-1805-1sbf8r3nokogiri-1.8.4/gems/nokogiri-1.8.4/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20180923-1805-1911eun.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /tmp/bundler20180923-1805-1sbf8r3nokogiri-1.8.4/gems/nokogiri-1.8.4 for inspection.
Results logged to /tmp/bundler20180923-1805-1sbf8r3nokogiri-1.8.4/extensions/x86_64-linux/2.3.0/nokogiri-1.8.4/gem_make.out
Using rack-test 1.1.0
Installing sprockets 3.7.2
An error occurred while installing nio4r (2.3.1), and Bundler cannot continue.
Make sure that `gem install nio4r -v '2.3.1'` succeeds before bundling.
$ 
# ①mkmf.rbが見つからないとエラー
# ②「gem install nio4r -v '2.3.1'」も先に実行しといてねとのこと
# ③「gem install nokogiri -v '1.8.4'」も先に実行しといてねとのこと

# ①は以下で解決
$ sudo apt-get install ruby-dev

# ②nio4rをインストールしようとすると「libsqlite3-dev」「zlib」「sqlite3」が無いとのエラー。先にインストールしておく。
$ sudo apt install zlib1g-dev
$ sudo apt-get install libsqlite3-dev
$ sudo gem install sqlite3 -v '1.3.13'
$ sudo gem install nio4r -v '2.3.1'

# ③「nokogiri」をインストール
$ sudo gem install nokogiri -v '1.8.4'


Railsサーバ起動 ⇒ エラー

$ rails s
/usr/lib/ruby/vendor_ruby/bundler/runtime.rb:80:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
        from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:76:in `block (2 levels) in require'
        from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:72:in `each'
        from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:72:in `block in require'
        from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:61:in `each'
        from /usr/lib/ruby/vendor_ruby/bundler/runtime.rb:61:in `require'
        from /usr/lib/ruby/vendor_ruby/bundler.rb:99:in `require'
        from /home/hamezawa/environment/hello_app/config/application.rb:7:in `<top (required)>'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/commands/server/server_command.rb:133:in `require'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/commands/server/server_command.rb:133:in `block in perform'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/commands/server/server_command.rb:130:in `tap'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/commands/server/server_command.rb:130:in `perform'
        from /var/lib/gems/2.3.0/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
        from /var/lib/gems/2.3.0/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
        from /var/lib/gems/2.3.0/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/command/base.rb:63:in `perform'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/command.rb:44:in `invoke'
        from /var/lib/gems/2.3.0/gems/railties-5.1.6/lib/rails/commands.rb:16:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

$ vi Gemfile							# Gemfileの文末に以下追記
gem 'therubyracer', platforms: :ruby

$ bundle install
$ rails s


http://localhost:3000/で下記画面が表示されることを確認


参考URL
dpkgやapt-get関連でエラーが出た時の対処法
Ubuntu 16.04 で mkmf.rb can’t find header files が発生する
Ubuntuで足りないファイルがどのパッケージにあるか調べる方法
Ruby on Rails チュートリアル
rails でこんなこと言われたら
Railsアプリケーションを4.2.6から5.1.2にバージョンアップした時の知見