Ubuntu22.04でApache2+PHPでウェブサーバーを立ち上げる

Ubuntu22.04の初期状態から、Apache2のインストールからPHPを立ち上げていくまでを総合的に解説します。

ここにはUbuntuのインストールに関しては記載していないのでご了承ください。

システムを更新しておく

次のコマンドを実行してシステムを最新の状態にしておきましょう。

sudo apt update
sudo apt upgrade

ユーザーを追加する

まだrootアカウントしかないよって場合は通常のユーザーを作成します。
(もう作成した場合は読み飛ばしてください。)

USER_NAMEを実際はユーザー名に置き換えてください。パスワードの設定も求められます。

sudo adduser USER_NAME

作成したユーザーをsudoグループに入れます。

sudo gpasswd -a USER_NAME sudo

作成されているか確認してみましょう。

cat /etc/group

一覧に作成したユーザー名が表示されていれば大丈夫です。

そうしたら、作成したユーザーに切り替えます。

su USER_NAME

※ページ後半にrootユーザーへのログインを制限する方法を記載しています。合わせてお読みください。

Apacheのインストール

次のコマンドでApacheをインストールします。

sudo apt install apache2 -y

そしてこのコマンドで正しく動作しているか確認します。

systemctl status apache2

正常であれば青っぽい色でactiveが表示されます。

この画面は「q」キーで終了できます。

ファイアーウォールの設定

ファイアーウォールを設定していきます。

まず、ファイアーウォールの有効化。

sudo ufw enable

もしこのコマンドでエラーが出る場合、UFWがインストールされていない可能性があるので下記のコマンドでインストールしてください。

sudo apt install ufw -y

そうしたら、次のコマンドを実行してください。

sudo ufw app list

コンテンツの中に次の項目が表示されているかと思います。

  • Apache
  • Apache Full
  • Apache Secure

ApacheはHTTP。Apache SecureはHTTPS。Apache FullはHTTPとHTTPSの両方のポートを開ける、という形です。

基本はApache Fullでいいかと思いますので、こちらではApache Fullで進めていきます。

Apache Fullの有効化。

sudo ufw allow 'Apache Full'

このコマンドを実行し、リストに含まれていれば正常に追加できています。

sudo ufw status

注意:SSAHやSFTPを使用する場合は、ポートを開けておく必要があります。

次のコマンドを実行してSSHのポートを開けておきましょう。

sudo ufw allow ssh

サイトのセットアップ

一通りできたので、サイトを覗いてみましょう。

既にドメインとサーバーを結び付けている場合はドメイン、でなければIPアドレスを入力してUbuntu Apache2の初期ページが表示されるか確認してみてください。

http://<ドメイン or IPアドレス>

ディレクトリを分ける

ドメインごとに設定等を区別するため、ドメインごとにルートフォルダを作成していきます。

※今回は1ドメインのみ行いますが、同様の手順で何ドメインでも追加できます。

新しいディレクトリを作成します。

<ドメイン名>の部分は分かりやすい名前に置き換えてください。

sudo mkdir /var/www/<ドメイン名>

次に現在サインインしているユーザーにディレクトリの所有権を割り当てます。

sudo chown -R $USER:$USER /var/www/<ドメイン名>

所有者のアクセス権限を設定します。

sudo chmod -R 755 /var/www/<ドメイン名>

次に、動作確認用のページ「index.html」を作成します。

※viではなくてもエディタであれば問題ないです。

sudo vi /var/www/<ドメイン名>/index.html

「Hello World」等を書き込んでおいてください。

※今回viの使い方には触れません

次に設定ファイルを作成します。

通常/etc/apache2/sites-available/000-default.confがデフォルトファイルになりますが、これではドメインごと細かい設定ができないので<ドメイン名>.confを新たに作成します。

sudo vi /etc/apache2/sites-available/<ドメイン名>.conf

そうしたら次のように記入します。

<VirtualHost *:80>
    ServerName any
    DocumentRoot /tmp
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName <ドメイン名>
    ServerAlias www.<ドメイン名>
    DocumentRoot /var/www/<ドメイン名>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

※最初のServerName anyはサーバーIPからのアクセスを禁止するものです

保存したら作成したファイルを認識させます。

sudo a2ensite <ドメイン名>.conf

デフォルトのconfを無効化します。

sudo a2dissite 000-default.conf

作成されたファイルの構文エラーをチェックします。

sudo apache2ctl configtest

Syntax OK

の文字があればOKです。エラーっぽく出ていれば間違っていないかもう一度開いて確認してみてください。

Apacheを再起動し、変更を適用させます。

sudo systemctl restart apache2

サイトを開いてみてください。先ほど作成したindex.htmlが表示されていれば成功です。

追加の情報

Apache全体の設定ファイルの場所

ちなみに今回ホストファイルと呼ばれる設定ファイルを設定しましたが、Apache全体の動作等の部分を含む設定ファイルは次の位置にあります。

/etc/apache2/apache2.conf

フォルダにアクセスした際フォルダのファイル一覧が表示されることを防ぐ

デフォルトだと、以下のようなフォルダ(https://examle.org/folder/ など)にアクセスした際このような画面が表示されてしまいます。

セキュリティ上好ましくないので、表示されないように設定しましょう。

まず、Apacheのconfを開きます。

sudo vi /etc/apache2/apache2.conf
<Directory "/var/www/...">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

次に、上のような部分を見つけてください。

Options Indexes FollowSymLinks

上記の箇所を、下記のように「Indexes」を消して保存すれば終了です。

Options FollowSymLinks

Apacheの再起動も忘れないようにしましょう。

sudo systemctl restart apache2

.htaccessを有効にする

htaccessはデフォルトで無効になっている場合があるので、次の動作で有効化できます。

まず、Apacheのconfを開きます。

sudo vi /etc/apache2/apache2.conf
<Directory "/var/www/...">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

次に、上のような部分を見つけてください。

AllowOverride None

次に上記の部分を下記のように置き換えて下さい。

AllowOverride All

NoneをAllにした後、保存してApache再起動で終了です。

sudo systemctl restart apache2

また、WordPress等を使用する場合はrewriteが必要になるので有効にしておきましょう。
(WordPressでなくても、有効にしておくことをお勧めします。)

sudo a2enmod rewrite
sudo service apache2 restart

SSL(Let’s Encrypt)を設定する

まず、CertbotというSSL証明書を取得するパッケージをインストールします。

python3-certbot-apacheも同時に必要になります。

sudo apt install certbot python3-certbot-apache

ドメインが登録されているか確認する

SSLドメインを取得するには取得するドメインが記事の一番上から説明している仮想ホストの

ServerName と ServerAlis に登録されている必要があります。

/etc/apache2/sites-available/<ドメイン名>.conf のやつです。

設定しておかないと取得できないので注意です。

ファイアーウォールでhttpsが許可されているか確認

先ほどUFWで設定しましたが、”Apache”のみを設定していた場合SSLが使えないため、先ほどの場所に戻ってHTTPSを有効にしてください。

ファイアーウォールの説明まで戻る

SSL証明書を取得

まず次のコマンドを入力します。

sudo certbot --apache

様々な質問が出てくるので、下記を参考に答えていってください。

下の表示が出た場合は、自分自身のメールアドレスを入力してください。

このメールアドレスは証明書の更新通知などに用いられます。

入力したらEnterで続行します。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): you@your_domain

次に、Let’s encryptの利用規約の同意です。Agreeとなっている場合はA。Yesとなっている場合はYと入力してEnterです。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

次にElectronic Frontier Foundation(財団)にメールアドレスからニュース等を受け取るかを尋ねられます。受け取らないならN。受け取るならYでEnterです。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

次にServerName,Alisに登録されているドメインの中から証明書を発行するドメインを選択します。

すべての場合は何も入力せずにEnter。

複数の場合はコンマやスペースで並べて記入し、Enterです。(例:「1,4」)

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

そうしたら、SSL証明書が作成されます。

※もう一つ質問が聞かれるかもしれませんが、1-2の選択だった場合2を選択してEnterで問題ありません。

自動的にロードされるため、httpsでアクセスできることが確認できるはずです。

自動更新が動作するか確認する

通常自動更新プロセスが自動的に有効期限近くになると更新してくれます。

が、正常に動くかどうかいちど検証してみましょう。

まず自動更新が有効になっているかは次のコマンドで確認できます。

systemctl status certbot.timer

activeと書いてあれば起動されています。「q」キーで終了してください。

更新プロセスのテストは、次のコマンドで行えます。

sudo certbot renew --dry-run

エラーが表示されなければ問題なく自動更新が機能してくれる証拠です。

htaccessでお勧めの設定

.htaccessで設定すべきお勧めの設定をご紹介します。

まずRewriteEngineをONに

RewriteEngine on

を一番最初に記入しておきましょう。

HTTP->HTTPSに自動リダイレクト

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

wwwからwwwなしへ自動リダイレクト

RewriteCond %{HTTP_HOST} ^www\.<ドメイン名> [NC]
RewriteRule ^ https://<ドメイン名>%{REQUEST_URI} [L,R=301]

拡張子なしでページを表示する

 https://example.org/text.php

 https://example.org/text.html

 https://example.org/text

で見られるようにするものです。

気分的にスッキリします。

<.php版>

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

<.html版>

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html

セキュリティを上げるためにおすすめ。rootに直接ログインできないようにする

SSHでrootに直接ログインできてしまうと、rootのパスワードがバレたらオワリ。という状況ができてしまいます。

そうならないように、別のローカルアカウント→rootでないとログインできないようにすることができます。

まず、次のファイルにアクセスします。

sudo vi /etc/ssh/sshd_config

※sshd_です。dが入るので注意してください。

その後、

#PermitRootLogin yes

と書かれているところを#を外して

PermitRootLogin no

に変更してください。

その一行下に次の項目も追加で書いてください。

PermitEmptyPasswords no

これは、パスワードが設定されていないユーザーでのログインを無効にするものです。

非常に重要なので設定しておいて損はないはずです。

PHPをインストールする

かなり追加情報多めとなってしまいましたが、やっと本題です。

まずはPHP本体のインストールを行います。

sudo apt install php libapache2-mod-php

次に、追加のパックもインストールします。

WordPressを利用してもエラーが出ない程度にインストールします

環境によっては少し時間がかかります。

sudo apt install php-fpm php-common php-mbstring php-xmlrpc php-gd php-xml php-mysql php-cli php-zip php-curl php-imagick

phpがインストールされたか確認します。

php -v

インストールされたバージョンも確認しておきましょう。

これで使えるようになったので、サーバーにPHPプログラムを設置してアクセスしてみてください。

php.iniの編集

phpは次の場所にあります。

sudo vi /etc/php/<バージョン>/apache2/php.ini

<バージョン>は実際インストールしたバージョンに置き換えてください。

例えばPHP8.1をインストールした場合

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

となります。

最初はデフォルトが小さめに設定されているので、

  • post_max_size
  • upload_max_filesize

を大きめの値に変更しておくといいかもしれません。

メール配信を行う場合

メールを配信する場合は追加の設定が必要になります。

postfixというパッケージをインストールします。

sudo apt install postfix

いくつか設定に答えるとインストールされ、メールが配信できるようになります。

配信したメールが迷惑メールに分類される問題の修正

そのままでは迷惑メールに入ってしまう場合があるので対策を別記事紹介しています。

+a SFTP接続でのパーミッションの調整

SFTP接続はSSHで接続できていればそのままのユーザーで利用できますが、ファイルをアップロードする際に権限の調整が必要になる場合があります。

デフォルトではアップロードするとき644となりグループに書き込み権限が存在しなくなるため、グループ全体で編集できるようにするには次のように変更する必要があります。

まず、sshd_configを開きます。

sudo vim /etc/ssh/sshd_config

そこから以下の行を見つけ出し、

Subsystem sftp /usr/lib/openssh/sftp-server

最後に -u 002を付け加えます。(002にすると、デフォルトのパーミッションが775になりますが、別の値も可能です。)

Subsystem sftp /usr/lib/openssh/sftp-server -u 002

最後にsshdを読み込みなおします。

sudo service sshd restart

参考

次のサイトを参考にさせていただきました。