ウェブサーバーしたい(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

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

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

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

# Listen ポート番号
Listen 80
Listen 443

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

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

# <Directory パス>...</Directory>
# <File パス>...</Directory>

# 全体(/)のアクセス権の設定
# システム全体は外部からアクセスできないように設定
<Directory />
    AllowOverride none
    Require all denied
</Directory>

# コンテンツ領域(/usr/local/apache2/htdocs/)のアクセス権の設定
# コンテンツ領域(とその下)は外部からアクセスできるように設定
<Directory "/usr/local/apache2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# .htではじまるファイルのアクセス権の設定
# ワイルドカード(*)を使ってパスを指定できる
# .htaccessや.htpasswordは外部からアクセスできないように設定
<File ".ht*">
    Require all denied
</File>

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

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

<IfModule log_config_module>
    # LogFormat "フォーマット文字列" ログ形式の名前
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    # CustomLog "保存先" ログ形式の名前
    CustomLog "logs/access_log" combined
</IfModule>

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

HTTPS使いたい

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf

<IfModule ssl_module>
    # SSL証明書の設定
</IfModule>

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

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

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

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

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

パスワードをかけたい

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

リファレンス