Version 25 (modified by 6 years ago) ( diff ) | ,
---|
さくらの VPS セットアップメモ 〜2G プラン据え置き Ubuntu16.04 入れ替え編〜
入れ替え、と言っても一旦別ノード契約しての実質お引越しなのですが…。
国際的には RedHat 系より Debian/Ubuntu の方が主流、と聞いたので、今回は Ubuntu16.04 で建ててみることにします。 個人的には Ubuntu はデスクトップ用途のイメージですが…。
Ubuntu セットアップ
VPS コントロールパネルの「OSインストール」→「カスタムOSインストール」から、「Ubuntu16.04 amd64」を選択し、コンソール画面の内容に従って操作を進めていきました。 ディスクの区画割りで若干カスタマイズを施した以外は概ね画面の指示通りに進めただけです。詳細は省きます。
ソフトウェアの更新
ViM を使うのであればインストールが必要です。
$ sudo su - # apt install vim
apt
コマンドでシステム全体の更新が可能です。 update
で更新されるソフトウェアのリストを更新、 upgrade
で実際に更新を行います。
apt-get
ではなく apt
を使うことで、更新によって依存関係が追加されたソフトウェアの追加インストールもやってくれるらしいです。
# apt update # apt upgrade
Debian/Ubuntu の場合は aptitude
もあったほうが良いかもしれません。デフォルトでは入っていないので必要ならインストールします。
# apt install aptitude
ssh 接続のためのセキュリティ設定
CentOS や Scientific などと違って、セットアップが終わった段階でメインで使用するユーザーのアカウントも設定されます。普段使い用のアカウントについては自分でユーザーを作って設定する必要はありません。
sshd の設定については、設定ファイルに施す変更は初回と同様です。公開鍵認証の鍵の設定についても (dsa ではなく rsa2 を使っている以外は) 特に変わりません。
sshd のサービス名は ubuntu では sshd
ではなく ssh
になっています。再起動は service
コマンドではなく /etc/init.d
以下のスクリプトを直接叩いたほうが良いようです (service
コマンドではステータスがコンソールに表示されないため)。
# /etc/init.d/ssh restart
visudo
は不要です。なお、 sudo
で権限昇格できるユーザーのグループは、 ubuntu では wheel
グループではなく sudo
グループとなっています。
シェルのロケール設定
初回と同じ。
BIND の設定
参考: named を chroot して動かす - いますぐ実践! Linuxシステム管理 / Vol.126
- デフォルトでは
bind9-host
はインストールされているものの、bind9
はインストールされていません。 - 前回の Scientific Linux 6 のときのような、 chroot 専用の BIND パッケージがあるわけではないようです。
bind9
をインストールします。
# apt install bind9
起動時のオプションに chroot するディレクトリを指定します。
# vim /etc/default/bind9
# startup options for the server OPTIONS="-u bind -t /var/named/chroot"
chroot 先の環境を構築します。
# mkdir -p /var/named/chroot/dev # mkdir -p /var/named/chroot/bind /var/named/chroot/var/run/bind/run /var/named/chroot/var/cache/bind /var/named/chroot/etc # chown root.bind /var/named/chroot/var/run/bind/run # chmod 775 /var/named/chroot/var/run/bind/run # mknod -m 666 /var/named/chroot/dev/random c 1 8 # tar cf - -C /etc bind | tar xvfp - -C /var/named/chroot/etc
dev/log
経由で syslog にログを渡せるようにします。
Ubuntu 16.04 は rsyslog がデフォルトで入っているので、設定方法が若干異なるようです。
参考: rsyslogを使ってsftpサーバの操作ログを出力する。 - Qiita
# vim /etc/rsyslog.d/xx-bind.conf
AddUnixListenSocket /var/named/chroot/dev/log
最後に、rsyslogd
を再起動し、 bind9
の起動を確認してひとまず完了です。
# /etc/init.d/rsyslog restart # /etc/init.d/bind9 start # /etc/init.d/bind9 stop
パケットフィルタリング設定
iptables 自体は導入済み。 設定方法については以下のサイトを参考にした。
- Ubuntu/Ubuntuでiptablesを設定する - Welcome to Life with Linux
- iptablesによるファイアウォール構築 in Debian/Ubuntu | ホームページ制作会社 キャリーデザイン
- Easy Ubuntu 16.04 Server Firewall
iptables
コマンドを呼びまくるシェルスクリプトを書いて実行する。- IPv4
$ sudo su - # vim iptables.sh
#!/bin/sh /sbin/iptables -F /sbin/iptables -X /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A INPUT -p icmp -j ACCEPT /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A INPUT -m tcp -p tcp -m state --state NEW --dport 53 -j ACCEPT /sbin/iptables -A INPUT -m udp -p udp -m state --state NEW --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT /sbin/iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable /sbin/iptables -A FORWARD -j REJECT --reject-with icmp-port-unreachable # SNMP blocking /sbin/iptables -A OUTPUT -m udp -p udp -m multiport --dports 161,162 -j REJECT --reject-with icmp-port-unreachable
# chmod u+x iptables.sh # ./iptables.sh
- IPv6
# vim ip6tables.sh
#!/bin/sh /sbin/ip6tables -F /sbin/ip6tables -X /sbin/ip6tables -P INPUT ACCEPT /sbin/ip6tables -P OUTPUT ACCEPT /sbin/ip6tables -P FORWARD ACCEPT /sbin/ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/ip6tables -A INPUT -p icmp -j ACCEPT /sbin/ip6tables -A INPUT -i lo -j ACCEPT /sbin/ip6tables -A INPUT -m tcp -p tcp -m state --state NEW --dport 53 -j ACCEPT /sbin/ip6tables -A INPUT -m udp -p udp -m state --state NEW --dport 53 -j ACCEPT /sbin/ip6tables -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT /sbin/ip6tables -A INPUT -j REJECT --reject-with icmp6-port-unreachable /sbin/ip6tables -A FORWARD -j REJECT --reject-with icmp6-port-unreachable # SNMP blocking /sbin/ip6tables -A OUTPUT -m udp -p udp -m multiport --dports 161,162 -j REJECT --reject-with icmp6-port-unreachable
# chmod u+x ip6tables.sh # ./ip6tables.sh
- IPv4
- 設定内容を確認
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 state NEW ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 state NEW ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW multiport dports 22,25,587,993,80,443 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT udp -- 0.0.0.0/0 0.0.0.0/0 udp multiport dports 161,162 reject-with icmp-port-unreachable # ip6tables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED ACCEPT icmp ::/0 ::/0 ACCEPT all ::/0 ::/0 ACCEPT tcp ::/0 ::/0 tcp dpt:53 state NEW ACCEPT udp ::/0 ::/0 udp dpt:53 state NEW ACCEPT tcp ::/0 ::/0 state NEW multiport dports 22,25,587,993,80,443 REJECT all ::/0 ::/0 reject-with icmp6-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all ::/0 ::/0 reject-with icmp6-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT udp ::/0 ::/0 udp multiport dports 161,162 reject-with icmp6-port-unreachable #
- iptables-persistent をインストールし、iptables の設定を保存する
# apt install iptables-persistent
- ipv4, ipv6 の設定を保存するか尋ねられるので、両方 Yes にしておく
- 保存内容を確認
# cat /etc/iptables/rules.v4 # Generated by iptables-save v1.6.0 on Sat Apr 29 22:29:46 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [36:3368] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-port-unreachable -A FORWARD -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -p udp -m udp -m multiport --dports 161,162 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Sat Apr 29 22:29:46 2017 # cat /etc/iptables/rules.v6 # Generated by ip6tables-save v1.6.0 on Sat Apr 29 22:29:46 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-port-unreachable -A FORWARD -j REJECT --reject-with icmp6-port-unreachable -A OUTPUT -p udp -m udp -m multiport --dports 161,162 -j REJECT --reject-with icmp6-port-unreachable COMMIT # Completed on Sat Apr 29 22:29:46 2017 #
設定を変更する場合は、上記のシェルを書き換えて実行した後、以下のコマンドを実行する。
# /etc/init.d/netfilter-persistent save
留意点:
--reject-with
に渡すオプションは単なるエラーメッセージの種類らしい。 IPv6 ではicmp6-host-prohibited
のようなタイプは存在しなかったので、 IPv4 の方も IPv6 で使えるものと共通のicmp[6]-port-unreachable
に揃えてみた。- iptables-persistent については解説されているサイトの多くで
/etc/init.d/iptables-persistent
コマンドとして紹介されているが、 Ubuntu 16.04 では/etc/init.d/netfilter-persistent
コマンドに改名されていた模様。ちょっとハマった。
NTP 設定
ntp をインストールする必要がある。
# apt install ntp
設定を変更。
# vim /etc/ntp.conf # ↓この辺に、使いたい NTP サーバーを追加 # Specify one or more NTP servers. pool ntp.nict.jp iburst server ntp1.sakura.ad.jp # ↓公開しないので、この辺の設定を変更 # By default, exchange time with everybody, but don't allow configuration. #restrict -4 default kod notrap nomodify nopeer noquery limited #restrict -6 default kod notrap nomodify nopeer noquery limited restrict -4 default ignore restrict -6 default ignore
リスタート。
# /etc/init.d/ntp restart [ ok ] Restarting ntp (via systemctl): ntp.service. #
Web サーバー設定
前回まではここで Postfix の設定をしていましたが、SSL の設定やドメイン移管が終わらなければどうせ動かせないので、今回は後回しにすることにした。 そんなわけで Web サーバーの設定。
Apache のインストールと設定
まずは Apache をインストール。
# apt install apache2
設定ファイルは Red Hat 系以上に分割されまくっていて、設定項目毎にファイルが別々にされてしまっている。
メインの設定ファイルは Ubuntu では以下。
# vim /etc/apache2/apache2.conf
Listen
だけは以下のファイルに分離している模様。
# vim /etc/apache2/ports.conf
Server ID 系 (ServerName とか) はポート 80 のデフォルトバーチャルホストに対する設定という扱いで (それ自体はふつう)、以下のファイルに分離している。
# vim /etc/apache2/sites-enabled/000-default.conf
設定方針としてはとりあえず以下の通り。
- 使用する予定のないモジュールは、 load しない。
ServerName
はwww.harapeko.jp
に。動作確認はクライアント側で hosts を設定しながら行う。- ドキュメントルートは
/var/www/html
のままでいいや。 - .httpaccess は許容しない。 Wordpress を動かすのに必要な設定は
<Location>
に対して施す。 - ディレクトリ index も許容しない。
- 日本語を優先する。デフォルトの文字セットは off にしていたが、 UTF-8 を使用する設定に変更する。
- 従来はアクセスログもエラーログもバーチャルホスト毎に別ファイルで出力していたが、 Ubuntu ではデフォルトの設定を活かして以下の通りに設定する。
- アクセスログは www のみを通常の access.log ファイルに出力し、それ以外のバーチャルホストについては、バーチャルホスト名を含めた形式の内容で 1つのファイル (other_vhosts_access.log) にまとめる (Ubuntu のデフォルト設定を踏襲)。
- エラーログは、当面は Trac を動かしている developer と Wordpress を動かしている blog だけ別ファイルに切り分け、他はすべて混ぜる (他のバーチャルホストでプログラマブルなことをやる場合でエラーログを分けたくなったら適宜設定を追加する)。
そうなると、まず /etc/apache2 直下にある apache2.conf と ports.conf については変更を加える箇所は特に無い。
次に /etc/apache2/conf-enabled の下にあるファイルをチェック。
# cd /etc/apache2/conf-enabled # vim charset.conf
# コメントアウトを外す AddDefaultCharset UTF-8
CGI は使う予定ないので conf-enabled/serve-cgi-bin.conf は消してしまう。どうせシンボリックリンクだし欲しくなったらいつでも戻せる。
# rm serve-cgi-bin.conf
次に、 /etc/apache2/mods-enabled 配下をチェック。
# cd ../mods-enabled # ls *.load access_compat.load authn_file.load autoindex.load filter.load setenvif.load alias.load authz_core.load deflate.load mime.load status.load auth_basic.load authz_host.load dir.load mpm_event.load authn_core.load authz_user.load env.load negotiation.load
以前のサーバーで使っていないモジュールは削除。 …と言いたいところなんだけど、実際不要だと思えるモジュールがなかなかない。以下、わかりやすさのため、箇条書きで。
mod_status
はステータス画面を見るためのもので通常 localhost からしか見ないものなので必要なとき以外はなしでいいかなという感じなんだけど、- 例えば
mod_filter
は 2.4 では deflate したい場合はセットで使ったほうが良さげだったりするので念の為残した。
# rm status.*
- 逆に
mod_authz_owner
は前回は有効にしてたけど、すぐに必要がどうかはちょっとまだ見極められないので無効のまま。 mod_mime_magic
も前回は有効にしてたけど、サーバー負荷が重くなるだけだからやめておいたほうが良いみたいな情報もあったりするので同じく無効のまま。mod_expires
は前回は有効にしておきながら設定らしい設定をしていなかったのでこれも無効のまま (でも本当はちゃんと設定してあげたほうが良さげ)、mod_headers
も同様。mod_dav
は使うので追加。DavLockDB
も使うのでmod_dav_fs
も追加 (.conf ファイルは内容的にもしかしたら要らんかも…)。mod_vhost_alias
も追加 (何でこれ無いの? っちゅーくらい Virtual Host 使うなら絶対必須なやつ)。mod_rewrite
も一応追加 (WordPress でパーマネントリンク設定をディレクトリ形式にする場合は必須… WordPress 捨てたいけどすぐには捨てられないからね 'A`)。mod_cgi
は… 多分要らんやろ…。
# ln -s ../mods-available/dav.load # ln -s ../mods-available/dav_fs.load # ln -s ../mods-available/dav_fs.conf # ln -s ../mods-available/vhost_alias.load # ln -s ../mods-available/rewrite.load
最後に /etc/apache2/sites-* シリーズをチェック。 sites-available の下を見ると sites-enabled には無いものとして default-ssl.conf というのがあるけど、これは後で SSL 証明書のセットアップをするときに設定することにするとして、とりあえず今は後回しにする。
/etc/apache2/000-default.conf を編集。
# cd ../sites-enabled # vim 000-defailt.conf
<VirtualHost *:80> # サーバー名を設定 (コメントアウトを外して修正) ServerName www.harapeko.jp # Admin メアドは以下で統一 ServerAdmin root@harapeko.jp DocumentRoot /var/www/html # ErrorLog, CustomLog はデフォルト設定のまま </VirtualHost>
その他のヴァーチャルホストについては、以下のようなスクリプトを書いて対応…。
# vim a.pl
#!/usr/bin/perl for my $site (@ARGV) { open my $fh, '>', "$site.conf"; print $fh <<ENDLINE; <VirtualHost *:80> ServerAdmin root\@harapeko.jp DocumentRoot /var/www/vhosts/$site/html ServerName $site.harapeko.jp IncludeOptional sites-enabled/$site/*.conf </VirtualHost> ENDLINE mkdir $site, 0755; }
# chmod u+x a.pl # ./a.pl blog daiyokujo developer test perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US:", LC_ALL = (unset), LANG = "ja_JP.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). # ls -l total 36 lrwxrwxrwx 1 root root 35 May 27 06:36 000-default.conf -> ../sites-available/000-default.conf -rwxr--r-- 1 root root 328 Aug 10 16:00 a.pl drwxr-xr-x 2 root root 4096 Aug 10 16:00 blog -rw-r--r-- 1 root root 189 Aug 10 16:00 blog.conf drwxr-xr-x 2 root root 4096 Aug 10 16:00 daiyokujo -rw-r--r-- 1 root root 204 Aug 10 16:00 daiyokujo.conf drwxr-xr-x 2 root root 4096 Aug 10 16:00 developer -rw-r--r-- 1 root root 204 Aug 10 16:00 developer.conf drwxr-xr-x 2 root root 4096 Aug 10 16:00 test -rw-r--r-- 1 root root 189 Aug 10 16:00 test.conf #
サブドメインごとの設定
www
/var/www/html
の権限が root:root になっているのを修正する。
Ubuntu での apache の実行ユーザーは /etc/apache2/envvars
に APACHE_RUN_USER
および APACHE_RUN_GROUP
として設定されている。
# less /etc/apache2/envvars
# Since there is no sane way to get the parsed apache2 config in scripts, some # settings are defined via environment variables and then used in apache2ctl, # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc. export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data
そこで、ドキュメントディレクトリの権限を murachi:www-data
に変更する。
# cd /var/www/html # ls -la total 20 drwxr-xr-x 2 root root 4096 May 27 2017 . drwxr-xr-x 3 root root 4096 May 27 2017 .. -rw-r--r-- 1 root root 11321 May 27 2017 index.html # chown -R murachi:www-data . # chmod g+s . # ls -la total 20 drwxr-sr-x 2 murachi www-data 4096 May 27 2017 . drwxr-xr-x 3 root root 4096 May 27 2017 .. -rw-r--r-- 1 murachi www-data 11321 May 27 2017 index.html #
もはや index.html は不要だ、消してしまおう。
$ cd /var/www/html/ $ rm index.html
そして代わりに旧サーバーにログインし、ここに置くべきファイルを rsync してあげる。
$ rsync -rlpte ssh /var/www/htdocs/* murachi@153.126.157.107:/var/www/html/ Enter passphrase for key '/home/murachi/.ssh/id_rsa': $
動かすには生意気にも PHP が必要だ。
$ sudo apt -y install php libapache2-mod-php ... $ sudo /etc/init.d/apache2 restart [ ok ] Restarting apache2 (via systemctl): apache2.service. $
hosts に www.harapeko.jp だけ設定してアクセスしたらちゃんと動いているのを確認できた。
blog
PHP はもう入れたので、あとは MySQL ですね。
…違った、Ubuntu だから mariadb なのか。
それと PHP で使うライブラリも一緒に入れちゃいます (mbstring とか今でも必要なんじゃろか…)。
$ sudo apt -y install mariadb-server mariadb-client php-mysql php-mbstring ... $
my.cnf はデフォルトで色々と設定が施されていて、ファイルも細分化されている。文字コードの設定は、
$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
の中に、
# # * Character sets # # MySQL/MariaDB default is Latin1, but in Debian we rather default to the full # utf8 4-byte character set. See also client.cnf # character-set-server = utf8mb4 collation-server = utf8mb4_general_ci
として指定済み (50-client.cnf
, 50-mysql-clients.cnf
にもそれぞれ設定があった)。以前と違って utf8mb4
が指定されていて、サロゲートペアの扱いが異なるので若干不安はあるが、とりあえずこれで強行してみることにする (問題ないならこの設定のほうが圧倒的に良好)。
ちなみに root ユーザーで mariadb に接続するには、 sudo
を使用する。UNIX_SOCKET Authentication plugin というのが有効になっていて、 root ユーザーは linux の root ユーザーの権限に紐付けられているらしい (mariadb 用のパスワードを別途用意する必要がない)。 (参考)
$ sudo mysql -u root
WordPress を置く場所を作りましょう。
$ sudo mkdir -p /var/www/vhosts/blog/html $ sudo chown murachi:www-data /var/www/vhosts/blog/html $ sudo chmod g+s /var/www/vhosts/blog/html $ ls -la /var/www/vhosts/blog/html total 8 drwxr-sr-x 2 murachi www-data 4096 Oct 23 15:54 . drwxr-xr-x 3 root root 4096 Oct 23 15:54 .. $
そしたら旧サーバーの /var/www/vhosts/blog/htdocs/*
を、新サーバーの /var/www/vhosts/blog/html/
に転送します。(旧サーバーから実行)
$ rsync -rlpte ssh /var/www/vhosts/blog/htdocs/* murachi@153.126.157.107:/var/www/vhosts/blog/html/ Enter passphrase for key '/home/murachi/.ssh/id_rsa': $
更には旧サーバーの DB を新サーバーにコピーします。(新サーバーのファイル転送先ディレクトリはあらかじめ作っておく)
- 旧サーバー
$ cd ~/tempsql $ rm * $ mysqldump -u harapeko_press -p harapeko_press > harapeko_press.sql Enter password: $ rsync -e ssh harapeko_press.sql murachi@153.126.157.107:/home/murachi/tempsql/ Enter passphrase for key '/home/murachi/.ssh/id_rsa': $
- 新サーバー
$ cd ~/tempsql $ sudo mysql -u root