Ubuntu-server20.04にopenssl、apache2.4、php7.4をソースからビルドする。



今回の流れは大まかにOpenSSL、Apache Subversion、APR、APR-util、PCRE,、Apache2(httpd)、PHPの順です。適宜パッケージとビルドを使い分けていきます。

| 環境    |                     |
| ------- | ------------------- |
| OS      | Ubuntu server 20.04 |
| CPU     | Intel Core i5 2500  |
| メモリ  | 4GB(DDR3)           |
| Network | LAN                 |



| バージョン | 2020/09/01現在、最新 |
| ---------- | -------------------- |
| httpd      | 2.4.26               |
| OpenSSL    | 1.1.1g               |
| PHP        | 7.4.9                |



## 0.パッケージの追加と削除とPorgのインストール

```
sudo apt update -y && sudo apt upgrade -y
sudo apt install build-essential
sudo apt purge openssl
sudo apt purge apache2
```

ビルドインストールしたソフトウェアを管理できるPorgをインストールする。詳しくはこちらの記事をご覧ください。(https://qiita.com/ksugawara61/items/38fe9d8e2cc444639fe0)

最新:https://sourceforge.net/projects/porg/files/

```
cd /usr/local/src
sudo wget http://sourceforge.net/projects/porg/files/porg-0.10.tar.gz/download -O porg-0.10.tar.gz --no-check-certificate
sudo tar xvf porg-0.10.tar.gz && cd porg-0.10
sudo ./configure --prefix=/usr/local --disable-grop
sudo make && sudo install
```



## 2.zlibをインストールする。

最新:https://zlib.net/

```
cd /usr/local/src
sudo wget http://www.zlib.net/zlib-1.2.11.tar.gz
sudo tar xvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
sudo ./configure
sudo make
sudo porg -lD "make install"
```



## 3.OpenSSLをインストールする。

最新:https://www.openssl.org/source/

```
cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz 
sudo tar xvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
sudo ./config shared zlib
sudo make
sudo porg -lD "make install"
```



## 3.Apache subversionをインストールする。

今回はaprとapr-utilはapache subversionでソースをダウンロードすることにする。

まずApache subversionをインストールする。1

続いて、aprとapr-utilをダウンロードする。2と3

```
sudo apt install subversion (1)
sudo svn co https://svn.apache.org/repos/asf/apr/apr/branches/1.7.x/ apr (2)
sudo svn co https://svn.apache.org/repos/asf/apr/apr-util/branches/1.7.x/ apr-util (3)
```

**以下は推測ですが、**

（2はおそらく、必要なツールがインストールされているのか確認しているのだろうと思う。そうすることで、3でよくわからんエラーが出たけど結局必要なツールがインストールされてなかっただけでしたみたいなのが防げるのかもしれません。）



##4.aprをインストールする。1.7.x

最新:https://apr.apache.org/anonsvn.html

aprとapr-utilはマイナーバージョンを揃えると良いでしょう。

```
cd apr
sudo ./buildconf (2)
sudo ./configure (3)
sudo make
sudo porg -lD "make install"
```

例えば筆者の環境では2で次のように出力された。これを見ればどのツールが未インストールなのかがすぐに分かる。

```
buildconf: checking installation...
buildconf: python version 3.8.2 (ok)
buildconf: autoconf not found.
           You need autoconf version 2.59 or newer installed
           to build APR from SVN.
buildconf: libtool not found.
           You need libtool version 1.4 or newer installed
           to build APR from SVN.
```

`autoconf`と`libtool`が必要であることがわかる。ここでパッケージを使うかソースからビルドするか悩むところである。結局`autoconf`はパッケージ、`libtool`はソースからビルドすることにした。

```
sudo apt install autoconf

sudo tar xvf libtool-2.4.6.tar.gz
cd libtool-2.4.6
sudo ./configure
sudo make
sudo porg -lD "make install"
```

これでもう一度、2を実行してほしい、うまく行ったなら3を含めた3から先を実行してください。



## 5.apr-utilのインストール 1.7.x

最新:https://apr.apache.org/anonsvn.html

aprとapr-utilはマイナーバージョンを揃えると良いでしょう。

まず必要な`libexpat1-dev`パッケージをインストールする。

```
sudo apt install libexpat1-dev -y
```

それからビルドに進む。

```
cd apr-util
sudo ./buildconf
sudo ./configure --with-apr=/usr/local/apr
sudo make
sudo porg -lD "make install"
```




## 6.pcreのインストール

最新:https://www.pcre.org/

pcre2ではなくpcreであることに注意！

```
cd /usr/local/src
sudo wget ftp://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
sudo tar xvf pcre-8.44.tar.gz
cd pcre-8.44
sudo ./configure
sudo make
sudo make install
```



## 7.Apache2(httpd)のインストール

最新:https://httpd.apache.org/download.cgi

```
cd /usr/local/src
sudo apt install libxml2-dev
sudo wget https://downloads.apache.org//httpd/httpd-2.4.46.tar.gz --no-check-certificate
sudo tar xvf httpd-2.4.46.tar.gz
cd httpd-2.4.46

sudo ./configure --enable-ssl --enable-mods-shared=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr/bin/apu-1-config --with-pcre=/usr/local/pcre-8.44 --with-ssl=/usr/local/ssl  --enable-shard=ssl

sudo make

sudo porg -lD "make install"
```

最後に出てくる、次のうようなもので各ディレクトリが分かるので確認しておく。

```
.
.
.
Installing configuration files
mkdir /usr/local/apache2/conf （設定ファイル）
.
.
.
Installing HTML documents 
mkdir /usr/local/apache2/htdocs (ドキュメントルート)
.
.
.
```



##8. PHP7.4.9のインストール

最新:https://www.php.net/downloads

```
cd /usr/local/src
sudo wget https://www.php.net/distributions/php-7.4.9.tar.gz --no-check-certificate
sudo tar xvf php-7.4.9.tar.gz
cd php-7.4.9
```

ここから`./configure`のオプションをリストします。

1. `--prefix=/opt/php-x.x.x`:PHPのインタプリタやライブラリをどこにインストールするか。PHP単体で使うときなどのbinがここに来ます。

2. `--with-apxs2`:Apache2に関する情報を返してくれるスクリプトをします。PHPはApache2に組み込んで使うので必要になります。

3. `--enable-mbstring`:日本語はマルチバイト文字であり、PHPのコアはマルチバイト文字対応ではないので思いもよらぬ起きたら困るので指定します。

4. `--enable-intl`:ロケール関連のさまざまな操作を行えるようにします。   フォーマット、音訳、エンコード変換、カレンダーの処理、UCA準拠の照合順序 (collation)、   テキストの区切り、ロケール識別子やタイムゾーンや書記素を用いた操作などが可能です。とPHPマニュアルにあります。有効にします。`

5. `--enable-bcmath`:対話モードで、誤差なく数値計算を行うために有効にします。

6. ~~`--with-pcre-dir`:Apache2のビルドに使った、pcreと同じものを指定します。~~

7. `--with-readline`:これをしてするとPythonのように対話モードのインタプリタがPHPで使えるようになります。

8. `--with-libxml-dir`:これはXML処理に関するライブラリの場所を指定するものです。標準で有効ですが後コンフィグオプションを見たときにひと目でどのライブラリでビルドしたかを分かるように指定しておきます。

##### PHPでこれからMySQLを扱うことがあるかと思います。PHPではPDOを用いたMySQLの操作を推奨しています。なのでPDOを用いてMySQLを扱えるように次を指定します。

PDOは今までそれぞれのデータベース用に用意された別々の関数を用いて、データベースを扱っていたので、MySQLの用に書かれたプログラムは大幅に書き換えなければPostgreSQL用にはできませんでした。

しかし各データベースの違いを収集し、画一的に扱えるPDOを用いることで、同じ関数で各データベースを操作できるようになります。PDOを用いてデータベースを扱うにはPDOエクステンションとPDOが用いる各データベースのドライバが必要です。

9. `--with-pdo-mysql`:PDOエクステンションは標準で有効なので、PDOエクステンションが使用する、MySQLドライバをこれで指定します。ちなみにこれにはMySQL Native Driver(mysqlnd)を指定します。MySQL以外を扱うのであれば、次を参照してください。(https://www.php.net/manual/ja/pdo.drivers.php)

10. `--with-zlib`と`--with-zlib-dir`:OpenSSLでも用いた、（そしてMySQLのビルドでも用いる）zlibを指定します。pdo-mysqlを用いるには必要です。

11. `--enable-gd`:GDサポートを有効にします。jpegとpngを扱えるように、

    `sudo apt install libpng-dev libjpeg-dev`

12. `--with-freetype`:freetype2を有効にします。

    `sudo apt install freetype-dev`

13. `--with-openssl`:PHPからもOpenSSLを利用できるように、OpenSSLのインストールディレクトリを指定します。

14. `with-sodium`:削除された、mcryptの代わりにこれを有効にします。

以上です。次に必要なパッケージのインストールをします。(x)の数字は上のどのエクステンションで必要かを表しています。

```
sudo apt install libicu-dev (4)
sudo apt install libreadline-dev (7)
sudo apt install libxml2-dev (8)
sudo apt install libpng-dev libjpeg-dev (11)
sudo apt install libfreetype-dev (12)
sudo apt install libsodium-dev (14)
sudo apt install libsqlite3-dev libonig-dev
```

まとめ

```
sudo ./configure \
--prefix=/opt/php-7.4.9 \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-mbstring \
--enable-intl \
--enable-bcmath \
--with-pcre-regex=/usr/local/lib \
--with-readline \
--with-libxml=/usr/bin/xml2-config \
--with-pdo-mysql=mysqlnd \
--with-zlib=/usr/local \
--with-zlib-dir=/usr/local \
--enable-gd \
--with-freetype \
--with-openssl=/usr/local/ssl \
--with-openssl \
--with-sodium
```

ここから、

```
sudo make 
sudo porg -lD "make install"
```



## 稼働の確認

#### 1.httpd.confファイル

apache2のビルドの最後で確認した、設定ファイルのディレクトリ内の`httpd.conf`が設定ファイルです。

`/usr/local/apache2/conf/httpd.conf`の`LoadModule php7_module        modules/libphp7.so`という記述でApacheとは別にビルドしたPHPのApacheモジュールの組み込みを行っています。

そして、Apache2にPHPを実行させるにはもう一つ設定が必要です。このままでは、`.php`にリクエストが来てもテキストファイルのように`.php`ファイルを返してしまいます。そこで、リクエストされたファイルが`xxxx.php`ならきちんと実行されるように、次のような記述を加えます。

```
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
```

(https://www.atmarkit.co.jp/ait/articles/1112/12/news118.html) より。

これで実行する準備は整いました。

`/usr/local/apache2/htdocs`下につぎのPHPファイルを作成しましょう。

```info.php
<?php
  phpinfo()
?>
```

Apache2(httpd)の稼働に関する各種コマンドは次の通りです。

| Apache2(httpd) |                                                 |
| -------------- | ----------------------------------------------- |
| 稼働開始       | `sudo /usr/local/apache2/bin/apachectl start`   |
| 再起動         | `sudo /usr/local/apache2/bin/apachectl restart` |
| 稼働停止       | `sudo /usr/local/apache2/bin/apachectl stop`    |

`ifconfig`(`sudo apt install net-tools`で利用可能です。)などで、サーバーのプライベートIPアドレスをしらべて同じネットワーク内のコンピュータから、`http://192.168.x.x/info.php`にアクセスしてください。きちんとconfigureの設定が反映されているか確認してください。



## サマリー

これでこの記事でインストールするものはインストールし終えました。`porg -a`を用いて、ここまでビルドしたものを確認したいと思います。

```
>porg -a
apr
apr-util
httpd-2.4.46
libtool-2.4.6
openssl-1.1.1g
pcre-8.44
php-7.4.9
zlib-1.2.11
```

#### 参考

https://www.atmarkit.co.jp/ait/series/2540/

https://qiita.com/ksugawara61/items/70f5d1faf192c4ba6ca0



## おまけ - React-Appの環境を構築し、Hello, Worldをブラウザに表示させる。

Node.jsとNPMをインストールする。

```
sudo apt install npm nodejs -y
sudo npminstall -g n
sudo n stable
sudo apt purge nodejs npm -y
reboot

node -v
npm -v
```

`npm no such file or ...`と出る場合は、`reboot`した後に`echo export PATH=/usr/local/bin/:\$PATH >> ~/.bashrc`としてください。

n stable error 参考:(https://stackoverflow.com/questions/36494336/npm-install-error-unable-to-get-local-issuer-certificate)

ここから速く進めます。詳しくは、(https://qiita.com/Suzukaze31/items/3cd7054dd7749d79eb70) を。

```
mkdir /usr/local/apache2/htdocs/react-app
chown USER_NAME:USER_NAME -R /usr/local/apache2/htdocs/react-app

npm init -y

sudo npm i -g react react-dom @babel/core @babel/cli @babel/preset-env @babel/preset-react webpack webpack-cli webpack-dev-server babel-loader css-loader style-loader html-webpack-plugin

npm i -save react react-dom
npm i --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react webpack webpack-cli webpack-dev-server babel-loader css-loader style-loader html-webpack-plugin

touch webpack.config.js
mkdir src && cd src
touch index.html index.js App.js
```



index.html

```
<!DOCTYPE html>

<head>
    <meta charset="utf-8">
</head>
<body>
    <div id="root"></div>
</body>
```



index.js

```
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));
```



App.js

```
import React from 'react';

function App() {
    return <h1>Hello, World</h1>;
}

export default App;
```



webpack.config.js

```
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    mode: 'development',
    output: {
        path: path.resolve(__dirname, './'),
        filename: 'bundle.js',
    },
    module: {
        rules: [
            {test: /\.(js)$/, use: 'babel-loader'},
            {test: /\.css$/, use: ['style-loader', 'css-loader']}
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'src/index.html'
        })
    ]
}
```



package.json

```
 ...
  "babel":{
    "presets" : [
      "@babel/preset-env",
      "@babel/preset-react"
    ]
  },
  "scripts": {
    "build-react-app": "webpack",
    "start": "webpack-dev-server --open"
},
...
```



これで、webpackを実行する。

```
cd /usr/local/apache2/htdocs/react-app
npm run build-react-app
```

`http://192.168.x.x/react-app/`にウェブブラウザでアクセスしてください。HelloWorldが表示されればOKです。