Ubuntu Server 20.04 LTS のインストールとサーバー構築

以前に書いていたインストールメモは、単独の仮想マシンで Web Server を公開するためのもの。

今は、フロントエンド用の仮想マシンに Nginx で Reverse Proxy を、バックエンド用仮想マシンに Apache をそれぞれインストール、運用している。

ということで、一通りの手順をメモ。

目次

Ubuntu のインストール

インストール自体は特に迷うことなく、途中で固定 IP を設定したり ssh を有効にしたくらいでサクッと終了。手順は次のサイトの 18.04 LTS Server と殆ど同じ。

途中の LVM の画面では、初期状態だと物理ボリュームに対して論理ボリュームが少なく設定される。
LVM を使わなくても良いし、使用する場合は後からでも拡張できる。

仮想マシンの起動直後の画面

インストーラーの更新

キーボードレイアウトの選択

ネットワークインターフェースの設定

デバイスを選択して固定 IP に変更(画像は DHCP のまま)。

プロキシとミラーサイトの確認

ディスクの設定

初期設定は「Set up this disk as an LVM group」の選択状態になっている。LVM を使わないなら選択を解除すること。

LVM の設定

このまま進めると、ボリュームグループ 23.996Gに対して少し小さい論理ボリューム 20.000G が作成される。
あとから拡張することもできるが、ここで最大化してしまえばいい。

論理ボリューム最大化の様子

論理ボリューム最大化の様子その2

最終確認

Server name その他

ssh ログイン有効化

Server Snaps (使ったことがない)

インストール完了

Proxmox の管理画面で CD/DVD のメディアを削除して再起動。

Reverse Proxy 用と Web Server 用のどちらの仮想マシンにも Ubuntu をインストールした。

日本語ロケール、日本語マニュアルの追加

インストール直後の仮想マシン2台ともに行ったこと。
基本的にサーバー PC にローカルでログインすることはなく、ssh でリモートログインしている。
もちろん Proxmox 仮想マシンのコンソールでもOK。

$ sudo apt install -y language-pack-ja
$ sudo localectl set-locale 'LANG=ja_JP.utf8'
$ sudo apt install -y manpages-ja manpages-ja-dev
$ sudo timedatectl set-timezone Asia/Tokyo

ログインし直して確認。

$ locale
LANG=ja_JP.utf8
LANGUAGE=
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

Reverse Proxy の設定(Nginx)

Nginx と certbot のインストール

SSL は Reverse Proxy で終端させるから無料証明書関係の certbot をインストールする。Nginx 用のプラグインをインストールすれば依存関係で一式インストール可能。

$ sudo apt -y install nginx python3-certbot-nginx

Nginx 設定ファイルの作成

インストール直後は /etc/nginx/sites-enabled/ に設定ファイル default のシンボリックがあるから削除する。

/etc/nginx/sites-available/ に移動して、ドメイン毎の設定ファイルを作成する。
以下は、仮想マシン Server1 で2つのドメインを、仮想マシン Server2 で1つのドメインを運用する場合の例。

ファイル名に .conf はいらない。あとで certbot を使ってサーバー証明書と秘密鍵を設定するから、この時点では次のような内容でいい。

$ sudo vi /etc/nginx/sites-available/ex1.mydns.jp

server {
    server_name ex1.mydns.jp;
    location / {
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host       $host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_pass    http://192.168.1.5;  # Server1のアドレス
        proxy_redirect http:// https://;
    }
}


$ sudo vi /etc/nginx/sites-available/ex2.mydns.jp

server {
    server_name ex2.mydns.jp;
    location / {
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host       $host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_pass    http://192.168.1.5;  # Server1のアドレス
        proxy_redirect http:// https://;
    }
}


$ vi /etc/nginx/sites-available/nextcloud.mydns.jp

server {
    server_name nextcloud.mydns.jp;
    location / {
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host       $host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_pass    http://192.168.1.6;  # Server2のアドレス
        proxy_redirect http:// https://;
    }
}

作成が終わったら /etc/nginx/sites-enabled/ にシンボリックを作る。

$ sudo ln -s /etc/nginx/sites-available/ex1.mydns.jp /etc/nginx/sites-enabled/ex1.mydns.jp
$ sudo ln -s /etc/nginx/sites-available/ex2.mydns.jp /etc/nginx/sites-enabled/ex2.mydns.jp
$ sudo ln -s /etc/nginx/sites-available/nextcloud.mydns.jp /etc/nginx/sites-enabled/nextcloud.mydns.jp

certbot の実行

各ドメインについて certbot を実行する。cron にも登録してくれるので、以降は特に何もすることは無い。
結果は次のとおり。

$ sudo certbot 
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: ex1.mydns.jp
2: ex2.mydns.jp
3: nextcloud.mydns.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/ex1.mydns.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Keeping the existing certificate
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/ex1.mydns.jp

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Traffic on port 80 already redirecting to ssl in /etc/nginx/sites-enabled/ex1.mydns.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://ex1.mydns.jp

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=ex1.mydns.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ex1.mydns.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ex1.mydns.jp/privkey.pem
   Your cert will expire on 2020-07-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

設定ファイルの微調整

certbot で修正された設定ファイルの listen に http2 を追加する。
あと、Nginx が受け取ることのできる POST の最大サイズを Nginx 標準の 1M から変更する(例では 200M )。
当然、各ドメイン用の設定ファイルを修正する。

server {
    server_name ex1.mydns.jp;
    client_max_body_size 200m;
    location / {
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host       $host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_pass    http://192.168.1.5;
        proxy_redirect http:// https://;
    }
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ex1.mydns.jp/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ex1.mydns.jp/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    if ($host = ex1.mydns.jp) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    server_name ex1.mydns.jp;
    listen 80;
    return 404; # managed by Certbot
}

一通りの設定が終わったら、念のため設定ファイルに間違いが無いか確認して、OK なら Nginx を再起動する。

$ 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 service nginx restart

Nextcloud 用の設定ファイルには別途、以下の修正が必要。

バックエンドサーバ−の設定

とりあえずダラダラと必要なソフトをインストールして、個別の設定は後回し。

Web Server , FTP Server のインストール

Apache と ProFTPD をインストール。ついでにドキュメントもインストール。

$ sudo apt install -y apache2 apache2-doc proftpd-basic proftpd-doc

MariaDB 10.3 のインストール

MySQL から乗り換えた。とりあえずスタートしておく。

$ sudo apt install -y mariadb-server
$ sudo service mysql start

PHP 関係のインストール

$ sudo apt install -y php7.4 php7.4-fpm php7.4-mysql

phpMyAdmin のインストール

何かと便利。サーバーの種類は「apache2」、「dbconfig-commonで設定しますか?」は「yes」 、ユーザー「phpmyadmin」のパスワードを聞かれるので2回入力する。

$ sudo apt install -y phpmyadmin

念の為、次のコマンドを実行して MariaDB との通信が TCP/IP になるよう再構築する。

$ sudo dpkg-reconfigure phpmyadmin

root のパスワードを設定する(上記コマンド実行中に設定されなかった場合)。

$ sudo mysql -u root

mysql> update mysql.user set password=password('root用のパスワード') where user = 'root';
mysql> flush privileges; 
mysql> exit;

またはこちら。

$ sudo mysqladmin -u root password 'root用の任意パスワード'

ユーザー phpmyadmin への権限付与

権限付与以外の全ての権限を付与する場合。

$ sudo mysql

まだユーザー phpmyadmin を追加していない場合はここから。
mysql> create user 'phpmyadmin'@'localhost' identified by 'パスワード';

既にユーザー phpmyadmin を追加している場合はここから。
mysql> grant all on *.* to 'phpmyadmin'@'localhost' with grant option;

mysql> flush privileges;

phpmyadmin.conf の編集

phpmyadmin.conf に2行追加する。
併せてインストール直後は phpMyAdmin のログイン画面が丸見えなので、/usr/share/phpmyadmin/ に .htaccess を設置して、Basic認証によるアクセス制限をかけておく。

$ sudo vi /etc/apache2/conf-enabled/phpmyadmin.conf
 <Directory /usr/share/phpmyadmin>
     Options SymLinksIfOwnerMatch
     DirectoryIndex index.php
     # 以下の2行を追加
     AllowOverride All
     Require all granted

$ sudo service apache2 restart

諸々設定

ufw

ファイアーウォール ufw の有効化。この後も必要なポートを都度、追加する。

sudo ufw allow 21/tcp
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 49152:65534/tcp


$ sudo ufw enable

Apache の設定

VirtualHost の設定

 /etc/apache2/sites-available の 000-default.conf をコピーして編集してもいい。
リバースプロキシのバックエンドとして設置するため“Setenv HTTPS ON” を記述する。

あらかじめ DocumentoRoot で指定するディレクトリを作成しておくこと。
でないと Apache は起動しない。

# 編集する
$ sudo vi /etc/apache2/sites-available/ex1.mydns.conf


<VirtualHost *:80>
ServerName ex1.mydns.jp
DocumentRoot /home/hoge/public_html/ex1.mydns.jp
ErrorLog /var/log/apache2/virtual.host.error.log
CustomLog /var/log/apache2/virtual.host.access.log combined
LogLevel warn

    Setenv HTTPS ON
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 192.168.1.4/24

  <Directory /home/hoge/public_html/ex1.mydns.jp>
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html
    Require all granted
  </Directory>

</VirtualHost>

RewriteEngine の有効化

$ sudo a2enmod rewrite

remoteip の有効化

接続元 PC のアドレスを取得できるように設定ファイルには RemoteIPHeader と RemoteIPInternalProxy を記述している。
併せてモジュールの有効化が必要。

$ sudo a2enmod remoteip 

Apache の設定ファイルの有効化と確認と起動

# VirtualHost の有効化
$ sudo a2ensite ex1.mydns.jp

# 設定ファイルの確認
$ sudo apache2ctl -t
Syntax OK

# Apacheを再起動する
$ sudo service apache2 restart

Apache Manual の有効化

$ sudo a2enconf apache2-doc
$ sudo service apache2 restart

ProFTPD

DefaultRoot はレンタルサーバーと同じようにユーザーのホームディレクトリにした。この中の public_html に公開ドキュメントを置く。

$ sudo vi /etc/proftpd/proftpd.conf

※変更したのはこれくらい
ServerName                      "HTTP Server"
IdentLookups                    off
UseReverseDNS                   off
DefaultRoot                     ~/public_html
PassivePorts                    49152 65534
Umask                           072  072

$ sudo service proftpd restart 

FPM/FastCGI の設定

www.conf を編集する。

$ cd /etc/php/7.4/fpm/pool.d
$ sudo vi www.conf

# ここだけ編集
user = hoge
group = hoge

php.ini を編集する。

FastCGI を使用する場合は、~/public_html/ex1.mydns.jp/ に .user.ini を設置することができる。

$ cd /etc/php/7.4/fpm/
$ sudo vi php.ini

# アップロードファイルサイズやメモリ上限などなど適宜編集
# .user.ini の場合は次を記述して適宜変更する。

;メモリ使用量の上限
memory_limit = 1000M
;POSTデータの最大サイズ ※合計サイズ
post_max_size = 1000M
;1ファイルあたりの最大アップロードサイズ
upload_max_filesize = 1000M

CGI版PHPの有効化(モジュール版PHPはインストールしてない)

$ sudo a2enconf php7.4-fpm
$ sudo a2enmod proxy_fcgi

再起動
$ sudo service php7.4-fpm restart
$ sudo service apache2 restart

phpMyAdmin のエラーメッセージを消す

下の画像のようにエラーメッセージが出ているから対策する。
FastCGIを有効化したことでパーミッションの設定を変更する必要がある。

出ているメッセージは2つ。

  • 設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。
  • $cfg['TempDir'] (/var/lib/phpmyadmin/tmp/) にアクセスできません。phpMyAdmin はテンプレートをキャッシュすることができないため、低速になります。

対策は、 /var/lib/ で phpmyadmin のパーミッションを変更すればよい。

$ sudo chown -R hoge:hoge ./phpmyadmin

書き忘れたことがあるかもしれないが、多分、とりあえずこれで WordPress の動作環境は整うと思う。
ダメならググれば何とかなるでしょう。

コメント

コメントする

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

目次
閉じる