# ウェブサーバーしたい(``httpd``) ```bash $ docker run -d -p 8081:80 --name my-httpd httpd $ docker exec -it my-httpd bash (my-httpd) $ httpd -v Server version: Apache/2.4.56 (Unix) Server built: Mar 7 2023 20:23:05 (my-httpd) $ pwd /usr/local/apache2 ``` ウェブサーバーとして一般的な``Apache``の設定方法を確認してます。 ここではDockerで起動したApacheサーバーのコンテナを使って、設定内容を調べています。 ()[../docker/docker-httpd] ## サーバーを操作したい ```bash $ httpd -k start $ httpd -k stop $ httpd -k graceful-stop $ httpd -k restart ``` Apacheコンテナ内には``httpd``コマンドがありました。 サーバーを停止(``httpd -k stop``)したらコンテナも停止しました。 一般的なサーバの場合、``service``コマンドや``apachectl``コマンドで操作するような気がします。 ## 設定ファイルを確認したい(``httpd.conf``) ```bash $ find . -name *.conf | grep httpd ./conf/httpd.conf ./conf/extra/httpd-*.conf # 省略 ./conf/original/httpd.conf ./conf/original/extra/httpd-*.conf ``` 設定ファイルは``httpd.conf``です。 上のコマンドでは、拡張子が``*.conf``で、``httpd``の文字列を含むパスを検索しています。 メインの設定ファイル(``./conf/httpd.conf``)とモジュール用の設定ファイル(``./conf/extra/httpd-*.conf``)が見つかりました。 また、``./conf/original/``以下のファイルは(たぶん)オリジナルの設定ファイルです。 設定ミスした場合などは、このファイルとの差分を調べたり、このファイルで上書きしてリセットすればよさそうです。 設定ファイルには各種の「ディレクティブ」がすでに書き込まれていて、サーバー設定の確認がができます。 また、このディレクティブを書き換えることで設定を変更できます。 ## 設定ファイルのシンタックス確認(``nginx -t``) ```bash $ httpd -t ``` 設定ファイルのシンタックス(=書き方)が正しいかチェックできます。 設定を書き換えた場合、サーバーを再起動する前には必ずチェックするとよいです。 ## 公開用ディレクトリを確認したい(``DocumentRoot``) ```apache # DocumentRoot 絶対パス DocumentRoot /usr/local/apache2/htdocs ``` 外部に公開するコンテンツをディレクトリは``DocumentRoot``で設定します。 ドキュメントルートは絶対パスで指定します。 ## ポート番号を確認したい(``Listen``) ```apache # Listen ポート番号 Listen 80 Listen 443 ``` 外部からアクセスするときのポート番号は``Listen``で設定できます。 ``Listen ポート番号``を追加することで複数のポートを設定できます。 HTTPは80番、HTTPSは443番がデフォルトのポート番号です。 ## ディレクトリのアクセス権を確認したい(``Directory`` / ``File``) ```apache # ... # ... # 全体(/)のアクセス権の設定 # システム全体は外部からアクセスできないように設定 AllowOverride none Require all denied # コンテンツ領域(/usr/local/apache2/htdocs/)のアクセス権の設定 # コンテンツ領域(とその下)は外部からアクセスできるように設定 Options Indexes FollowSymLinks AllowOverride None Require all granted # .htではじまるファイルのアクセス権の設定 # ワイルドカード(*)を使ってパスを指定できる # .htaccessや.htpasswordは外部からアクセスできないように設定 Require all denied ``` 外部からのアクセス権限は``Directory``や``File``で設定できます。 ファイルシステム全体や``.htaccess``のようなファイルは外部からのアクセスNGにしつつ、 公開用コンテンツ(=ドキュメントルート以下)は外部アクセスOKにできます。 ## ログフォーマットを確認したい(``LogFormat`` / ``CustomLog``) ```apache # 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 ``` ログ形式は``LogFormat``で設定できます。 ``httpd.conf``には``common``形式と``combined``形式はプリセットとして定義されていました。 アクセスログの保存先とフォーマットは``CustomLog``で設定できます。 保存先を相対パスで指定した場合、``ServerRoot``からの相対パスになります。 ## HTTPS使いたい ```apache LoadModule ssl_module modules/mod_ssl.so Include conf/extra/httpd-ssl.conf # SSL証明書の設定 ``` HTTPSを使いたい場合は、``mod_ssl``モジュールを有効にします。 ## ユーザーごとのディレクトリを使いたい ```apache 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認証にするとよいみたいです。 ## リファレンス - [Apache2.4 ドキュメント](https://httpd.apache.org/docs/2.4/) - [Apache2.4 ディレクティブクイックリファレンス](https://httpd.apache.org/docs/2.4/ja/mod/quickreference.html) - [Apache2.4 モジュール一覧](https://httpd.apache.org/docs/2.4/ja/mod/)