概要
Apache HTTP Serverプロジェクトは、UNIXやWindowsを含むOS向けのオープンソースHTTPサーバを開発および保守する取り組みである。
このプロジェクトの目標は、現在のHTTP標準に同期したHTTPサービスを提供する、安全で効率的かつ拡張可能なサーバを提供することである。
Apache HTTPサーバ (httpd) は1995年に開始され、1996年4月以来、インターネット上で人気のあるWebサーバとなっている。
2020年2月にプロジェクトとして25回目の誕生日を迎えた。
Apache HTTP Serverは、Apache Software Foundationのプロジェクトである。
その他、Raspberry Piでは、WebサーバとPHP等で作成したWebページを介して、GPIOを制御することも可能である。
Apache2のインストール
パッケージ管理システムからインストール
まず、Apache2をインストールする。
sudo apt install apache2
Raspberry Piでは、Apache2のデフォルトのドキュメントルートディレクトリは、/var/www/htmlディレクトリである。
Apache2が正常に動作するかどうかを確認するため、以下に示すようなテストページを作成する。
sudo vi /var/www/html/index.html
 <!-- index.htmlファイル -->
 <html>
    <body>
       <h1>Welcome to Raspberry Pi Web Site</h1>
    </body>
 </html>
Webブラウザに、http://localhost と入力する。
"Welcome to Raspberry Pi Web Site"と記載されたWebページが表示されれば、Apache2のインストールは完了である。
Raspberry Piにおいて、CGIファイルのディレクトリのパスは、/usr/lib/cgi-binディレクトリである。
(ディレクトリを変更する場合は、Apache2の設定ファイルを編集する必要がある)
動作確認のため、CGIファイルを作成して実行および表示する。
また、一般ユーザがCGIファイルを実行できるようにするため、実行権限を付加する。
sudo chmod 755 /usr/lib/cgi-bin/test.cgi
 # /usr/lib/cgi-bin/test.cgiファイル
 
 #!bin/bash
 
 echo "Content-type:text/html"
 echo "Test!!"
CGIファイルを実行するため、Webブラウザに http://localhost/cgi-bin/test.cgi と入力する。
Webブラウザに"Test!!"という文字が表示されることを確認する。
ソースコードからインストール
Apache2をビルドするために必要なライブラリをインストールする。
sudo apt install libcurl4-openssl-dev libexpat1-dev libnghttp2-dev zlib1g-dev libxml2-dev libjansson-dev \
                 libssl-dev libssl1.0-dev libpcre2-dev libsystemd-dev liblua5.4-dev
                 valgrind valgrind-dbg  # Valgrindを有効にする場合
まず、APR(Apache Portable Runtime)をソースコードからインストールする。
APRの公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf apr-<バージョン>.tar.gz cd apr-<バージョン>
APRをビルドおよびインストールする。
mkdir builddir && cd builddir ../configure --prefix=<APRのインストールディレクトリ> --enable-threads make -j $(nproc) make install
次に、APR-Utilをソースコードからインストールする。
APR-Utilの公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf apr-util-<バージョン>.tar.gz cd apr-util-<バージョン>
APR-Utilをビルドおよびインストールする。
mkdir apr-util-build && cd apr-util-build ../configure --prefix=<APRのインストールディレクトリ> --enable-threads --with-valgrind
最後に、Apache2の公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf httpd-<バージョン>.tar.bz2 cd httpd-<バージョン>
ビルド用ディレクトリを作成して、Apache2をビルドおよびインストールする。
mkdir build_Apache2 && cd build_Apache2
../configure --prefix=<Apache2のインストールディレクトリ>                       \
             --with-apr=<APRのインストールディレクトリ>                         \
             --with-apr-util=<APR-Utilのインストールディレクトリ>               \
             --with-included-apr=/<APRのインストールディレクトリ>/include/apr-1 \  # srclib内のAPRとAPR-Utilもビルド対象にする
             --with-mpms-shared=all                                     \  # worker, prefork, eventをビルド対象にする
             --with-pcre=<PCREのインストールディレクトリ>                       \  # 例. /usr/local/src/pcre-<バージョン>/pcre-config
             --with-ssl=<OpenSSLのインストールディレクトリ>                     \  # 例. /usr/local/src/ssl
             --enable-dav --enable-dav-fs                               \
             --enable-deflate                                           \
             --enable-headers                                           \
             --enable-mods-shared=reallyall                             \  # 動的モジュールをビルド対象にする
             --enable-proxy --enable-proxy-ajp                          \
             --enable-rewrite=shared                                    \
             --enable-ssl                                               \  # SSLモジュールをビルド対象にする
             --enable-so                                                \
             --enable-speling=shared                                    \
             --enable-systemd
make -j $(nproc)
make install
Apache2サービスを操作するユーザとグループを作成する。
また、デフォルトシェルに/sbin/nologinを指定して、当ユーザでのログインを禁止する。
cd <Apache2のインストールディレクトリ> sudo groupadd www sudo useradd www -g www -s /sbin/nologin sudo chown -R www:www .
PHPを使用する場合、リクエストされたphpファイルを実行できるようにする。
この設定が無い場合、リクエストが来てもテキストファイルのように.phpファイルの内容を返してしまう。
Apache2の設定ファイルを以下のように編集する。
sudo vi /<Apache2のインストールディレクトリ>/conf/httpd.conf
# /<Apache2のインストールディレクトリ>/conf/httpd.confファイル LoadModule php_module modules/libphp.so <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> <IfModule php_module> DirectoryIndex index.html default.php index.php AddHandler application/x-httpd-php .php </IfModule>
Apache2のサービスファイルを作成する。
sudo vi /usr/lib/systemd/system/httpd.service
 # /usr/lib/systemd/system/httpd.serviceファイル
 
 [Unit]
 Description=The Apache HTTP Server
 After=network.target remote-fs.target nss-lookup.target
 Documentation=man:httpd(8)
 Documentation=man:apachectl(8)
 
 [Service]
 Type=forking
 #Type=notify
 #EnvironmentFile=/<Apache2の設定ファイルがあるディレクトリ>/conf/httpd.conf
 #Environment=LD_LIBRARY_PATH=/usr/local/ssl/lib:/usr/local/lib:/usr/local/lib64:/usr/lib
 ExecStart=/<Apache2のインストールディレクトリ>/bin/apachectl -k start
 ExecReload=/<Apache2のインストールディレクトリ>/bin/apachectl -k graceful
 ExecStop=/<Apache2のインストールディレクトリ>/bin/apachectl -k stop
 
 #ExecStart=/<Apache2のインストールディレクトリ>/bin/httpd \$OPTIONS -DFOREGROUND
 #ExecReload=/<Apache2のインストールディレクトリ>/bin/httpd \$OPTIONS -k graceful
 #ExecStop=/bin/kill -WINCH \${MAINPID}
 
 # We want systemd to give httpd some time to finish gracefully, but still want it to kill httpd after TimeoutStopSec if something went wrong during the graceful stop.
 # Normally, Systemd sends SIGTERM signal right after the ExecStop, which would kill httpd. We are sending useless SIGCONT here to give httpd time to finish.
 #KillSignal=SIGCONT
 PrivateTmp=true
 
 [Install]
 WantedBy=multi-user.target
Apache2のサービスファイルを有効にする。
sudo systemctl daemon-reload
以下のようなエラーが出力される場合がある。
# エラー内容 httpd: Could not reliably determine the server's fully qualified domain name httpd: apr_sockaddr_info_get() failed
この時、/<Apache2のインストールディレクトリ>/conf/httpd.confファイルのServerNameに、ドメイン名またはIPアドレスを設定する。
# /<Apache2のインストールディレクトリ>/conf/httpd.confファイル ServerName <ドメイン名またはIPアドレス>:<ポート番号> # 例. 192.168.1.100:80
HTTP/HTTPS通信用にファイアウォールのポートを開放する。
sudo firewall-cmd --zone=public --permanent --add-service=http sudo firewall-cmd --zone=public --permanent --add-service=https sudo firewall-cmd --reload
Aapche2を開始する。
sudo systemctl start httpd
Apache2が正常に動作しているかどうかを確認するため、以下に示すようなテストページを作成する。
初期状態では、Apache2のサーバルートディレクトリは、/<Apache2のインストールディレクトリ>/htdocsディレクトリである。
vi /<Apache2のサーバルートディレクトリ>/index.html # または sudo vi /<Apache2のサーバルートディレクトリ>/index.html
 <!-- /<Apache2のサーバルートディレクトリ>/index.htmlファイル -->
 
 <html>
    <body>
       <h1>Welcome to Raspberry Pi Web Site</h1>
    </body>
 </html>
Webブラウザに、http://localhost と入力する。
"Welcome to Raspberry Pi Web Site"と記載されたWebページが表示されれば、Apache2のインストールは完了である。
CGIの設定
まず、Apache2の設定ファイルにおいて、以下に示す赤字の設定を追記する。
# "/srv/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/srv/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI -Includes
   AddHandler cgi-script .cgi .pl
   <IfModule !mod_access_compat.c>
      Require all granted
   </IfModule>
   <IfModule mod_access_compat.c>
      Order allow,deny
      Allow from all
   </IfModule>
</Directory>
上記の設定を反映させるため、Apache2を再起動する。
sudo systemctl restart apache2
次に、test1.cgiファイルを作成して表示する。
test1.cgiファイルの内容は、以下の通りである。
以下の例では、CGIファイルのディレクトリのパスは、/usr/lib/cgi-bin/である。
sudo vi /usr/lib/cgi-bin/test1.cgi
 # /usr/lib/cgi-bin/test1.cgiファイル
 
 #!/usr/bin/env bash
 
 echo "Content-Type: text/html"
 echo ""
 echo "<!doctype html>"
 echo "<html><head><title>Test CGI</title></head>"
 echo "<body>"
 echo "CGI Shell Web Site"
 echo "</body>"
 echo "</html>"
また、cgiファイルにはPython等も使用できる。
以下の例では、CGIスクリプトにPython3を使用している。
 # /usr/lib/cgi-bin/test2.cgi
 
 #!/usr/bin/env python3
 
 print("Content-type: text/html\n")
 print("<html><head><title>Test CGI</title></head>\n<body>")
 print("<div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">")
 print("CGI Python3 Web Site")
 print("</div>")
 print("</body>\n</html>")
また、一般ユーザでも実行できるようにするため、以下のコマンドを実行する。
sudo chmod 755 /srv/www/cgi-bin/test1.cgi sudo chmod 755 /srv/www/cgi-bin/test2.cgi
test1.cgiファイルおよびtest2.cgiファイルを実行するため、
Webブラウザにそれぞれ http://localhost/cgi-bin/test1.cgi および http://localhost/cgi-bin/test2.cgi と入力する。
Webブラウザに"CGI Shell Web Site"および"CGI Python3 Web Site"と表示されることを確認する。
Apache2の起動・停止・再起動
Apache2の起動は、以下のコマンドを実行する。
sudo systemctl start httpd
Apache2の停止は、以下のコマンドを実行する。
sudo systemctl stop httpd
Apache2の再起動は、以下のコマンドを実行する。
sudo systemctl restart httpd
Apache2の自動起動の確認・停止
Raspbianの起動時にApache2が自動起動の設定を確認する。(デフォルトでは自動起動になっている)
Apache2の自動起動を確認するには、以下のコマンドを実行する。
ls /etc/rc2.d/
もし、Apache2の自動起動を停止したい場合は、以下のコマンドを実行する。
sudo systemctl disable httpd
最後に、Apache2の自動起動が停止されていることを確認するため、再度、以下のコマンドを実行する。
ls /etc/rc2.d/
PHPのインストール
次に、PHPをインストールする。
PHPのインストール手順は、インストール - PHPを参照する。
PHPが正常に動作するかどうかを確認するため、/var/www/htmlディレクトリに対して、以下に示すPHPファイルを作成する。
sudo vi /var/www/html/index.php
 # /var/www/html/index.phpファイル
 
 <?php
    phpinfo();
 ?>
Webブラウザで http://localhost/index.php と入力する。
PHPの情報の一覧が表示されている場合は、PHPが正常に動作している。
PHP-FPMを使用する場合
PHP-FPMを使用する場合、PHP-FPMが動作するユーザ名およびグループ名 (www.confファイルにあるuserおよびgroup) と同名にする必要がある。 (nobodyでもよい)
この設定を行わない場合、リクエストが来てもテキストファイルのように.phpファイルの内容を返してしまう。
Apache2の設定ファイル (httpd.confファイル) において、UserおよびGroupを設定する。
sudo vi /<Apache2のインストールディレクトリ>/conf/httpd.conf
 # /<Apache2のインストールディレクトリ>/conf/httpd.confファイル
 
 User <PHP-FPMが動作する同一のユーザ名またはnobody>
 Group <PHP-FPMが動作する同一のグループ名またはnobody>