Ubuntu(ウブントゥ)は、Debian をベースに開発されている Linuxディストリビューションのひとつです。Ubuntu といえばデスクトップ版のイメージがありますが、サーバー版の Ubuntu Server も Webサイト向けの Linuxディストリビューションとして圧倒的なシェアを誇っています。また Ubuntu Server は、利用可能なソフトウェアパッケージが多く比較的バージョンが新しいのが魅力です。そこで今回は、Ubuntu Server 22.04 で LAMP環境(Apache2.4/MySQL8.0/PHP8.1)をインストールする手順をまとめてみました。
マシン構成
Ubuntu 22.04 Server の推奨システム要件は次の通りです。比較的低スペックなサーバーや古いパソコンでもインストールすることができますね。
- CPU:1GHz以上
- RAM:1GB以上
- ディスク:2.5GB以上
参考資料:Installation | Server documentation | Ubuntu
今回は以下の構成の VirtualBoxの仮想マシン に Ubuntu 22.04 Server をインストールします。
○仮想マシン構成
CPU:2コア
メモリ:2048MB
HDD:20GB
○ネットワークデバイス
アダプター1:NAT
アダプター2:ホストオンリーアダプター
○ネットワーク構成(※ご自分の環境に書き換えてください)
ホスト名: ubuntu2204
ネットワークアドレス:192.168.56.0/24
IPアドレス:192.168.56.10
DNSサーバ(プライマリ):1.1.1.1
DNSサーバ(セカンダリ):8.8.8.8
Ubuntu Server 22.04 LTS のインストール
Ubuntu のダウンロードページ から Ubuntu Server 22.04.x LTS(Long Term Support = 長期サポート版の略称です)をダウンロードします。(Ubuntu Desktop をダウンロードしないように注意してください)
インストール先の VirtualBoxの仮想マシンの「設定」→「ストレージ」を選択し、「コントローラ: IDE」にダウンロードした Ubuntu Server の ISOイメージファイルを追加して仮想マシンを起動します。
ブートローダ画面が表示されたら「Try or Install Ubuntu Server」を選択してエンターキーを押します。
Ubuntu Server のインストーラーが起動したら言語を選択します。インストーラーは日本語に対応していませんので「English」(もしくはお好みの言語)を選択してエンターキーを押します。
以下のような画面が表示されたら(表示されない場合もあります)「Update to the new installer」を選択してエンターキーを押します。矢印キーもしくはタブキー(シフト+タブキーで逆に移動できます)で項目を移動できます。
キーボードの設定です。項目を「Layout」に移動して「Japanese」を選択します。選択したら「Done」に移動してエンターキーを押します。
「Ubuntu Server」にチェックが入っていることを確認して、エンターキーを押します。(下の「minimied」は、クラスター構成のように人間がサーバーに直接ログインしないような環境を構築する場合に選択します)
ネットワークの設定です。「enp0s3」がアダプター1(NAT)、「enp0s8」がアダプター2(ホストオンリーアダプター)です。「enp0s3」は自動でIPアドレスが割り当てられますのでそのままでOKです。「enp0s8」には手動で固定IPアドレスを設定しますので、「enp0s8」に移動してエンターキーを押し、「Edit IPv4」を選択してエンターキーを押します。
IPv4 Method「Manual」を選択し、Subnet にネットワークアドレス(サブネットマスクではありません)、Address にホストオンリーアダプターに設定する IPアドレスを入力します。Name servers には DNSサーバのIPアドレス(複数の場合はカンマ「,」区切り)を入力し「Save」に移動してエンターキーを押します。(Gatewayは設定しないでください。アダプター1を使ったインターネット通信ができなくなります)
設定したIPアドレスが表示されていることを確認し「Done」に移動してエンターキーを押します。
プロキシーサーバーの設定です。必要がなければそのままエンターキーを押します。
パッケージなどのダウンロード元となるミラーサーバーの設定です。自動で近くのミラーサーバーが設定されますので、そのままエンターキーを押します。
HDDなどのストレージの設定です。必要に応じて暗号化やパーテーションを手動で設定できます。今回はそのままの設定で構いませんので「Done」に移動してエンターキーを押します。
ストレージの設定の確認画面です。内容を確認して問題がなければそのままエンターキーを押します。
「ストレージのデータが消えるけど大丈夫?」の旨が表示されます。問題がなければ「Continue」に移動してエンターキーを押します。
ユーザーアカウントとホスト名の設定です。「Your server's name」がホスト名、「Pick a username」がユーザー名です。ユーザー名は admin や adm などありがちな名前は設定できないようになっています。
SSHの設定です。スペースキーを押して「Install OpenSSH server」にチェックを入れ、「Done」に移動してエンターキーを押します。
インストールするパッケージの選択です。今回はなにも選択せずそのまま「Done」に移動してエンターキーを押します。
インストールが開始しますのでしばし待ちます。
インストールが終わると下のような画面になります。「Reboot」に移動してエンターキーを押して再起動します。
再起動できない場合は、一度 VirtualBoxの仮想マシンの電源を一度オフにして、仮想マシンに追加した ISOイメージファイルを削除してから仮想マシンを起動します。
以下の画面が表示されていれば起動完了です。(表示されない場合はエンターキー押してみてください)
ホストマシンから SSHでログインできることを確認してください。
これから Ubuntu Server の各種設定やミドルウェアのインストールを行うのですが、ほとんどの操作は root 権限が必要になるためコマンドの先頭に sudo を付ける必要があります。
そのため、以下のコマンドで root になって作業を進めます。いちいち sudo を打ち込まなくてよくなるので楽なのですが、ログにコマンド履歴が残らないとういデメリットもあります。サーバーの運用が始まったら sudo を使うことをオススメします。
パッケージのアップデート
インストール済みのパッケージを、最新版にアップデートします。
apt -y upgrade
パッケージのアップデートによりサービスの再起動が必要な場合は、以下のような画面が表示されます。タブキーで「OK」に移動して、エンターキーを押してください。
OSを再起動します
ufw(ファイアウォール)設定
初期状態では ufw(ファイアウォール)が無効になっていますので、許可するポートを設定してから有効にします。
Status: inactive ←無効
SSH(22)と WEBアクセス(80 と 443)ポートを許可します。
ufw allow 80
ufw allow 443
ufw を有効化します。「SSH接続ができなくなるかもよ!」と聞いてくれます。SSH(22)ポートは許可していますので「y」を入力してください。
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ufw が有効になっていることを確認します。
ufw status Status: active ←有効 To Action From -- ------ ---- 22 ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
日時設定(timesyncd)
タイムゾーンを日本に変更します。
参照する NTPサーバーを指定します。複数設定する場合は半角スペース区切りで指定します。
vi /etc/systemd/timesyncd.conf
↓
NTP=ntp.nict.jp 0.jp.pool.ntp.org 1.jp.pool.ntp.org 2.jp.pool.ntp.org 3.jp.pool.ntp.org
timesyncd を再起動します。
NTPサーバーと同期していることを確認します。
timedatectl status (略) System clock synchronized: yes ←同期OK NTP service: active RTC in local TZ: no
メール送信設定(Gmail経由)
サーバーから Gmail 経由でメールを送信できるように設定します。(必要がなければこの設定は不要です)
Postfix のインストール
メールサーバーの Postfix をインストールします。
Postfix をどのように構成するか聞かれます。初期値の「Internet Site」で構いませんので、そのままタブキーで「OK」に移動して、エンターキーを押してください。
送信元に表示されるメールアドレスのドメイン名の設定です。そのままタブキーで「OK」に移動して、エンターキーを押します。(本来はメッセージの通り FQDNである必要がありますが、Gmail を経由する場合は送信元メールアドレスが Gmail のメールアドレスに書き換えられますのでそのままで構いません)
Postfix の設定
Googleアカウントの設定、および Postfix の設定手順は以下の記事をご参照ください。
PostfixからGmail経由でメールを送信するための設定メモ
メール送信確認
mail コマンドをインストールします。
以下のコマンドでメールが送信できることを確認します。
Apache・PHP・MySQL のインストール
※バージョンは2022年12月29日時点のものです。
Apache(2.4.52)
PHP(8.1.2)
apt -y install php-dev
apt -y install php-mysql
apt -y install php-mbstring
apt -y install php-gd
apt -y install php-curl
apt -y install php-intl
apt -y install php-zip
MySQL(8.0.31)
Apache の設定
Ubuntu での Apache の設定は Debian から引き継いだ独特の作法があります。はじめて Ubuntu を扱う方は公式ドキュメントを確認しておきましょう。
参考資料:Web Servers - Apache | Server documentation | Ubuntu
セキュリティ関連設定
GCIを使わない場合は、GCI設定を無効にします。
ファイルの一覧を表示しないように Indexes オプションを外しておきます。
vi /etc/apache2/apache2.conf
<Directory /var/www/> Options Indexes FollowSymLinks ↓ Options FollowSymLinks
UTF-8 以外の文字エンコーディングを使わない場合は、AddDefaultCharset ディレクティブで UTF-8 を指定することをオススメします。
vi /etc/apache2/conf-available/charset.conf
↓
AddDefaultCharset UTF-8
その他のセキュリティ設定を行います。
vi /etc/apache2/conf-available/security.conf
↓
ServerTokens Prod
ServerSignature On
↓
ServerSignature Off
#Header set X-Content-Type-Options: "nosniff"
↓
Header set X-Content-Type-Options: "nosniff"
#(↓以下を追加)クロスサイトスクリプティング(XSS)対策
Header set X-XSS-Protection "1; mode=block"
ブラウザキャッシュ設定
ブラウザキャッシュの設定ファイルを作成します。キャッシュさせるファイルの種類や期限はコンテンツの内容に合わせて設定してください。
vi /etc/apache2/mods-available/expires.conf
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 year" #ExpiresByType text/css "access plus 1 year" #ExpiresByType text/js "access plus 1 year" #ExpiresByType text/javascript "access plus 1 year" </IfModule>
SSL/TLS設定
SSL/TLS関連の設定です。
vi /etc/apache2/mods-available/ssl.conf
SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000) SSLSessionCacheTimeout 300 ↓ SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(1024000) SSLSessionCacheTimeout 3600 SSLCipherSuite HIGH:!aNULL ↓ SSLCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256 \ ECDHE-ECDSA-AES256-GCM-SHA384 \ ECDHE-ECDSA-AES128-SHA \ ECDHE-ECDSA-AES256-SHA \ ECDHE-ECDSA-AES128-SHA256 \ ECDHE-ECDSA-AES256-SHA384 \ ECDHE-RSA-AES128-GCM-SHA256 \ ECDHE-RSA-AES256-GCM-SHA384 \ ECDHE-RSA-AES128-SHA \ ECDHE-RSA-AES256-SHA \ ECDHE-RSA-AES128-SHA256 \ ECDHE-RSA-AES256-SHA384 \ DHE-RSA-AES128-GCM-SHA256 \ DHE-RSA-AES256-GCM-SHA384 \ DHE-RSA-AES128-SHA \ DHE-RSA-AES256-SHA \ DHE-RSA-AES128-SHA256 \ DHE-RSA-AES256-SHA256 \ EDH-RSA-DES-CBC3-SHA" #SSLHonorCipherOrder on ↓ SSLHonorCipherOrder on SSLProtocol all -SSLv3 ↓ SSLProtocol -all +TLSv1.2 +TLSv1.3 #(↓以下を追加) SSLCompression off SSLUseStapling On SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000) #(↑追加ここまで) </IfModule>
SSL/TLS設定の詳細は以下の記事にまとめました。よければご参照ください。
関連記事:安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)
バーチャルホスト設定
バーチャルホストの設定です。サーバー証明書は、自動で生成される自己署名の証明書 ssl-cert-snakeoil.pem を使っていますが、実際に Webサイトを公開する場合は Let's Encrypt など正規の認証局が発行したサーバー証明書を使いましょう。
関連記事:Let's Encrypt サーバー証明書の取得と自動更新設定メモ
デフォルトのバーチャルホストを無効にします。
バーチャルホストの設定ファイルを作成します。ServerName に指定するドメイン名は、ご自分が所有しているドメインに書き換えてください。
vi /etc/apache2/sites-available/www.example.com.conf
<VirtualHost *:80> ServerName www.example.com Redirect permanent / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/html <Directory "/var/www/html"> Options FollowSymLinks AllowOverride None Require all granted </Directory> SSLEngine on Header always set Strict-Transport-Security "max-age=31536000" SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt SetEnvIf Request_URI "\.(gif|jpg|png|css|js)$" nolog ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog </VirtualHost>
作成したバーチャルホストを有効化します。
モジュールの有効化と Apache の再起動
必要なモジュールを有効化します。
a2enmod expires
a2enmod ssl
a2enmod http2
a2enmod proxy_fcgi setenvif
a2enconf php8.1-fpm.conf
Apache を再起動します。
動作確認
確認用の PHP ファイルを作成します。
vi /var/www/html/test.php
phpinfo();
Webブラウザで確認用の PHP ファイルが実行されていることを確認します。
http://www.example.com/test.php
【補足】
自己署名のサーバー証明書の場合は警告が表示され、接続できない場合があります。FireFox で「危険性を承知で続行」ボタンを押して接続するか、Google Chrome の場合は「thisisunsafe」とタイプすると接続できます。
確認がおわったら PHP ファイルは削除しておきましょう。
PHP の設定
PHP の設定です。
vi /etc/php/8.1/fpm/php.ini
↓
expose_php = Off
;date.timezone =
↓
date.timezone = 'Asia/Tokyo'
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
↓
error_reporting = E_ALL & ~E_NOTICE
設定が終わったら php-fpm を再起動します。
MySQL の設定
MySQL の設定です。
vi /etc/mysql/mysql.conf.d/mysqld.cnf
log_timestamps=SYSTEM
(設定の詳細)
log_timestamps=SYSTEM
標準では MySQLのログの出力時間が UTC になるため、サーバーのタイムゾーンと同じになるように設定します。
設定が終わったら mysql を再起動します。
MySQL の root パスワード設定
以前は、mysql_secure_installation で MySQL の root パスワードの設定ができましたが、現時点(2022年12月)では、以下のエラーが発生して設定することができません。
... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
ALTER USER文 を使って、MySQL の root パスワードを設定する必要があるのですが、デフォルト状態の root ユーザーの認証プラグインが「auth_socket」(MySQL のユーザ名と OS のユーザ名が一致している場合に接続を許可するという認証方式)になっているため、パスワードを設定することができません。
そのため、MySQL の root パスワードを設定する場合は、認証プラグイン「caching_sha2_password」などを指定して設定してください。(設定するパスワードは、8文字以上で英数大文字小文字と記号が含まれていないとポリシー違反で弾かれます)
ALTER USER root@localhost IDENTIFIED WITH caching_sha2_password BY '<パスワード>';
mysql_secure_installation の実行
MySQL の root パスワードを設定すれば、mysql_secure_installation を実行できるようになります。
mysql_secure_installation --use-default (略) Enter password for user root: ←(設定した root パスワードを入力してエンター) (不要なユーザーやDBを削除してくれます) All done!
自動起動の設定確認
systemctl list-unit-files | grep -e apache2.service -e php8.1-fpm.service -e mysql.service -e 'UNIT FILE'
-----(STATE列がすべて「enabled」であればOKです)-----
UNIT FILE STATE VENDOR PRESET apache2.service enabled enabled mysql.service enabled enabled php8.1-fpm.service enabled enabled
一度OSを再起動して、各種サービスが起動している事を確認しましょう。
shutdown -r now (再起動後に以下を実行) ps aux | grep -e apache2 -e php-fpm -e mysqld
以上です。設定お疲れ様でした!
コメント