Help us understand the problem. What is going on with this article?

LinuxでApache2.4(httpd 2.4.43)+PHP7.4をソースコンパイルしてWebサーバー構築 - 1.Apache導入編

前提と準備

Linuxサーバー構築の記事

最初に個人経営や中小企業から、PCのファイルを共有することから、中古PCでもラズパイでも小さなPCでサーバー構築できるものとして、まずはSambaを使ってファイルサーバーを構築してみましたが、今回はApacheでWebサーバーで構築します(⑅•ᴗ•⑅)

ソースコードでコンパイルする意味

Apacheをどのディストリビューションでも同じように設定しやすいし、必要なバージョンを用意できるからです(パッケージの標準コマンドだけだと、そのディストリビューションのバージョンで変動する)。

しかし全部のパッケージをソースコンパイルすると、その大本のライブラリを全部探し回ることになるので、ApacheやPHPなど、どうしても固定して稼働したいものに限って、ソースコンパイルし、makeに必要なものについては、dnfやaptなどの標準パッケージコマンドで対応しています

環境

  • Webサーバープログラム:Apache 2.4.43(ソースコンパイル)
  • クライアント:Windows10 Pro
  • サーバーのアーキテクチャ:x64(動作はHyper-Vの第2世代で確認) Linuxのディストリビューション:CentOS 8.1 / openSUSE 15.1 Leap / Ubuntu 20.04(すべて64bit)

前提

  • OSは最小限のインストール。また、最新の状態でOSをアップデートしていること
  • ユーザーはrootでインストール(私の検証ではadminという管理者アカウントにて、そこからsudoで処理しています)
  • どのディストリビューションでも、ファイアウォールはfirewalldを使う(ディストリビューション独自のファイアウォールコマンドは使用しない)
  • CentOSについては、SELinuxを無効(/etc/selinux/config編集後は再起動も必要)。
CentOS8.1
# vi /etc/selinux/config
/etc/selinux/config
SELINUX=disabled
CentOS8.1
# reboot

サーバー条件

IPアドレス

  • クライアント:192.168.1.11
  • Webサーバー:192.168.1.18(どのディストリビューションでも同じIPアドレスで検証)
  • 所属ネットワークセグメント:192.168.1.0/24 Webサーバー.png

パッケージを個別ダウンロードしてインストールする機能とバージョン(2020年6月時点)

  • zlib-1.2.11.tar.gz
  • apr-1.7.0.tar.gz
  • apr-util-1.6.1.tar.gz
  • mysql80-community-release-el8-1.noarch.rpm (CentOS 8.1)
  • mysql80-community-release-sl15-3.noarch.rpm (openSUSE 15.1)
  • mysql-apt-config_0.8.15-1_all.deb (Ubuntu 20.04)
  • oniguruma-devel-6.8.2-1.el8.x86_64.rpm (CentOS 8.1)
  • httpd-2.4.43.tar.gz
  • php-7.4.6.tar.gz

それ以外の必要なパッケージは、ディストリビューションの標準パッケージコマンド(dnfやaptなど)でインストールし、個別ダウンロードは不要です。

ダウンロードについては、公式サイトにアクセスして、そこからダウンロードしてFTPで転送するか、ダウンロードファイルのURLさえわかれば、wgetで入手することもできますが、入手方法は省略しています。

作業手順

準備

makeやcmake、パッケージ解凍機能のインストール

CentOS8.1
# dnf -y install make cmake tar bzip2
openSUSE15.1
# zypper -n install make cmake tar bzip2
Ubuntu20.04
# apt-get -y install make cmake tar bzip2

GCCとC++コンパイラのインストール

CentOS8.1
# dnf -y install gcc gcc-c++
openSUSE15.1
# zypper -n install gcc gcc-c++
Ubuntu20.04
# apt-get -y install gcc build-essential

zlibのソースインストール

zlibの配置場所はデフォルトのまま変えないでインストールしました。

# cd [zlibの書庫ファイルが置いてあるディレクトリ]
# tar zxvf zlib-1.2.11.tar.gz
# cd zlib-1.2.11/
# ./configure
# make
# make install

Apacheをコンパイルするために必要なパッケージをディストリビューション標準パッケージコマンドでインストール

PerlやSSLのライブラリなどをインストールすることで、Apacheで必要な機能をそろえることができます
注意:面倒くさくても実行しないと、パッケージがない、とエラーが出てコンパイルが中止されるんです(´•ω•̥`)

CentOS8.1
# dnf -y install ncurses-devel perl libaio libaio-devel perl-Data-Dumper expat-devel pcre pcre-devel openssl-devel
openSUSE15.1
# zypper -n install ncurses-devel perl libaio1 libaio-devel perl-Data-Dump libexpat-devel pcre pcre-devel libopenssl-devel
Ubuntu20.04
# apt-get -y install libncurses5-dev perl libaio1 libaio-dev libexpat1-dev libpcre3 libpcre3-dev libssl-dev

APRとそのユーティリティーライブラリをインストール

APRは/opt/apr-1.7.0に、APR-Utilは/opt/apt-util-1.6.1にライブラリをインストールします

# cd [apr-1.7.0.tar.gzが置いてあるディレクトリ]
# tar xvzf apr-1.7.0.tar.gz
# cd apr-1.7.0/
# ./configure --prefix=/opt/apr-1.7.0
# make
# make install

# cd [apr-util-1.6.1.tar.gzが置いてあるディレクトリ]
# tar xvzf apr-util-1.6.1.tar.gz
# cd apr-util-1.6.1/
# ./configure --prefix=/opt/apr-util-1.6.1 --with-apr=/opt/apr-1.7.0
# make
# make install  

Apache 2.4のソースコンパイルのインストール

さて、ここからが本番です。この作業は結構時間がかかりました(私のPCのHyper-Vで、たぶん20分かな)

configureとmake

# cd [httpd-2.4.43.tar.gzが置いてあるディレクトリ]
# tar xvzf httpd-2.4.43.tar.gz
# cd httpd-2.4.43/
# ./configure --with-apr=/opt/apr-1.7.0 --with-apr-util=/opt/apr-util-1.6.1 --enable-so --enable-ssl --enable-mods-shared=all --enable-mpms-shared=all

そこで、configureの指定として、APRとAPR-Utilのパスは、インストールで指定したパスを指定します。ここではAPRは「/opt/apr-1.7.0」に、APR-Utilは「/opt/apr-util-1.6.1」にインストールしていて、それ使いました。

またSSLを有効にしています。

※ もしOpenSSLのパスを変えるには「--with-ssl=/usr/local/ssl」のように、インストール先を指定するのですが、私の環境ではOpenSSLはパッケージデフォルトのものを使っているので、特に変えていません。

私は上記の必要なパッケージをすべてインストールしたところ、エラーなくconfigureできました(*´꒳`*)さて、肝心なコンパイルとインストールです。そこでエラーが出たら、ただでさえ機能てんこ盛りなApacheなので、どこでエラーが出たかを探し回ると面倒です( ˙꒳​˙ᐢ )

# make
# make install

エラーなくコンパイルできれば、インストールは完了です♪(*˘︶˘*).。.:*♡

Apacheの環境設定

インストールできたら、さぁ次は設定ファイルです( ˙꒳​˙ᐢ )
ソースコンパイルでApacheをインストールすると、Apache本体は/usr/local/apache2にインストールされます。設定ファイルは/usr/local/apache2/conf/に格納されるので、その中にApacheの環境設定を行います。

[Apacheの基本設定]
# vi /usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
#ServerName www.example.com:80
ServerName localhost:80   ← この行を↑の直下に追記します
…
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
    …
    Options Indexes FollowSymLinks
    ↑ 先頭に「#」を付けてコメントアウトします
   (ページとして公開されてないディレクトリは無駄なアクセスを許可しないこと)
…
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule ssl_module modules/mod_ssl.so
 ↑の2つの行を探して、いずれも「#」を消して、soライブラリを読み込みます
#Include conf/extra/httpd-ssl.conf
 ↑の「#」を消して、conf/extra/httpd-ssl.confを読み込めるようにします
[ApacheのSSL(https)の設定]
# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
/usr/local/apache2/conf/extra/httpd-ssl.conf
SSLCertificateFile "/usr/local/apache2/conf/server.crt"SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

ここでは、httpsに必要な鍵の場所は、設定ファイルと同じ/usr/local/apache2/conf/に位置することにしました。

SSL証明書作成

本来は証明書をルート認証機関を経由しての作成ですが、ここではあくまでもApacheをhttpsに対応させる手法を優先させるので、証明書の発行機関は触れません。なのでアクセスするとセキュリティの警告は出ます【。。。】

# cd /usr/local/apache2/conf/
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -out server.csr

SSL鍵を作成するプロセスで、組織のプロフィールを入力する対話もありますが、以下の入力で問題なく証明書は作成できます

# openssl req -new -key server.key -out server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:<what entry=住んでいる都道府県 example=Kanagawa>
Locality Name (eg, city) [Default City]:<what entry=住んでいる市町村 example=Miura>
Organization Name (eg, company) [Default Company Ltd]:<what entry=任意の組織名>
Organizational Unit Name (eg, section) []:<what entry=任意の組織単位>
Common Name (eg, your name or your server's hostname) []:<what entry=ドメイン名 example=kazumi-jam.chips.jp>
Email Address []:<what entry=メールアドレス example=rei@example.com>

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<what entry=とりあえず適当>
An optional company name []:<what entry=とりあえず空白Enter>

わかりやすく色分けしたいので、XML風に「何を入力すればいいか」を付け加えてみました(*˘︶˘*) XMLタグ風に「<what entry=…」となっているのは、何を入力すればいいのか「example=…」は入力の例です。なお実際は空白が入っていてもかまいません。

例:
State or Province Name (full name) []: Kanagawa Pref.
Locality Name (eg, city) [Default City]: Miura city

server.csrを作成し終えたら、証明書一式を作成します。

# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

「-days」オプションがないと90日間しか有効期間がないので実験目的以外では使い物になりません。なのでここでは一応10年間として「-days 3650」としています。それでも証明書自体がオレオレ証明書で信頼された機関から発行されたものではないですが…(*˘ᗜ˘*;)

さて、SSL証明書を作成したら、他の人に触れないように、パーミッションを変更します。

# chmod 600 /usr/local/apache2/conf/server.crt
# chmod 600 /usr/local/apache2/conf/server.csr
# chmod 600 /usr/local/apache2/conf/server.key
# ls -l /usr/local/apache2/conf/
合計 108
drwxr-xr-x 2 root root   313  6月 24 13:08 extra
-rw-r--r-- 1 root root 19316  6月 24 13:07 httpd.conf
-rw-r--r-- 1 root root 13064  6月 24 13:03 magic
-rw-r--r-- 1 root root 60847  6月 24 13:03 mime.types
drwxr-xr-x 3 root root    37  6月 24 13:03 original
-rw------- 1 root root  1379  6月 24 13:06 server.crt
-rw------- 1 root root  1119  6月 24 13:04 server.csr
-rw------- 1 root root  1675  6月 24 13:03 server.key

「ls -l」コマンドで、「server.crt」など証明書鍵関連の3ファイル(上のリストだと下3行)が、所有者rootでパーミッションが「rw-------(600)」であることを確認します。秘密鍵の中身が他のユーザーから見える時点でセキュリティ違反ですからね。。

Apacheサービスの起動

Apacheサービスの起動スクリプト作成&有効化

Apacheに必要な環境設定と鍵はそろいました。なので、起動できるようにしたいと思います。起動スクリプトはSystemdなので、/etc/systemd/systemに作成します

# cd /etc/systemd/system
# vi httpd.service
httpd.service
[Unit]
Description=Apache

[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecStop=/usr/local/apache2/bin/apachectl stop

[Install]
WantedBy=multi-user.target

ここではSystemdのスクリプトは詳しく説明しませんが、Apacheの起動ファイル本体は/usr/local/apache2/binにあるので、その中のApacheサービス起動の「apachectl」をコマンド実行することで、Apacheの起動や停止ができます。また起動と実行は、Apacheの場合は、Webサーバーのプロセスはサブプロセスとして実行される(要は、ある端末で起動実行すると「実行中」の状態になって他の操作ができなくなるのではなく、コマンド入力に戻って他の操作をそのまま実行できる。わかるかな??)ので、Typeはforkingを指定します。

firewalldの設定

続いて、firewalldの設定で、ポート80(http)と443(httpd)を受け付けます。
なお、前提の通り、サーバーとクライアントは192.168.1.0/24のネットワークに属しているので、それ以外の外部からのアクセスは受け付けないので、以下のようにrich ruleで許可します。

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="443" protocol="tcp" accept'
# firewall-cmd --reload

起動と動作確認

それでは、起動します。enableでの常時起動有効化&statusで「Active」「Running」になっていることを確認。

# systemctl start httpd
# systemctl enable httpd
# systemctl status httpd

apachect.png
上記の写真のようになれば、起動成功です。
Windowsクライアント側から、ブラウザでhttps://[LinuxサーバーのIPアドレス]/を入力して確認します。

ここではLinuxのWebサーバーは192.168.1.18なので、https://192.168.1.18にて。
もちろん証明書は信頼された機関発行ではないので、プライバシーエラーになります;;その際は「そのままアクセスする」を選んで先に進みます(ChromeやFirefoxでふるまいは違うけど。。)

itwks.png

成功しました!!( ˶˙ᵕ˙˶ )

次回

PHPを導入して、Webアプリサーバーの基盤を掲載します

kazumi75kitty
三崎人りらぽ♥の大学院や業務などで培った電子回路、C言語・Javaなど、LinuxなどのOSをはじめ、中小企業や個人・地元経済においても、技術ベースでセキュア&安価な単価で実現をしやすいシステム構築を研究中( ˙꒳​˙ᐢ )脱・大企業独占を目指す!
https://chips-kazumi-jam.ssl-lolipop.jp/yokosuka/photo_001
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした