インストール - Apache2(SUSE)

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

このページでは、SUSEにおいて、Webサーバを構築する手順を記載する。


Apache2のインストール

パッケージ管理システムからインストール

まず、Apache2をインストールする。
Apacheのサーバルートのディレクトリは、/srv/www/htdocsディレクトリである。

sudo zypper install apache2


Apache2が正常に動作しているかどうかを確認するため、以下に示すようなテストページを作成する。

sudo vi /srv/www/htdocs/index.html


 index.htmlファイル

 <html>
    <body>
       <h1>Welcome to SUSE Web Site</h1>
    </body>
 </html>


Webブラウザに、http://localhost と入力する。
"Welcome to SUSE Web Site"と記載されたWebページが表示されれば、Apache2のインストールは完了である。

ソースコードからインストール

Apache2をビルドするために必要なライブラリをインストールする。

sudo zypper install libcurl-devel libexpat-devel libnghttp2-devel zlib-devel libxml2-devel libjansson-devel \
                    libopenssl-devel libopenssl-1_1-devel lua53-devel pcre-devel pcre2-devel systemd-devel valgrind-devel


まず、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のインストールディレクトリ>   \
             --with-apr=<APRのインストールディレクトリ> \  # APRを任意のディレクトリにインストールしている場合
             --with-valgrind                       # 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 SUSE Web Site</h1>
    </body>
 </html>


Webブラウザに、http://localhost と入力する。
"Welcome to SUSE Web Site"と記載されたWebページが表示されれば、Apache2のインストールは完了である。


mod_fcgidモジュール (FastCGI)

mod_fcgidモジュールとは

mod_fcgidモジュールは、Apache HTTP ServerのFastCGI実装の1つであり、動的なWebコンテンツを効率的に処理するためのモジュールである。

mod_fcgidモジュールの特徴として、従来のCGIに比べて高いパフォーマンスを実現する。
これは、プロセスを再利用することにより、リクエスト毎にプロセスを生成・破棄する従来のCGIの問題点を解決しているためである。

設定では、基本的な設定だけで運用を開始できる。
プロセス管理も自動的に行われて、必要に応じてプロセスの数を増減させることができる。

セキュリティにおいては、実行ユーザ、グループの制御、タイムアウト設定、プロセス数の制限等が可能である。
これにより、サーバリソースの過剰な使用を防ぎ、安全な運用を実現できる。

mod_fcgidモジュールは、PHP、Python、Perl等のスクリプト言語との相性が良い。
また、他のFastCGI実装であるmod_fastcgiモジュールと比較すると、より軽量で設定が簡単という特徴がある。

ただし、高度な設定オプションはmod_fastcgiモジュールの方が多く用意されている。

mod_fcgidモジュールのインストール

Apache2の公式Webサイトにアクセスして、mod_fcgidモジュールのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf mod_fcgid-<バージョン>.tar.gz
cd mod_fcgid-<バージョン>


mod_fcgidモジュールをビルドおよびインストールする。

export APXS=/<Apache2のインストールディレクトリ>/bin/apxs; \
./configure.apxs --prefix=<Apache2のインストールディレクトリ>
make -j $(nproc)
make install


mod_fcgidモジュールの設定

 # FastCGIデーモンプロセスの基本設定
 
 LoadModule fcgid_module modules/mod_fcgid.so
 
 <IfModule mod_fcgid.c>
    # メモリリークを防ぐための重要な設定
    # プロセスの生存時間を3600秒 (1時間) に設定
    # 長時間実行されているプロセスをクリーンアップして、メモリリークを防ぐ
    FcgidProcessLifeTime 3600
 
    # サーバリソースの制御 (高負荷環境ではFcgidMaxProcessesの値を増やすことを検討する)
    # 同時に実行可能な最大プロセス数を5に制限
    # サーバリソースの過剰使用を防ぐための重要な設定
    # 必要に応じてサーバスペックに合わせて調整可能
    FcgidMaxProcesses 5
 
    # メモリ管理とパフォーマンスのバランス (環境に応じて500〜5000の範囲で調整)
    # 1つのプロセスが処理できる最大リクエスト数を1000に設定
    # プロセスのメモリリークを防ぎ、定期的なプロセス再起動を強制
    # 値を小さくするとプロセスの再起動が頻繁になり、大きくするとメモリリークのリスクが増加
    FcgidMaxRequestsPerProcess 1000
 
    # レスポンス時間とリソース効率のトレードオフを制御 (メモリに余裕がある場合はFcgidMinProcessesPerClassを1以上に設定する)
    # クラスごとの最小プロセス数を0に設定
    # 必要な時のみプロセスを起動して、アイドル状態のプロセスを持たない
    # リソース効率を重視する場合は0、レスポンス時間を重視する場合は1以上を設定
    FcgidMinProcessesPerClass 0
 
    # 追加の推奨設定例:
 
    # プロセスのタイムアウト時間 (秒)
    #FcgidProcessConnectTimeout 20
 
    # IOタイムアウト時間 (秒)
    #FcgidIOTimeout 40
 
    # 1リクエストあたりの最大実行時間 (秒)
    #FcgidBusyTimeout 300
 
    # スクリプトのタイムアウト時間 (秒)
    #FcgidIdleTimeout 30
 
    # 最大リクエストサイズ (バイト)
    # アップロードサイズを制限することを推奨
    #FcgidMaxRequestLen 1073741824
 
    # エラーログの詳細レベル (debug, info, warn, error)
    #FcgidLogLevel error
 </IfModule>
 
 # 特定のディレクトリに対する個別の設定例
 #<Directory "/var/www/html/fcgi-bin">
 #    SetHandler fcgid-script
 #    Options +ExecCGI
 #    AllowOverride None
 #    Require all granted
 #</Directory>



CGIの設定

まず、/etc/apache2/default-server.confファイルに以下の赤字の設定を追記する。

# "/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ファイルのディレクトリのパスは、/srv/www/cgi-bin/である。

sudo vi /srv/www/cgi-bin/test1.cgi


 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を使用している。

 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 と入力する。
Webブラウザに"CGI Shell Web Site"と表示されていれば、正常に動作している。


Apache2の起動・停止・再起動

Apache2の起動は、以下のコマンドを実行する。

sudo systemctl start apache2


Apache2の停止は、以下のコマンドを実行する。

sudo systemctl stop apache2


Apache2の再起動は、以下のコマンドを実行する。

sudo systemctl restart apache2


Apache2の自動起動は、以下のコマンドを実行する。

sudo systemctl enable apache2



仮想ホストの構築 (パッケージ管理システムからApache2をインストールした場合)

このセクションでは、SUSEにおいて、仮想ホストの構築手順を記載する。

まず、/etc/apache2/vhosts.dディレクトリにアクセスする。
このディレクトリは、仮想ホストの設定ファイル(*.confファイル)を配置するディレクトリである。

# パッケージ管理システムからインストールした場合
cd /etc/apache2/vhosts.d


vhost.templateファイルをコピーして、vhost-sample.confファイルを作成する。
以下に示すように、vhost-sample.confファイルの内容を編集する。

以下の例では、1つ目の仮想ホストのドキュメントルートを/home/<ユーザ名>/htdocsディレクトリ、
2つ目の仮想ホストのドキュメントルートを/srv/www/htdocsディレクトリとしている。

# /etc/apache2/vhosts.d/vhost-localhost.confファイル
# 仮想ホスト1

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName localhost

   # DocumentRoot: The directory out of which you will serve your
   # documents. By default, all requests are taken from this directory, but
   # symbolic links and aliases may be used to point to other locations.
   DocumentRoot /srv/www/htdocs

   # if not specified, the global error log is used
   ErrorLog /var/log/apache2/localhost_error_log
   CustomLog /var/log/apache2/localhost_access_log combined

   # don't loose time with IP address lookups
   HostnameLookups Off

   # needed for named virtual hosts
   UseCanonicalName Off

   # configures the footer on server-generated documents
   ServerSignature On

   # Optionally, include *.conf files from /etc/apache2/conf.d/
   #
   # For example, to allow execution of PHP scripts:
   #
   # Include /etc/apache2/conf.d/php5.conf
   #
   # or, to include all configuration snippets added by packages:
   # Include /etc/apache2/conf.d/*.conf

   # ScriptAlias: This controls which directories contain server scripts.
   # ScriptAliases are essentially the same as Aliases, except that
   # documents in the realname directory are treated as applications and
   # run by the server when requested rather than as documents sent to the client.
   # The same rules about trailing "/" apply to ScriptAlias directives as to
   # Alias.
   #
   ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"

   # "/srv/www/cgi-bin" should be changed to whatever your ScriptAliased
   # CGI directory exists, if you have one, and where ScriptAlias points to.
   #
   <Directory "/srv/www/cgi-bin">
       AllowOverride None
       Options +ExecCGI -Includes
       AddHandler cgi-script .cgi .pl .py
       <IfModule !mod_access_compat.c>
           Require all granted
       </IfModule>
       <IfModule mod_access_compat.c>
           Order allow,deny
           Allow from all
       </IfModule>
   </Directory>

   # UserDir: The name of the directory that is appended onto a user's home
   # directory if a ~user request is received.
   #
   # To disable it, simply remove userdir from the list of modules in APACHE_MODULES
   # in /etc/sysconfig/apache2.
   #
   <IfModule mod_userdir.c>
       # Note that the name of the user directory ("public_html") cannot simply be
       # changed here, since it is a compile time setting. The apache package
       # would have to be rebuilt. You could work around by deleting
       # /usr/sbin/suexec, but then all scripts from the directories would be
       # executed with the UID of the webserver.
       UserDir public_html
       # The actual configuration of the directory is in
       # /etc/apache2/mod_userdir.conf.
       Include /etc/apache2/mod_userdir.conf
       # You can, however, change the ~ if you find it awkward, by mapping e.g.
       # http://www.example.com/users/karl-heinz/ --> /home/karl-heinz/public_html/
       #AliasMatch ^/users/([a-zA-Z0-9-_.]*)/?(.*) /home/$1/public_html/$2
   </IfModule>

   #
   # This should be changed to whatever you set DocumentRoot to.
   #
   <Directory "/srv/www/htdocs">
       #
       # Possible values for the Options directive are "None", "All",
       # or any combination of:
       #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
       #
       # Note that "MultiViews" must be named *explicitly* --- "Options All"
       # doesn't give it to you.
       #
       # The Options directive is both complicated and important.  Please see
       # http://httpd.apache.org/docs/2.4/mod/core.html#options
       # for more information.
       #
       Options Indexes FollowSymLinks

       #
       # AllowOverride controls what directives may be placed in .htaccess files.
       # It can be "All", "None", or any combination of the keywords:
       #   Options FileInfo AuthConfig Limit
       #
       AllowOverride None

       #
       # Controls who can get stuff from this server.
       #
       <IfModule !mod_access_compat.c>
           Require all granted
       </IfModule>
       <IfModule mod_access_compat.c>
           Order allow,deny
           Allow from all
       </IfModule>
   </Directory>
</VirtualHost>


# /etc/apache2/vhosts.d/vhost-example.confファイル
# 仮想ホスト2

<VirtualHost *:80>
   ServerAdmin webmaster@<サーバ名>
   ServerName <サーバ名>

   # DocumentRoot: The directory out of which you will serve your
   # documents. By default, all requests are taken from this directory, but
   # symbolic links and aliases may be used to point to other locations.
   DocumentRoot /home/<ユーザ名>/htdocs

   # if not specified, the global error log is used
   ErrorLog /home/<ユーザ名>/htdocs/error/error_log
   CustomLog /home/<ユーザ名>/htdocs/error/custom_log combined

   # don't loose time with IP address lookups
   HostnameLookups Off

   # needed for named virtual hosts
   UseCanonicalName Off

   # configures the footer on server-generated documents
   ServerSignature On

   # Optionally, include *.conf files from /etc/apache2/conf.d/
   #
   # For example, to allow execution of PHP scripts:
   #
   # Include /etc/apache2/conf.d/php5.conf
   #
   # or, to include all configuration snippets added by packages:
   # Include /etc/apache2/conf.d/*.conf

   # ScriptAlias: This controls which directories contain server scripts.
   # ScriptAliases are essentially the same as Aliases, except that
   # documents in the realname directory are treated as applications and
   # run by the server when requested rather than as documents sent to the client.
   # The same rules about trailing "/" apply to ScriptAlias directives as to
   # Alias.
   #
   ScriptAlias /cgi-bin/ "/home/<ユーザ名>/htdocs/cgi-bin/"

   # "/srv/www/cgi-bin" should be changed to whatever your ScriptAliased
   # CGI directory exists, if you have one, and where ScriptAlias points to.
   #
   <Directory "/home/<ユーザ名>/htdocs/cgi-bin">
       AllowOverride None
       Options +ExecCGI -Includes
       AddHandler cgi-script .cgi .pl .py
       <IfModule !mod_access_compat.c>
           Require all granted
       </IfModule>
       <IfModule mod_access_compat.c>
           Order allow,deny
           Allow from all
       </IfModule>
   </Directory>

   # UserDir: The name of the directory that is appended onto a user's home
   # directory if a ~user request is received.
   #
   # To disable it, simply remove userdir from the list of modules in APACHE_MODULES
   # in /etc/sysconfig/apache2.
   #
   <IfModule mod_userdir.c>
       # Note that the name of the user directory ("public_html") cannot simply be
       # changed here, since it is a compile time setting. The apache package
       # would have to be rebuilt. You could work around by deleting
       # /usr/sbin/suexec, but then all scripts from the directories would be
       # executed with the UID of the webserver.
       UserDir public_html
       # The actual configuration of the directory is in
       # /etc/apache2/mod_userdir.conf.
       Include /etc/apache2/mod_userdir.conf
       # You can, however, change the ~ if you find it awkward, by mapping e.g.
       # http://www.example.com/users/karl-heinz/ --> /home/karl-heinz/public_html/
       #AliasMatch ^/users/([a-zA-Z0-9-_.]*)/?(.*) /home/$1/public_html/$2
   </IfModule>

   #
   # This should be changed to whatever you set DocumentRoot to.
   #
   <Directory "/home/suse/htdocs">
       #
       # Possible values for the Options directive are "None", "All",
       # or any combination of:
       #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
       #
       # Note that "MultiViews" must be named *explicitly* --- "Options All"
       # doesn't give it to you.
       #
       # The Options directive is both complicated and important.  Please see
       # http://httpd.apache.org/docs/2.4/mod/core.html#options
       # for more information.
       #
       Options Indexes FollowSymLinks

       #
       # AllowOverride controls what directives may be placed in .htaccess files.
       # It can be "All", "None", or any combination of the keywords:
       #   Options FileInfo AuthConfig Limit
       #
       AllowOverride None

       #
       # Controls who can get stuff from this server.
       #
       <IfModule !mod_access_compat.c>
           Require all granted
       </IfModule>
       <IfModule mod_access_compat.c>
           Order allow,deny
           Allow from all
       </IfModule>
   </Directory>
</VirtualHost>


次に、IPアドレスと仮想ホストのサーバ名の名前解決を行うため、/etc/hostsファイルを編集する。

sudo vi /etc/hosts


/etc/hostsファイル

...略...

# Syntax:
#    
# IP-Address  Full-Qualified-Hostname  Short-Hostname
#

127.0.0.1   localhost
127.0.0.1   <仮想ホストのサーバ名>

...略...


仮想ホストの設定ファイル(*.confファイル)を反映させるため、Apache2を再起動する。

sudo systemctl restart apache2



仮想ホストの構築 (ソースコードからApache2をインストールした場合)

まず、/<Apache2のインストールディレクトリ>/conf/extraディレクトリに、.confファイル(ファイル名は任意)を作成して、上記のような内容を記述する。
なお/<Apache2のインストールディレクトリ>/conf/extraディレクトリは、仮想ホストの設定ファイル(*.confファイル)や他の設定ファイル等を配置するディレクトリである。

vi /<Apache2のインストールディレクトリ>/conf/extra/vhost_1.conf


# /<Apache2のインストールディレクトリ>/conf/extra/vhost_1.confファイル

# 上記のセクションで記述されているような仮想ホストのconfファイルの内容を記述する


作成した.confファイルをインクルードするため、/<Apache2のインストールディレクトリ>/conf/httpd.confファイルに以下の設定を追記する。

vi /<Apache2のインストールディレクトリ>/conf/httpd.conf


# /<Apache2のインストールディレクトリ>/conf/httpd.confファイル

# ...略

Include conf/extra/vhost_1.conf

# ...略


IPアドレスと仮想ホストのサーバ名の名前解決を行うため、/etc/hostsファイルを編集する。

sudo vi /etc/hosts


# /etc/hostsファイル

# ...略

# Syntax:
#    
# IP-Address  Full-Qualified-Hostname  Short-Hostname
#

127.0.0.1   localhost
127.0.0.1   <仮想ホストのサーバ名>

# ...略


仮想ホストの設定ファイル(*.confファイル)を反映させるため、Apache2を再起動する。

# Systemdサービスユニットを作成している場合
sudo systemctl restart httpd

# Systemdサービスユニットを作成していない場合
/<Apache2のインストールディレクトリ>/bin/apachectl start



HTTPS(SSL)の設定

CSRについて

CSR(Certificate Signing Request)とは、証明書発行要求といい、認証局に対して行う、認証局の秘密鍵で署名してもらうためのリクエストのことである。

CSRの中身を確認するためには、reqコマンドに-textオプションを付加することで確認できる。

openssl req -text -in <サーバ証明書のファイル名>.csr

# 出力例
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=TOKYO, L=KAWASAKI, O=Kaisha, OU=Busho, CN=common.name
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                (省略)
    Signature Algorithm: sha256WithRSAEncryption
               (省略)


上記の出力例において、[Signature Algorithm]項目は、sha256WithRSAEncryptionである。
SHA-1は解読されるリスクが高まっているため、今後作成するものはSHA-2とするべきである。

SHA-2には、SHA-224、SHA-256、SHA-384、SHA-512の4種類がある。
SHA-512が最も安全性が高いが、クライアント端末側がSHA-512に対応している必要がある。

自己証明書の発行(サーバ側)

秘密鍵を作成する。

openssl genrsa -out <秘密鍵のファイル名>.key 2048


作成した秘密鍵を使用して、CSRを作成する。

openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr


作成したCSRに署名を行って、サーバ証明書を発行する。
<サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、削除してもよい。

openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key -out <サーバ証明書のファイル名>.crt


秘密鍵のファイルのアクセス権限を変更する。

chmod 400 <秘密鍵のファイル名>.key


Webサーバに設置するものは、秘密鍵(.key拡張子)とサーバ証明書(.crt拡張子)の2つである。

SSLを有効にするため、Apache2のSSLの設定ファイルを編集する。

# パッケージ管理システムからインストールしている場合
sudo vi /etc/httpd/conf.d/ssl.conf

# ソースコードからインストールしている場合
sudo vi /<Apache2のインストールディレクトリ>/conf/extra/httpd-ssl.conf


 Listen 443
 NameVirtualHost *:443
 SSLStrictSNIVHostCheck off


次に、仮想ホストの設定ファイルを作成または編集する。

# パッケージ管理システムからインストールしている場合
sudo vi /etc/apache2/vhosts.d/vhost01.conf

# ソースコードからインストールしている場合
sudo vi /<Apache2のインストールディレクトリ>/conf/extra/httpd-vhosts.conf


 <VirtualHost *:443>
    DocumentRoot "<ドキュメントルートのパス>"
    ServerName <ホスト名またはIPアドレスまたはドメイン名 (例. www.sample.co.jp)>
    ServerAdmin <管理者のメールアドレス (例. webmaster@example.com)>  # この項目は任意である
    ServerAlias <サーバエイリアス名 (例. sample.co.jp)>              # この項目は任意である
 
    ErrorLog <エラーログファイルの絶対パスまたは相対パス>
    TransferLog <アクセスログファイルの絶対パスまたは相対パス>
    LogLevel warn
 
    SSLEngine on
    SSLProtocol all -SSLv2
 
    SSLCertificateFile <サーバ証明書ファイルのフルパス>
    SSLCertificateKeyFile <秘密鍵ファイルのフルパス>
    SSLCertificateChainFile <中間証明書ファイルのフルパス>            # 自己証明書の場合、この項目は不要である
 </VirtualHost>


ロードバランサにSSL証明書を設置して、SSL接続を終端することもできる。
その場合、サーバ証明書は1つ用意して、ロードバランサからWebサーバまでの通信はhttpとなる。(httpsでも可能であるが、httpの方が負荷が軽いため)

httpを使用するメリットとして、Webサーバで受けるアクセスがhttpとなるので負荷が減るためである。(暗号化された通信を複合するために、SSLの接続を受けるのは負荷が掛かる)

自己証明書の発行(クライアント側)

秘密鍵を作成する。

openssl genrsa -out <秘密鍵のファイル名>.key 2048


作成した秘密鍵を使用して、クライアント側のCSRを作成する。

openssl req -sha256 -new -subj "/C=JP/ST=Tokyo/L=Tokyo City/O=Company Name/OU=Department/CN=*.<ドメイン名>" \
                         -key <秘密鍵のファイル名>.key -out <CSRのファイル名>.csr


作成したCSRに署名を行って、サーバ証明書を発行する。
<サーバ証明書のファイル名>.csrファイルは、サーバ証明書を発行するためのファイルのため、削除してもよい。

openssl x509 -sha256 -req -days <証明書の有効日数 例. 3650> -in <CSRのファイル名>.csr -signkey <秘密鍵のファイル名>.key -out <サーバ証明書のファイル名>.crt


クライアントPCがWindowsの場合、Windows PCにインポートするには、サーバ証明書のファイル(.crt拡張子)をpkcs12形式に変換する必要がある。

openssl pkcs12 -export -inkey <秘密鍵のファイル名>.key -in <サーバ証明書のファイル名>.crt \
                       -out <クライアント側にインポートするサーバ証明書のファイル名>.p12 -name <任意の識別子名>


秘密鍵のファイルのアクセス権限を変更する。

chmod 400 <秘密鍵のファイル名>.key


CSRファイルは、サーバ証明書を発行するためのファイルであるため、削除してもよい。

サーバに設置するものは、サーバ証明書のファイル(.crt拡張子)と秘密鍵(.key拡張子)の2つである。
Windows PCへ配布するものは、pkcs12形式に変換したクライアント側のサーバ証明書のファイル(.p12拡張子)である。

Windows PCへクライアント側のサーバ証明書のファイル(.p12拡張子)をインポートする場合、ファイルを実行することによりインポート画面が起動するため、
インポート画面に沿って、サーバ証明書のファイル(.p12拡張子)をインポートする。

.htaccessの設定

必要ならば、httpプロトコルでアクセスがあった場合にhttpsプロトコルへリダイレクトする設定を行う。

ドキュメントルートの.htaccessファイルを作成または編集する。

sudo vi /<ドキュメントルートのディレクトリ>/.htaccess


# /<ドキュメントルートのディレクトリ>/.htaccess

RewriteEngine On

RewriteCond %{HTTP_HOST} ^sample\.co\.jp  # wwwありに統一する設定
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ http://www.sample.co.jp/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^sample\.co\.jp  # wwwありに統一する設定(SSL)
RewriteCond %{SERVER_PORT} 443
RewriteRule ^(.*)$ http://www.sample.co.jp/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.sample.co.jp/$1 [R=301,L]


なお、さくらインターネットのレンタルサーバにおいて、SSLを導入した場合は.htaccessファイルの設定が特殊である。

RewriteCond %{HTTP_HOST} ^sample\co\.jp$ [OR,NC]
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://www.sample.co.jp/$1 [R=301,L]


WordPressをSSL化する場合は、Wordpress-httpsプラグインを使用することもできる。


PHPのインストール

次に、PHPをインストールする。
PHPのインストール手順においては、インストール - PHPを参照すること。

PHPが正常に動作するかどうかを確認するため、/srv/www/htdocsディレクトリ(パッケージ管理システムからインストールした場合のデフォルト)に、
以下に示すようなPHPファイルを作成する。

sudo vi /srv/www/htdocs/index.php


 # /srv/www/htdocs/index.phpファイル
 
 <?php
   phpinfo();
 ?>


Webブラウザを起動して、http://localhost/index.php と入力する。
インストール済みのPHPの情報が表示されていれば、Apache2が正常に動作している。


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>