サーバ構築_Apache

## ApacheによるWebサーバ構築
### WebサーバとWebブラウザ
Webブラウザの基本的な機能は、Webサーバにアクセスし、WebサーバからWebページの情報を取得して画面上に表示することです。


```
＜書式＞
　メソッド リクエストURL HTTPバージョン
```

主なHTTPメソッド
|メソッド　　|説明 |
|:----|:--|
|HEAD | 指定したURLのレスポンスヘッダを取得する  |
|GET  | 指定したURLのリソース（HTML、画像など）を取得する  |
|POST | 指定したURLへデータを送信して処理を要求する（フォームの送信）  |
|PUT  | 指定したURLへデータを送信して保存を要求する（ファイルのアップロード  |
|DELETE  |指定したURLのリソースを削除する   |

主なHTTPステータスコード
|ステータスコード　|説明 |
|:----|:--|
|100 |Continue（処理を継続）|
|200 |OK（リクエスト成功）　|
|400 |Bad Request（不正なリクエスト）|
|401 |Unauthorized（未認証）|
|403 |Forbidden（アクセス拒否）|
|404 |Not Found（ページが見つからない）|
|405 |Method Not Allowed（メソッドが禁止されている）|
|408 |Request Timeout（リクエストがタイムアウト）|
|500 |Internal Server Error（サーバー内部のエラー）|
|502 |Bad Gateway（不正なゲートウェイ）|
|503 |Service Unavailable（サービスが利用不可）|

## Apacheのインストール

Apacheをインストール
```
$ sudo apt install apache2
```
起動状況を確認する
```
$ sudo systemctl status apache2
apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-01-17 14:05:24 UTC; 1 day 22h ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 1577 (apache2)
      Tasks: 55 (limit: 2220)
     Memory: 6.3M
        CPU: 7.997s
     CGroup: /system.slice/apache2.service
             tq1577 /usr/sbin/apache2 -k start
             tq1596 /usr/sbin/apache2 -k start
             mq1597 /usr/sbin/apache2 -k start
```

開いているポートを確認する
```
$ ss -atl
State   Recv-Q  Send-Q  Local Address:Port    Peer Address:Port   Process
LISTEN  0       4096    127.0.0.53%lo:domain       0.0.0.0:*
LISTEN  0       128           0.0.0.0:ssh          0.0.0.0:*
LISTEN  0       511                 *:http               *:*
LISTEN  0       128              [::]:ssh             [::]:*
```
ss -atl コマンドの出力から、システム上でリッスン状態にあるTCPソケットに関する情報を読み取ることができます。この出力を分析すると、以下の情報が得られます。

127.0.0.53%lo:domain

ローカルアドレス 127.0.0.53 の 53 ポート（DNSサービスの標準ポート）でリッスンしています。
このポートはローカルホスト内部でのDNS解決に使用されている可能性があります。
%lo はローカルループバックインターフェースを示しています。
0.0.0.0:ssh

0.0.0.0 アドレス（すべてのIPv4アドレス）の 22 ポート（SSHの標準ポート）でリッスンしています。
この設定により、任意のネットワークインターフェースからのSSH接続が受け入れられます。
*:http

すべてのアドレス（IPv4およびIPv6）の 80 ポート（HTTPの標準ポート）でリッスンしています。
Webサーバーが稼働しており、外部からのHTTPリクエストを受け入れる状態です。
[::]:ssh

[::] アドレス（すべてのIPv6アドレス）の 22 ポートでリッスンしています。
IPv6経由でのSSH接続も受け入れられるようになっています。
この出力は、サーバーがDNS解決、SSH接続、およびHTTPリクエストの受付をリッスンしていることを示しています。また、これらのサービスがIPv4およびIPv6の両方でアクセス可能であることも示唆しています。セキュリティを維持するために、これらのポートのアクセスを適切に管理し、不要なサービスは無効化することが重要です。

---

## Apacheの起動と終了
Apacheを起動する
```
$ sudo systemctl start apache2
```
Apacheを終了する
```
$ sudo systemctl stop apache2
```
設定を変更した後、Apacheを再起動する必要あり、restartを使う
```
$ sudo systemctl restart apache2
```
設定ファイルを再読み込みする
```
$ sudo systemctl reload apache2
```
システム起動時に、Apacheも自動的に起動するようにする
```
$ sudo systemctl enable apache2
```
システム起動時に、Apacheも自動的に起動しないようにする
```
$ sudo systemctl disable apache2
```

---
## Apacheの設定
### Apacheの基本設定
書式：
　ディレクティブ　設定値

設定ファイルのバックアップ
```
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.original
```
 ■サーバ名、管理者メールの設定
 ```
<VirtualHost *:80>
        ServerName www.shimin.com
        ServerAdmin min.shi.ver2@gmail.com
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
 ```
### Apache2の設定ファイル
```
shimin@shiminserver:/var/www/html$ cd /etc/apache2/
shimin@shiminserver:/etc/apache2$ ll
total 88
drwxr-xr-x  8 root root  4096 Jan 17 14:05 ./
drwxr-xr-x 97 root root  4096 Jan 17 14:05 ../
-rw-r--r--  1 root root  7224 Oct 26 13:44 apache2.conf
drwxr-xr-x  2 root root  4096 Jan 17 14:05 conf-available/
drwxr-xr-x  2 root root  4096 Jan 17 14:05 conf-enabled/
-rw-r--r--  1 root root  1782 May  3  2023 envvars
-rw-r--r--  1 root root 31063 May  3  2023 magic
drwxr-xr-x  2 root root 12288 Jan 17 14:05 mods-available/
drwxr-xr-x  2 root root  4096 Jan 17 14:05 mods-enabled/
-rw-r--r--  1 root root   320 May  3  2023 ports.conf
drwxr-xr-x  2 root root  4096 Jan 19 13:59 sites-available/
drwxr-xr-x  2 root root  4096 Jan 17 14:05 sites-enabled/
```
| 設定ファイル | 説明 |
|:--|:--|
|apache2.conf|メイン設定ファイル|
|conf-available/|各種機能の設定ファイルが格納されるディレクトリ|
|conf-enabled/|有効な機能の設定ファイルが格納されるディレクトリ（conf-available内ファイルへのリンク）|
|mods-available/|各種モジュールの設定ファイルが格納されるディレクトリ|
|mods-enabled/|有効なモジュールの設定ファイルが格納されるディレクトリ（mods-available内ファイルへのリンク）|
|sites-available/|Webサイトの設定ファイルが格納されるディレクトリ|
|sites-enabled/|有効なWebサイトの設定ファイルが格納されるディレクトリ（sites-available内ファイルへのリンク）|
|envvars|デフォルトの環境変数設定|
|magic|mod_mime_magicのためのMIMEデータ|
|ports.conf|待ち受けポート番号の設定|

```
設定ファイルの構文チェック方法
$ sudo apachectl configtest
```
https://httpd.apache.org/docs/current/mod/directives.html

https://httpd.apache.org/docs/current/configuring.html

### 主なディレクティブ
:::note alert
ServerTokens Prod|Major|Minor|OS|Full
HTTPヘッダ内に出力されるバージョン情報（バナー情報）を指定する。
通常は、ServerTokens Prod
??設定したが、効かなかった！！
:::

:::note info
ServerRoot パス
Apacheが利用するトップディレクトリを指定します。
例：ServerRoot "/etc/apache2"
:::

:::note info
Timeout タイムアウト時間
各イベントについて、リクエストを失敗させるまでにサーバが 待つ時間を設定。
例：Timeout 300
:::

:::note info
KeepAlive on|off
複数のリクエストが同じ TCP の接続で送られる、長時間持続する HTTP セッションを提供します
例：KeepAlive on
:::

:::note info
MaxKeepAliveRequests 上限リクエスト数
KeepAlive が有効な場合に、 一回の接続で受け付け可能なリクエストの数を制限します。 0 に設定していれば、受け付けるリクエストは無制限になります
例：MaxKeepAliveRequests 100
:::

:::note info
KeepAliveTimeout タイムアウト時間
持続的な接続で次のリクエストが来るまでサーバが待つ時間
例：KeepAliveTimeout 5
:::

:::note info
HostnameLookups On|Off|Double
DNSの逆引きを行い、アクセス元のIPからホスト名を取得する。ログにホスト名を記録したり、ホスト名でアクセス制御を行う場合は有効にする。パフォーマンスを高めるためにはoffを指定します。
例：HostnameLookups Off
:::

:::note alert
ServerName サーバのホスト名
Apacheが稼働しているホストのホスト名を指定する
サーバが自分自身を示すスキーム名、ホスト名とポート番号を設定します。 これは、リダイレクトする URL を生成する際に利用されます。 例えば、ウェブサーバを動かしているマシンは simple.example.com で、DNS のエイリアス www.example.com もあるときに、 ウェブサーバが後者として認識されて欲しいときは、以下のようにディレクティブを 使います。
例：ServerName www.example.com
:::

:::note info
ServerAdmin メールアドレス
クライアントに返すさまざまな エラーメッセージ中に記述する、 問合せアドレスを設定します。
例：ServerAdmin min.shi.ver2@gmail.com
:::

:::note info
ErrorLog ログファイルのパス
エラーを記録するログファイルを指定します。変数${APACHE_LOG_DIR}は[/var/log/apache2]を指します。
例：ErrorLog ${APACHE_LOG_DIR}/error.log
/etc/apache2/sites-available/000-default.conf で設定する
:::
```
$ ll /var/log/apache2/
-rw-r-----  1 root adm    4136 Jan 20 00:37 access.log
-rw-r-----  1 root adm    3700 Jan 19 23:54 access.log.1
-rw-r-----  1 root adm    2118 Jan 20 00:36 error.log
-rw-r-----  1 root adm    2655 Jan 20 00:00 error.log.1
-rw-r-----  1 root adm       0 Jan 17 14:05 other_vhosts_access.log
```

:::note info
LogLevel ログレベル
ErrorLog の冗長性を制御する
例：LogLevel warn
:::

:::note info
LogFormat ログフォーマット　書式名
https://httpd.apache.org/docs/current/logs.html
https://httpd.apache.org/docs/current/mod/mod_log_config.html#logformat
例：
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
:::

:::note info
CustomLog ログファイル名 ログ書式名
サーバへのリクエストを ログ収集するために使われます。ログの書式が指定され、 環境変数を使ってロギングが条件に応じて行なわれるようにすることもできます。
例：CustomLog ${APACHE_LOG_DIR}/access.log combined
/etc/apache2/sites-available/000-default.conf で設定する
:::

:::note info
Listen [IP アドレス:]ポート番号
/etc/apache2/ports.conf　で設定されている
```
<IfModule ssl_module>
        Listen 443
</IfModule>
<IfModule mod_gnutls.c>
        Listen 443
</IfModule>
```
待ち受けるポート番号を指定します。IPアドレスは省略可能
例：Listen 80
:::

:::note info
DocumentRoot ディレクトリパス
ウェブから見えるメインのドキュメントツリーになる ディレクトリ
/etc/apache2/sites-available/000-default.conf で設定する
例：DocumentRoot /var/www/html
:::

:::note info
UserDir 公開ディレクトリ|disabled
ApacheのUserDirディレクティブは、ユーザーのホームディレクトリ内にある特定のサブディレクトリにウェブサーバーからアクセスするために使用されます。これにより、ユーザーは自分のホームディレクトリ内にウェブページを配置し、外部からアクセス可能にすることができます。UserDirディレクティブの一般的な使用例は、ユーザーごとのパーソナルウェブページの提供です。
```
$ less /etc/apache2/mods-available\userdir.conf
<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit Indexes
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
                Require method GET POST OPTIONS
        </Directory>
</IfModule>
```
:::

:::note info
DirectoryIndex インデックスファイル名
クライアントがディレクトリをリクエストしたときに調べる リソースのリスト
例：DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
:::

:::note info
Alias URL-path file-path|directory-path
ドキュメントを ローカルファイルシステムの DocumentRoot 以外の場所に保管することを可能にします
例：Alias /images /home/www/images
:::

:::note info
ScriptAlias URL-path file-path|directory-path
対象ディレクトリに mod_cgi の cgi-script ハンドラで処理される CGI スクリプトがあることを示す以外は Alias ディレクティブと同じ振る舞いをします。
例：ScriptAlias /cgi-bin/ /web/cgi-bin/
:::

:::note info
Optinos オプション
特定のディレクトリに対して どの機能が使用可能かを制御します
例：
```
<Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit Indexes
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
                Require method GET POST OPTIONS
</Directory>
```
:::

:::note info
AccessFileName ファイル名
リクエストを処理するとき、サーバはディレクトリに 対して分散設定ファイルが有効になっていれば、 そのドキュメントへの パス上にある全てのディレクトリから、ここで指定された名前の一覧の中で 最初に見つかったファイルをそれぞれ設定ファイルとして読み込みます。
例：
```
AccessFileName .acl

という設定があると、以下のようにして無効にされていない限り、 
ドキュメント /usr/local/web/index.html を返す前に、
サーバは /.acl, /usr/.acl, /usr/local/.acl, /usr/local/web/.acl から 
ディレクティブを読み込みます。
<Directory />
　　AllowOverride None
</Directory>
```
:::

## モジュール
モジュールを組み込む（ロードする）ことで、機能を増やすことができます。
**モジュールを確認する**
```
$ sudo apachectl -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_event_module (shared)
 negotiation_module (shared)
 reqtimeout_module (shared)
 setenvif_module (shared)
 status_module (shared)
 userdir_module (shared)
```
**モジュールを有効化する**
```
a2enmod userdir  ※a2enmod [モジュール名]
```

**モジュールを無効化する**
```
a2dismod userdir  ※a2dismod [モジュール名]
```

**Apacheのステータスを端末上で確認する**
```
$ sudo apt-get install w3m
$ w3m http://localhost/server-status
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679729/23861721-3f1b-1178-d8a4-ab7f9055ef85.png)

**対話的に実行する
```
$ sudo a2enmod
Your choices are: access_compat actions alias allowmethods asis auth_basic auth_digest auth_form authn_anon authn_core authn_dbd authn_dbm authn_file authn_socache authnz_fcgi authnz_ldap authz_core authz_dbd authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex brotli buffer cache cache_disk cache_socache cern_meta cgi cgid charset_lite data dav dav_fs dav_lock dbd deflate dialup dir dump_io echo env expires ext_filter file_cache filter headers heartbeat heartmonitor http2 ident imagemap include info lbmethod_bybusyness lbmethod_byrequests lbmethod_bytraffic lbmethod_heartbeat ldap log_debug log_forensic lua macro md mime mime_magic mpm_event mpm_prefork mpm_worker negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_express proxy_fcgi proxy_fdpass proxy_ftp proxy_hcheck proxy_html proxy_http proxy_http2 proxy_scgi proxy_uwsgi proxy_wstunnel ratelimit reflector remoteip reqtimeout request rewrite sed session session_cookie session_crypto session_dbd setenvif slotmem_plain slotmem_shm socache_dbm socache_memcache socache_redis socache_shmcb speling ssl status substitute suexec unique_id userdir usertrack vhost_alias xml2enc
Which module(s) do you want to enable (wildcards ok)?
```
```
$ ll /etc/apache2/mods-available/
-rw-r--r-- 1 root root   301 Jan 20 02:21 userdir.conf
-rw-r--r-- 1 root root    66 May  3  2023 userdir.load

loadはモジュールをロードする設定
confはモジュールの設定ファイル
```

### バーチャルホスト
複数のWebサイトを管理することができます。
一つのIPアドレスで二つのサイトを運用するように設定する
```
/etc/apache2/sites-available/v1.example.com.conf
<VirtualHost *:80>
        ServerName v1.example.com
        ServerAdmin min.shi.ver2@gmail.com
        DocumentRoot /var/www/v1
        ErrorLog ${APACHE_LOG_DIR}/v1.error.log
        CustomLog ${APACHE_LOG_DIR}/v1.access.log combined
</VirtualHost>

/etc/apache2/sites-available/v2.example.com.conf
<VirtualHost *:80>
        ServerName v2.example.com
        ServerAdmin min.shi.ver2@gmail.com
        DocumentRoot /var/www/v2
        ErrorLog ${APACHE_LOG_DIR}/v2.error.log
        CustomLog ${APACHE_LOG_DIR}/v2.access.log combined
</VirtualHost>

$ sudo mkdir /var/www/v1
$ sudo mkdir /var/www/v2

それぞれのディレクトリにindex.htmlを作成する
```

各サイトを有効化する
```
$ sudo a2ensite v1.example.com
Enabling site v1.example.com.
To activate the new configuration, you need to run:
  systemctl reload apache2
  
$ sudo a2ensite v2.example.com
Enabling site v2.example.com.
To activate the new configuration, you need to run:
  systemctl reload apache2

$ systemctl restart apache2
```
```
$ telnet 192.168.0.14 80
Trying 192.168.0.14...
Connected to 192.168.0.14.
Escape character is '^]'.
GET / HTTP/1.1　→　手入力
Host: v1.example.com　→　手入力

HTTP/1.1 200 OK
Date: Sat, 20 Jan 2024 04:33:15 GMT
Server: Apache/2.4.52 (Ubuntu)
Last-Modified: Sat, 20 Jan 2024 04:26:48 GMT
ETag: "9-60f5901475397"
Accept-Ranges: bytes
Content-Length: 9
Content-Type: text/html

hello v1　　☚　/var/www/v1/index.htmlでの内容
Connection closed by foreign host.
```

```
$ telnet 192.168.0.14 80
Trying 192.168.0.14...
Connected to 192.168.0.14.
Escape character is '^]'.
GET / HTTP/1.1　　　→　手入力
Host: v2.example.com　→　手入力

HTTP/1.1 200 OK
Date: Sat, 20 Jan 2024 04:35:59 GMT
Server: Apache/2.4.52 (Ubuntu)
Last-Modified: Sat, 20 Jan 2024 04:27:03 GMT
ETag: "9-60f5902359c70"
Accept-Ranges: bytes
Content-Length: 9
Content-Type: text/html

hello v2
Connection closed by foreign host.

```

### ユーザ認証
特定のディレクトリ以下にアクセスするときにユーザ名とパスワードを用いた認証をかけることができます。
* 基本認証（BASIC認証）
* ダイジェスト認証

```
$ sudo mkdir /var/www/html/private-area
$ less /etc/apache2/sites-available/private-area.conf
<Directory /var/www/html/private-area>
        AuthType Basic
        AuthName "Private Area"
        AuthUserFile /etc/apache2/htpasswd
        require valid-user
</Directory>
```

```
htpasswd [-c] ファイル名 ユーザ名
$ sudo htpasswd -c /etc/apache2/htpasswd duanfang
New password:
Re-type new password:　→　duanfang
Adding password for user duanfang
```
```
設定を有効にします。
$ sudo a2ensite private-area
$ sudo systemctl restart apache2
```
http://IPアドレス/private-area/にアクセスすると、認証画面が出る。

:::note warn
基本認証では、パスワードは暗号化されず、ネットワーク上を流れます。セキュリティ上芳しくはありませんので、インターネットで利用する場合は、SSL/TLSに対応させたうえで利用することを推奨します。
:::

### ホストアクセス制限
アクセス元のIPアドレスやホスト名、ドメイン名などによってアクセスを制限したい場合は、Requireディレクティブを使います。

**Require エンティティ [値...]**
| 1 | 2 |
|:-|:-|
|ip 10.0.0.1|IPアドレスが10.0.0.1のホスト|
|ip 172.16 172.17|IPアドレスが172.16.0.0/16 および172.17.0.0/16のホスト|
|host example.org|example.orgのホスト|
|group admin|adminグループ|
|local|ローカルホスト|
|all granted|すべてのホストを許可|
|all denied|すべてのホストを拒否|
```
例：
Require all denied
Require ip 192.168.1
```

### TLS/SSLの設定
TODO....

### PHPの利用
```
$ sudo apt install php libapache2-mod-php php-cgi php-mbstring php-pear
$ sudo a2enconf php8.1-cgi
$ sudo vi /etc/php/8.1/apache2/php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Tokyo

$ sudo systemctl restart apache2
```
/var/www/html/phpinfo.php を作成する
http://IPアドレス/phpinfo.php　画面に表示する。

### Javaの場合の連携
Javaの場合は、モジュールとして連携するのではなくて、Apacheとは別の、サーブレットコンテナと呼ばれるプログラム（Tomcatが有名）で動きます。
Apacheと連携する場合は、Apacheから受け取ったリクエストをサーブレットコンテナに転送するという形をとります。こうしたリクエストを転送する仕組みのことは、「プロキシ」と呼ばれることもあります。

## PHPの環境を整える
Webサーバは、インターネット上で使われるとは限りません。
Webサーバは、クライアントからのアクセスに対し、応答を返す仕組みです。それを利用して、システムの構築にも使われます。システムをWebサーバと同居させ、応答をWebサーバに担当させるのです。

Web技術でシステムを組む時にOS、Webサーバ、データベースサーバ、プログラム実行環境をセットして組むことが多く、特に、「Linux」「Apache」「MySQL」「PHP」の組みあわせをLAMP（ランプ）サーバーと言います。

インストールすると、「.php」の拡張子を持つファイルが、PHPモジュールに紐づけられる。
PHPの設定情報は、下記に格納される。
```
/etc/apache2/mods-available
-rw-r--r-- 1 root root 855 Aug 18 11:41 php8.1.conf
-rw-r--r-- 1 root root 101 Aug 18 11:41 php8.1.load

$ less php8.1.load
# Conflicts: php5
# Depends: mpm_prefork
LoadModule php_module /usr/lib/apache2/modules/libphp8.1.so

$ less php8.1.conf
<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
    Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>
```
**phpモジュールの有効化**
```
$ sudo a2enmod php8.1
```