著者は、Write for DOnationsプログラムの一部として100ドルの寄付を受け取るためにApache Software Foundationを選択しました。
前書き
LEMPソフトウェアスタックは、サーバーが動的なWebサイトおよびWebアプリをホストできるようにするために通常一緒にインストールされるオープンソースソフトウェアのグループです。 この用語は、実際にはLinuxオペレーティングシステムを表す頭字語であり、ENginx Webサーバー(LAMPスタックのApacheコンポーネントを置き換える)を備えています。 サイトデータは(MariaDBを使用して)MySQLデータベースに保存され、動的コンテンツはPHPによって処理されます。
LEMPスタックコンポーネントは、CentOS 7EPEL repositoryを使用してインストールされる場合があります。 ただし、このリポジトリには古いパッケージが含まれています。 たとえば、このリリースがfor a long timeでサポートされていなくても、EPELから5.4.16より古いバージョンのPHPをインストールすることはできません。 ソフトウェアの新しいバージョンを入手するには、SCLとも呼ばれるソフトウェアコレクションを使用することをお勧めします。 SCLは、RedHatが提供する開発者リソースのコレクションであり、以前にインストールしたパッケージに影響を与えることなく、同じシステムでソフトウェアの複数のバージョンを使用できます。
このガイドでは、CentOS 7サーバーにLEMPスタックをインストールします。 CentOSオペレーティングシステムがLinuxコンポーネントを処理します。 Software Collectionsリポジトリを使用して残りのコンポーネントをインストールし、単純なWebページを提供するように構成します。
前提条件
このチュートリアルを開始する前に、sudo非rootユーザーを含むthe CentOS 7 initial server setup guideに従ってCentOS7サーバーをセットアップする必要があります。
[[step-1 -—- enable-the-software-collections-repository]] ==ステップ1—ソフトウェアコレクションリポジトリを有効にする
CentOSのSCLにアクセスするには、CentOS Linux Software Collectionsリリースファイルをインストールします。
sudo yum install centos-release-scl
次のコマンドを使用して、使用可能なSCLパッケージのリストを表示します。
yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available
システム全体の競合を回避するために、SCLパッケージは/opt/rh
ディレクトリにインストールされます。 これにより、たとえば、Python 2.7を削除したり干渉したりすることなく、CentOS 7マシンにPython 3.5をインストールできます。
SCLパッケージのすべての構成ファイルは、/etc/opt/rh/
ディレクトリ内の対応するディレクトリに保存されます。 SCLパッケージは、PATH
、LD_LIBRARY_PATH
、MANPATH
など、含まれているアプリケーションの使用に必要な環境変数を定義するシェルスクリプトを提供します。 これらのスクリプトは、/opt/rh/package-name/enable
としてファイルシステムに保存されます。
これで、このガイドで概説したパッケージのインストールを開始する準備が整いました。
[[step-2 -—- installing-the-nginx-web-server]] ==ステップ2— NginxWebサーバーのインストール
Webページを訪問者に表示するために、最新の効率的なWebサーバーであるNginxを採用します。
次のyum
コマンドを使用してNginxをインストールします。 強調表示された値を、インストールするNginxのバージョンに必ず置き換えてください。最新バージョンでは、パッケージ名の番号が最も大きくなります(この記事の執筆時点では112
)。
sudo yum install rh-nginx112
インストールが完了したら、Nginxサービスを開始します。
sudo systemctl start rh-nginx112-nginx
systemctl status
コマンドを入力して、Nginxが実行されていることを確認します。
sudo systemctl status rh-nginx112-nginx
Output● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago
Main PID: 10556 (nginx)
CGroup: /system.slice/rh-nginx112-nginx.service
├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx
├─10557 nginx: worker process
└─10558 nginx: worker process
Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok
Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful
Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.
この時点で、サーバーは不正ユーザーによる不正アクセスに対して脆弱になる可能性があります。 これを修正するには、firewalldを使用してファイアウォールを設定します。 最初にfirewalldをインストールする必要がある場合がありますが、これは次のコマンドで実行できます。
sudo yum install firewalld
次に、firewalldサービスを開始します。
sudo systemctl start firewalld
次に、ファイアウォールルールを追加して、サーバーへのSSHアクセス、およびNginxへのHTTPおよびHTTPS接続を許可します。
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --zone=public --permanent --add-service=https
firewalldをリロードして、新しいファイアウォールルールを実装します。
sudo firewall-cmd --reload
How To Set Up a Firewall Using FirewallD on CentOS 7でfirewalldの詳細をご覧ください。
これらの新しいファイアウォールルールを追加したら、ウェブブラウザでサーバーのドメイン名またはパブリックIPアドレスにアクセスして、サーバーが稼働しているかどうかをテストできます。
サーバーを指すドメイン名がなく、サーバーのパブリックIPアドレスがわからない場合は、端末に次のように入力して見つけることができます。
curl -4 icanhazip.com
結果のIPアドレスをWebブラウザーのアドレスバーに入力すると、Nginxのデフォルトのランディングページが表示されます。
http://server_domain_or_IP
このページが表示されたら、Nginxが正常にインストールされています。 続行する前に、次のコマンドを使用して、起動時にNginxを有効にします。
sudo systemctl enable rh-nginx112-nginx
Nginxサーバーがインストールされ、MariaDBデータベースソフトウェアのインストールに進むことができます。
[[step-3 -—- installing-mariadb-to-manage-site-data]] ==ステップ3—サイトデータを管理するためのMariaDBのインストール
Webサーバーができたので、サイトのデータを保存および管理するために、MySQLのドロップイン代替品であるMariaDBをインストールします。
次のコマンドでMariaDBをインストールします。 繰り返しますが、強調表示された値を、インストールするバージョン番号に置き換えます。最大の番号は、利用可能な最新バージョン(この記事の執筆時点では、102
)です。
sudo yum install rh-mariadb102
インストールが完了したら、次のコマンドでMariaDBサービスを開始します。
sudo systemctl start rh-mariadb102-mariadb
これで、MariaDBがインストールされ実行されます。 ただし、構成はまだ完了していません。
インストールをセキュリティで保護するために、MariaDBにはセキュリティスクリプトがインストールされています。セキュリティスクリプトは、セキュリティで保護されていないデフォルト設定の変更を求めるプロンプトを表示します。 次のように入力してスクリプトを実行します。
source /opt/rh/rh-mariadb102/enable
mysql_secure_installation
プロンプトが表示され、現在のルートパスワードが求められます。 MySQLをインストールしたばかりなので、MySQLがない可能性が高いので、ENTER
を押して空白のままにします。 次に、rootパスワードを設定するかどうかを尋ねるプロンプトが表示されます。 先に進み、Y
と入力して、指示に従います。
. . .
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorization.
Set root password? [Y/n] Y
New password: password
Re-enter new password: password
Password updated successfully!
Reloading privilege tables..
... Success!
. . .
残りの質問では、各プロンプトでENTER
キーを押して、デフォルト値を受け入れます。 これにより、一部の匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効になり、MariaDBが行った変更がすぐに実装されるようにこれらの新しいルールがロードされます。
ここで最後に行うことは、MariaDBが起動時に起動できるようにすることです。 これを行うには、次のコマンドを使用します。
sudo systemctl enable rh-mariadb102-mariadb
この時点で、データベースシステムがセットアップされ、サーバーでのPHPのセットアップに進むことができます。
[[step-4 -—- installing-and-configuring-php-for-processing]] ==ステップ4—PHPのインストールと処理用の構成
ページを提供するためにNginxがインストールされ、データを保存および管理するためにMariaDBがインストールされました。 ただし、動的コンテンツを生成できるものはまだインストールされていません。 これがPHPの出番です。
Nginxには他のWebサーバーのようなネイティブPHP処理が含まれていないため、「fastCGIプロセスマネージャー」を表すphp-fpm
をインストールする必要があります。 後で、処理のためにこのソフトウェアにPHPリクエストを渡すようにNginxを構成します。
このモジュールをインストールし、PHPがデータベースバックエンドと通信できるようにするヘルパーパッケージも取得します。 インストールにより、必要なPHPコアファイルが取り込まれます。 次のように入力してこれを行います。
sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd
これでPHPコンポーネントがインストールされましたが、セットアップのセキュリティを強化するために少し構成を変更する必要があります。
メインのphp.ini
構成ファイルをroot特権で開きます。
sudo vi /etc/opt/rh/rh-php71/php.ini
このファイルで、cgi.fix_pathinfo
を設定するパラメーターを探します。 これはセミコロン(;)でコメント化され、デフォルトで「1」に設定されます。
これは、要求されたPHPファイルが見つからない場合に見つけることができる最も近いファイルを実行しようとするようにPHPに指示するため、非常に安全でない設定です。 これにより基本的に、ユーザーは実行を許可されないスクリプトを実行できるようにPHPリクエストを作成できます。
行のコメントを外し、次のように「0」に設定することにより、これらの条件の両方を変更します。
71/php.ini’>/etc/opt/rh/rh-php71/php.ini
cgi.fix_pathinfo=0
終了したら、ファイルを保存して閉じます(ESC
を押し、:wq
と入力してから、Enter
を押します)。
次に、php-fpm構成ファイルwww.conf
を開きます。
sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf
デフォルトでは、このファイルはApacheサーバーで動作するように構成されています。 サーバーにはNginxがインストールされているので、user
とgroup
を設定する行を見つけて、それらの値を「apache」から「nginx」に変更します。
71/php-fpm.d/www.conf’>/etc/opt/rh/rh-php71/php-fpm.d/www.conf
user = nginx
group = nginx
次に、ファイルを保存して閉じます。
次に、次のように入力してPHPプロセッサを起動します。
sudo systemctl start rh-php71-php-fpm
次に、php-fpmを有効にしてブート時に開始します。
sudo systemctl enable rh-php71-php-fpm
これで、PHPがサーバーに正常にインストールされました。 ただし、サーバーがサイトのコンテンツを正しく提供できるように、インストールした他のソフトウェアと連携するように設定する必要があります。
[[step-5 -—- configuring-nginx-to-use-the-php-processor]] ==ステップ5—PHPプロセッサを使用するようにNginxを構成する
この時点で、LEMPスタックの必須コンポーネントがすべてインストールされています。 まだ必要な設定変更は、動的コンテンツにPHPプロセッサを使用するようにNginxに指示することだけです。
この構成の変更はサーバーブロックレベルで行われます(サーバーブロックはApacheの仮想ホストに似ています)。 次のように入力して、デフォルトのNginxサーバーブロック構成ファイルを開きます。
sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf
各行の先頭からポンド記号(#)を削除して、location ~ \.php$
ブロック(server
ブロック内にあるPHP要求を処理するファイルのセグメント)とその内容のコメントを解除します。 また、fastcgi_param
オプションをSCRIPT FILENAME $document_root$fastcgi_script_name
に更新する必要があります。 これは、処理するファイルを見つけることができるドキュメントルートの場所をPHPに通知します。
必要な変更を加えると、server
ブロックは次のようになります。
/etc/nginx/sites-available/default
...
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /opt/rh/rh-nginx112/root/usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
...
変更を行ったら、ファイルを保存してエディターを終了できます。
次に、次のコマンドを実行して、構成ファイルの構文エラーをテストします。
source /opt/rh/rh-nginx112/enable
sudo nginx -t
エラーが報告された場合は、戻ってファイルを再確認してから続行してください。
設定ファイルが有効になったら、Nginxをリロードして、行った変更を実装します。
sudo systemctl reload rh-nginx112-nginx
Nginx、PHP、およびMariaDBがインストールおよび構成されたので、あとは、LEMPスタック構成がサイトの訪問者にコンテンツを正しく配信できることを確認するだけです。
[[step-6 -—- creating-a-php-file-to-test-configuration]] ==ステップ6—構成をテストするためのPHPファイルの作成
これでLEMPスタックが完全にセットアップされ、Nginxが.php
ファイルをPHPプロセッサに正しく渡すことができることを検証するためにテストできます。 これは、ドキュメントルートにテストPHPファイルを作成することによって行われます。
ドキュメントルート内にinfo.php
という名前の新しいファイルを開きます。
sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
新しいファイルに次の行を追加します。 これは、サーバーに関する情報を返す有効なPHPコードです。
112/root/usr/share/nginx/html/info.php’>/opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
終了したら、ファイルを保存して閉じます。 次に、サーバーのドメイン名またはパブリックIPアドレスに続けて/info.php
を使用して、Webブラウザでこのページにアクセスします。
http://server_domain_or_IP/info.php
サーバーに関する情報を含むPHPによって生成されたWebページが表示されます。
このようなページが表示された場合、NginxでPHP処理を正常に設定しました。
Nginxがページを正しく表示することを確認したら、作成したファイルを削除することをお勧めします。実際には、許可されていないユーザーに設定に関するヒントを与え、侵入を試みるのに役立ちます。 後で必要な場合は、いつでもこのファイルを再生成できます。
次のように入力してファイルを削除します。
sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
これで、LEMPスタックのすべてのコンポーネントがサーバーに正しくインストールおよび構成されていることを確認できました。
結論
これで、CentOS 7サーバーにLEMPスタックが完全に構成されました。 これにより、訪問者にWebコンテンツを提供するための非常に柔軟な基盤が得られます。
SCLは、ソフトウェアのさまざまなバージョンをインストールし、それらを切り替えるためにも使用されます。 次を実行すると、システムにインストールされているすべてのコレクションのリストを表示できます。
scl --list
興味がある場合は、official siteでソフトウェアコレクションに関する詳細情報を見つけることができます。