ウェブサーバーしたい(httpd

1$ docker run -d -p 8081:80 --name my-httpd httpd
2$ docker exec -it my-httpd bash
3(my-httpd) $ httpd -v
4Server version: Apache/2.4.56 (Unix)
5Server built:   Mar  7 2023 20:23:05
6(my-httpd) $ pwd
7/usr/local/apache2

ウェブサーバーとして一般的なApacheの設定方法を確認してます。 ここではDockerで起動したApacheサーバーのコンテナを使って、設定内容を調べています。 ()[…/docker/docker-httpd]

サーバーを操作したい

1$ httpd -k start
2$ httpd -k stop
3$ httpd -k graceful-stop
4$ httpd -k restart

Apacheコンテナ内にはhttpdコマンドがありました。 サーバーを停止(httpd -k stop)したらコンテナも停止しました。

一般的なサーバの場合、serviceコマンドやapachectlコマンドで操作するような気がします。

設定ファイルを確認したい(httpd.conf

1$ find . -name *.conf | grep httpd
2./conf/httpd.conf
3./conf/extra/httpd-*.conf  # 省略
4./conf/original/httpd.conf
5./conf/original/extra/httpd-*.conf

設定ファイルはhttpd.confです。 上のコマンドでは、拡張子が*.confで、httpdの文字列を含むパスを検索しています。 メインの設定ファイル(./conf/httpd.conf)とモジュール用の設定ファイル(./conf/extra/httpd-*.conf)が見つかりました。

また、./conf/original/以下のファイルは(たぶん)オリジナルの設定ファイルです。 設定ミスした場合などは、このファイルとの差分を調べたり、このファイルで上書きしてリセットすればよさそうです。

設定ファイルには各種の「ディレクティブ」がすでに書き込まれていて、サーバー設定の確認がができます。 また、このディレクティブを書き換えることで設定を変更できます。

設定ファイルのシンタックス確認(nginx -t

1$ httpd -t

設定ファイルのシンタックス(=書き方)が正しいかチェックできます。 設定を書き換えた場合、サーバーを再起動する前には必ずチェックするとよいです。

公開用ディレクトリを確認したい(DocumentRoot

1# DocumentRoot 絶対パス
2DocumentRoot /usr/local/apache2/htdocs

外部に公開するコンテンツをディレクトリはDocumentRootで設定します。 ドキュメントルートは絶対パスで指定します。

ポート番号を確認したい(Listen

1# Listen ポート番号
2Listen 80
3Listen 443

外部からアクセスするときのポート番号はListenで設定できます。 Listen ポート番号を追加することで複数のポートを設定できます。 HTTPは80番、HTTPSは443番がデフォルトのポート番号です。

ディレクトリのアクセス権を確認したい(Directory / File

 1# <Directory パス>...</Directory>
 2# <File パス>...</Directory>
 3
 4# 全体(/)のアクセス権の設定
 5# システム全体は外部からアクセスできないように設定
 6<Directory />
 7    AllowOverride none
 8    Require all denied
 9</Directory>
10
11# コンテンツ領域(/usr/local/apache2/htdocs/)のアクセス権の設定
12# コンテンツ領域(とその下)は外部からアクセスできるように設定
13<Directory "/usr/local/apache2/htdocs">
14    Options Indexes FollowSymLinks
15    AllowOverride None
16    Require all granted
17</Directory>
18
19# .htではじまるファイルのアクセス権の設定
20# ワイルドカード(*)を使ってパスを指定できる
21# .htaccessや.htpasswordは外部からアクセスできないように設定
22<File ".ht*">
23    Require all denied
24</File>

外部からのアクセス権限はDirectoryFileで設定できます。 ファイルシステム全体や.htaccessのようなファイルは外部からのアクセスNGにしつつ、 公開用コンテンツ(=ドキュメントルート以下)は外部アクセスOKにできます。

ログフォーマットを確認したい(LogFormat / CustomLog

1<IfModule log_config_module>
2    # LogFormat "フォーマット文字列" ログ形式の名前
3    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
4    LogFormat "%h %l %u %t \"%r\" %>s %b" common
5
6    # CustomLog "保存先" ログ形式の名前
7    CustomLog "logs/access_log" combined
8</IfModule>

ログ形式はLogFormatで設定できます。 httpd.confにはcommon形式とcombined形式はプリセットとして定義されていました。 アクセスログの保存先とフォーマットはCustomLogで設定できます。 保存先を相対パスで指定した場合、ServerRootからの相対パスになります。

HTTPS使いたい

1LoadModule ssl_module modules/mod_ssl.so
2Include conf/extra/httpd-ssl.conf
3
4<IfModule ssl_module>
5    # SSL証明書の設定
6</IfModule>

HTTPSを使いたい場合は、mod_sslモジュールを有効にします。

ユーザーごとのディレクトリを使いたい

1LoadModule userdir_module modules/mod_userdir.so
2Include conf/extra/httpd-userdir.conf

ユーザーごとのディレクトリを使いたい場合は、mod_userdirモジュールを有効にします。 LoadModuleでモジュールを有効にし、Includeで設定ファイルを読み込みます。

ユーザーごとの公開コンテンツ領域はUserDirで設定できます。 デフォルトはpublic_htmlになっているので、~/public_html/以下に配置したコンテンツを公開できます。

パスワードをかけたい

特定のディレクトリに.htaccessを配置し、パスワードを使ったアクセス制限を設定できます。 パスワード認証にはBASIC認証Digest認証の2種類があります。 調べてみると、現在はHTTPS通信ができる場合はBASIC認証でOK、できない場合はDigest認証にするとよいみたいです。

リファレンス