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
主なディレクティブ
ServerTokens Prod|Major|Minor|OS|Full
HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。
通常は、ServerTokens Prod
??設定したが、効かなかった!!
ServerRoot パス
Apacheが利用するトップディレクトリを指定します。
例:ServerRoot "/etc/apache2"
Timeout タイムアウト時間
各イベントについて、リクエストを失敗させるまでにサーバが 待つ時間を設定。
例:Timeout 300
KeepAlive on|off
複数のリクエストが同じ TCP の接続で送られる、長時間持続する HTTP セッションを提供します
例:KeepAlive on
MaxKeepAliveRequests 上限リクエスト数
KeepAlive が有効な場合に、 一回の接続で受け付け可能なリクエストの数を制限します。 0 に設定していれば、受け付けるリクエストは無制限になります
例:MaxKeepAliveRequests 100
KeepAliveTimeout タイムアウト時間
持続的な接続で次のリクエストが来るまでサーバが待つ時間
例:KeepAliveTimeout 5
HostnameLookups On|Off|Double
DNSの逆引きを行い、アクセス元のIPからホスト名を取得する。ログにホスト名を記録したり、ホスト名でアクセス制御を行う場合は有効にする。パフォーマンスを高めるためにはoffを指定します。
例:HostnameLookups Off
ServerName サーバのホスト名
Apacheが稼働しているホストのホスト名を指定する
サーバが自分自身を示すスキーム名、ホスト名とポート番号を設定します。 これは、リダイレクトする URL を生成する際に利用されます。 例えば、ウェブサーバを動かしているマシンは simple.example.com で、DNS のエイリアス www.example.com もあるときに、 ウェブサーバが後者として認識されて欲しいときは、以下のようにディレクティブを 使います。
例:ServerName www.example.com
ServerAdmin メールアドレス
クライアントに返すさまざまな エラーメッセージ中に記述する、 問合せアドレスを設定します。
例:ServerAdmin min.shi.ver2@gmail.com
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
LogLevel ログレベル
ErrorLog の冗長性を制御する
例:LogLevel warn
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
CustomLog ログファイル名 ログ書式名
サーバへのリクエストを ログ収集するために使われます。ログの書式が指定され、 環境変数を使ってロギングが条件に応じて行なわれるようにすることもできます。
例:CustomLog ${APACHE_LOG_DIR}/access.log combined
/etc/apache2/sites-available/000-default.conf で設定する
Listen [IP アドレス:]ポート番号
/etc/apache2/ports.conf で設定されている
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
待ち受けるポート番号を指定します。IPアドレスは省略可能
例:Listen 80
DocumentRoot ディレクトリパス
ウェブから見えるメインのドキュメントツリーになる ディレクトリ
/etc/apache2/sites-available/000-default.conf で設定する
例:DocumentRoot /var/www/html
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>
DirectoryIndex インデックスファイル名
クライアントがディレクトリをリクエストしたときに調べる リソースのリスト
例:DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
Alias URL-path file-path|directory-path
ドキュメントを ローカルファイルシステムの DocumentRoot 以外の場所に保管することを可能にします
例:Alias /images /home/www/images
ScriptAlias URL-path file-path|directory-path
対象ディレクトリに mod_cgi の cgi-script ハンドラで処理される CGI スクリプトがあることを示す以外は Alias ディレクティブと同じ振る舞いをします。
例:ScriptAlias /cgi-bin/ /web/cgi-bin/
Optinos オプション
特定のディレクトリに対して どの機能が使用可能かを制御します
例:
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
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
**対話的に実行する
$ 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
基本認証では、パスワードは暗号化されず、ネットワーク上を流れます。セキュリティ上芳しくはありませんので、インターネットで利用する場合は、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