しがないPGの自衛記録

基本ずっと寝てる

Apache HTTP ServerとApache Tomcatを連携させる

f:id:ashitaka1963:20200816102215p:plain

はじめに

前回VirtualBox上のLinux環境でTomcatを動かすことができたので、今回はApache HTTP ServerとApache Tomcatを連携したいと思います。

連携した後の処理としては、ユーザーからのリクエストはApacheで受けとり、そのリクエストの内容が動的な処理が必要であればTomcatに処理を流すといったものになります。

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • 事前知識
    • Apache(Webサーバ)とTomcat(Webコンテナ)を併用するメリット
    • AJPApache JServ Protocol)
  • 環境構築手順
    • Apacheの設定
      • モジュールの読み込み確認
      • ProxyPassの設定
    • Tomcatの設定
    • 再起動
    • 接続確認
  • おわりに
  • 参考サイト

本記事のゴール

なお、本記事はApache httpd と Tomcat を連携させる方法 |を参考にさせていただきました。

環境

事前知識

Apache(Webサーバ)とTomcat(Webコンテナ)を併用するメリット

  • TomcatにもApacheと同様にWebサーバとしての機能を持っている。
  • しかし、Webサーバの専門家のApacheに比べると機能が劣ってしまう。
  • なので、Tomcatが苦手な部分はApacheに任せるために併用する感じ!

AJPApache JServ Protocol)

環境構築手順

Apacheの設定

モジュールの読み込み確認

事前知識で記載したようにAJPを有効にするにはmod_proxy_ajpモジュールが読み込んでいる必要があるので確認していきます。 なお、本設定はApacheのバージョン?によっては、デフォルト設定が違う場合があるので注意してください。

モジュールの読み込み設定が行われているのは、/etc/httpd/conf.modules.d配下の00-proxy.confに記載があるので確認します。

[root@localhost ashitaka]#  cat /etc/httpd/conf.modules.d/00-proxy.conf
# This file configures all the proxy modules:
# ※一部のみ記載
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

ファイルの中身を見ると、mod_proxy_ajpが読み込まれているので、00-proxy.confさえ読み込まれれば問題なさそう。 なお、mod_proxy_ajpmod_proxyモジュールに依存しているのでこちらも読み込まれているとことを確認しておく。

次に00-proxy.confが読み込まれているかをhttpd.confから確認する。

[root@localhost ashitaka]# cat /etc/httpd/conf/httpd.conf
# ※一部のみ記載
Include conf.modules.d/*.conf

conf.modules.dディレクトリ内の拡張子が.confのファイルを全て読み込んでくれてるみたいなので、こちらも問題なさそう。

ProxyPassの設定

必要となるモジュールは読み込まれていることは確認できたので、クライアントからApacheにリクエストが投げられた場合に、どんなものがきたらTomcatに流すのかを設定します。

設定方法としては、httpd.confに直書きするのではなくconf.dディレクトリ内に新たにconfファイルを作成し、それを読み込ませます。

なお、conf.dディレクトリはApacheの追加設定をする際に使われるみたい。

[root@localhost ashitaka]# vi /etc/httpd/conf.d/proxy-ajp.conf

# 以下の内容をコピペする。
ProxyPass / ajp://localhost:8009/

一旦、すべてのリクエスト(/)をTomcatのポート番号8089に流すように設定しています。(8089番ポートについては後述)

これにてApache側の設定は完了したので、続いてTomcatの設定を行います。

Tomcatの設定

Apache側の設定で、ユーザーからのリクエストは8089番ポートに流すぞーっていう設定はできたので、次はTomcat側で8089受け取るぞーっていう設定を行います。

[root@localhost conf]# cat /opt/apache-tomcat-9.0.37/conf/server.xml

一部抜粋したものが以下になります。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

<!--
<Connector protocol="AJP/1.3"
           address="::1"
           port="8009"
           redirectPort="8443" />
-->

内容としては、上側はHTTP1.1の8080番ポートの通信は受け付けるとなっています。なので、前回Tomcatのテストページを表示した際に8080番ポートを指定していたのはこれが理由になります。

下側は、デフォルトではコメントアウトされてますが、AJP1.3の8009番ポートの通信を受け付けるといった内容になっています。ここで8009番ポートとなっているので、先ほどApache側の設定ではProxyPass / ajp://localhost:8009/と指定しています。

ここからが本題ですが、今後はApache経由のAJP通信のみ必要で直のHTTP通信は必要ないので修正します。また、この記事のはまったこと1とはまったこと2が見事にはまったので、こちらもこのタイミングで修正しておきます。

<!--
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->

<Connector protocol="AJP/1.3"
           address="0.0.0.0"      ←★はまったこと1
           port="8009"
           redirectPort="8443"
           secretRequired="false" />  ←★はまったこと2

再起動

設定変更したので再読み込みのために各サービスを再起動します。 これらの再起動は順番があるっぽいのでそれに沿って停止と起動を行っています。

[root@localhost conf]# systemctl stop httpd
[root@localhost conf]# systemctl stop tomcat
[root@localhost conf]# systemctl start tomcat
[root@localhost conf]# systemctl start httpd

接続確認

これまでの設定で、AJPの設定は完了しているので、すべてのApacheへのアクセスはTomcatに流される。 それ即ち、Apacheのテストページを開こうとすればtomcatのテストページが開かれるはず!!

なので、ゲストOSから80番ポートにアクセスしてみます。

[root@localhost conf]# curl http://localhost/


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.37</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        # 長いので割愛。
    </body>
</html>

今までApacheのテストページが表示されていたものが、無事にtomcatのテストページが表示されています。

念のため、8080番ポートへのHTTPアクセスがつながらないことも確認しておきます。

[root@localhost conf]# curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: 接続を拒否されました

こっちも想定していた通り閉じられてますね!

おわりに

以上で本記事のゴールとしていたApacheTomcatの連携は完了です。 今回はすべてのリクエストをTomcat側に流してしまっているので、この辺りも今後の修正対象になります。

次回は、ホスト側でwarファイルを作成して、Tomcatにデプロイしてアクセスできるようにしたいと思います。

参考サイト

続きを読む

VirtualBox上のLinux環境でTomcatを動かしてみる。

f:id:ashitaka1963:20200815101254p:plain

はじめに

前回VirtualBox上のLinux環境をApatch HTTP Severを使用してWebサーバ化できたので、今回はTomcatを用いてアプリケーションサーバを構築してみる。

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • 事前知識
  • 環境構築手順
    • Java8(OpenJDK)のインストール
      • Javaランタイムとは
    • Tomcatのダウンロード
    • サービスの作成と登録
    • 実行確認
      • ゲストOSからTomcatのテストページを表示する
      • ホストOSからゲストOSのTomcatのテストページを表示する
  • おわりに
  • 参考サイト

本記事のゴール

  • Java8のインストール
  • Tomcatのダウンロードおよび配置
  • Tomcat用サービスの作成と登録
  • Tomcatのテストページを表示する

なお、本記事はApache Tomcat 9 を CentOS 7 にインストールする手順 |を参考にさせていただきました。

環境

事前知識

Tomcatとは

  • Java Servletを動かすためのソフトウェアで、サーブレットコンテナとも呼ばれる
  • 正式名称はApache Tomcatなので、Apache HTTP Serverとごっちゃにならないようにする。
  • Apache HTTP Serverと連係して使われることが多い。

Java Servletとは

  • サーバー上で実行されるJavaプログラムのこと
  • 動的なページ生成が可能

環境構築手順

Java8(OpenJDK)のインストール

今回はJavaアプリケーションの開発はホスト側で行うでのサーバ側はJavaランタイムのみインストールします。

[root@localhost ~]# yum install java-1.8.0-openjdk -y

インストール出来たことを確認します。

[root@localhost ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

バージョンが1.8.0で表示されているのでJavaのインストール完了です。

Javaランタイムとは

  • Javaで作られたアプリを動かすために必要なものをまとめたもの。
  • 正式には、JREJava Runtime Enviroment)と呼ばれる。

Tomcatのダウンロード

まず、サーバ側でTomcatを動かすための専用ユーザーtomcatを追加します。

# -s /sbin/nologinをつけることでログインできなユーザーを作成できる。
useradd -s /sbin/nologin tomcat

次にcurlコマンドを使用して、Tomcatをダウンロードします。 curlコマンドで指定しているtomcatのバージョンについては、2020年8月時点で最新バージョンの9.0.37をダウンロードしています。

最新バージョンに置き換えたい場合はTomcatダウンロードページにアクセスし、Core内のtar.gzの上で右クリック⇒リンクアドレスのコピーで取得したURLに置き換えてください。

f:id:ashitaka1963:20200815094452p:plain

※以降、Tomcatのバージョンが記載されている箇所についてはダウンロードしたバージョンに置き換える。

# rootユーザーのホームディレクトリに移動する。
[root@localhost ~]# cd ~
# ホームディレクトリ配下にtomcatをダウンロードする。
[root@localhost ~]# curl -O https://ftp.kddi-research.jp/infosystems/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz

ダウンロードしたファイルをtarコマンドで解凍し、/opt配下に配置します。 また、解凍したファイルの所有者も変更します。

# ファイルの解凍
[root@localhost ~]# tar -xzvf apache-tomcat-9.0.37.tar.gz
# /opt配下に移動
[root@localhost ~]# mv apache-tomcat-9.0.37 /opt
# 所有者の変更
[root@localhost ~]# chown -R tomcat:tomcat /opt/apache-tomcat-9.0.37

サービスの作成と登録

ダウンロードしたTomcatをサービスとして登録します。

以下、コマンドを入力してサービス定義ファイルであるtomcat.serviceを作成します。

[root@localhost ~]# vi /etc/systemd/system/tomcat.service

tomcat.service

以下の内容をコピペする。ただし、バージョン記載部分についてはダウンロードした物に置き換える。

[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-9.0.37/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/apache-tomcat-9.0.37/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.37/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-9.0.37/bin/shutdown.sh;/opt/apache-tomcat-9.0.37/bin/startup.sh

[Install]
WantedBy=multi-user.target

保存できたら次のコマンドでファイルの権限を変更します。

[root@localhost ~]# chmod 755 /etc/systemd/system/tomcat.service

サービス定義ファイルの作成が完了したのでApacheの時と同様に有効にして、再起動します。

[root@localhost ~]# systemctl enable tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /etc/systemd/system/tomcat.service.
# 再起動
[root@localhost ~]# reboot

実行確認

tomcatが起動されているかステータス確認してみると、エラーが発生しているので対応していく。

[root@localhost ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2020-08-14 04:17:07 EDT; 1min 43s ago
 Main PID: 902 (code=exited, status=203/EXEC)

 814 04:17:07 localhost.localdomain systemd[1]: Starting Apache Tomcat 9...
 814 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Main process exited, code=exited, status=203/EXEC
 814 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Failed with result 'exit-code'.
 814 04:17:07 localhost.localdomain systemd[1]: Failed to start Apache Tomcat 9.
 814 04:18:41 localhost.localdomain systemd[1]: /etc/systemd/system/tomcat.service:14: Unknown lvalue 'ExecReStart' in section 'Service'
 814 04:18:46 localhost.localdomain systemd[1]: /etc/systemd/system/tomcat.service:14: Unknown lvalue 'ExecReStart' in section 'Service'

サービスを開始してみるとやっぱり落ちてしまってるみたい。。

[root@localhost ~]# systemctl start tomcat
Job for tomcat.service failed because the control process exited with error code.
See "systemctl status tomcat.service" and "journalctl -xe" for details.

出力されたログの通りコマンドを入力してログを見てみる。

[root@localhost ~]# journalctl -xe
# 赤文字部分を一部抜粋
814 04:20:56 localhost.localdomain setroubleshoot[2266]: SELinux is preventing (artup.sh) from execute access on the file startup.sh. For complete SELinux messages run: sealert -l 99b91766-a265-4d33-8>

ログを見てみる限りSELinuxが原因っぽいので、一旦無効化してみる。 今回は手探りでPermissiveにしているが本当にこれでよいかどうかは今後勉強してみようと思う。

# SELinuxの動作モードを恒久的に`Permissive`に変更
[root@localhost ~]# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing ← ★ここを`permissive`に変更する。
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

もっかいサービス起動してみて状態を確認してみると正常に起動している。

# tomcatサービスのステータス確認(Active: activeなので正常に起動している。)
[root@localhost ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Fri 2020-08-14 04:25:15 EDT; 7s ago
  Process: 2322 ExecStart=/opt/apache-tomcat-9.0.37/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2322 (code=exited, status=0/SUCCESS)
    Tasks: 14 (limit: 11324)
   Memory: 158.4M
   CGroup: /system.slice/tomcat.service
           └─2336 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.37/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKey>

 814 04:25:15 localhost.localdomain systemd[1]: Starting Apache Tomcat 9...
 814 04:25:15 localhost.localdomain systemd[1]: Started Apache Tomcat 9.

ゲストOSからTomcatのテストページを表示する

無事に起動できてるっぽいので、ゲストOSからTomcatのテストページを開いてみると表示されることを確認できた!

# Tomcatのデフォルトのポート番号は8080
[root@localhost ~]# curl http://localhost:8080

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.37</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        # 長いので割愛。
    </body>
</html>

ホストOSからゲストOSのTomcatのテストページを表示する

まず初めにApacheのとき同じようにVirtualBoxのポートフォワーディングの設定を行う。 (Apacheが8080を設定していてややこしかったので、そこらへんも併せて修正しています。)

f:id:ashitaka1963:20200815101018p:plain

  • 名前
    • 任意の名前(今回はTomcatとする)
  • プロトコル
  • ホストIP
    • (空白)
  • ホストポート
    • 任意の数字(今回は8080)
  • ゲストIP
    • (空白)
  • ホストポート
    • 8080(tomcatのポート番号)

次にホストOSからの8080番ポートへのアクセスはファイアウォールにより遮断されてしまうので、設定を行います。

まず、firewallに読み込ませるtomcat用の設定ファイルを作成します。

vi /etc/firewalld/services/tomcat.xml

中身は以下の内容をコピペする

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Apache Tomcat</short>
  <description>Apache Tomcat</description>
  <port protocol="tcp" port="8080"/>
</service>

先ほど作成したtomcatファイルをfirewalldに読み込ませる。

# --permanent       : 恒久設定(これを指定しないと再起動時のこの設定が消えてしまう。)
# --zone=public     : ゾーン設定(要確認)
# --add-service     : 追加するサービスを指定
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-service=tomcat
success
# サービスの再起動(設定ファイルを読み込む。)
[root@localhost ~]# systemctl restart firewalld

ホストOSのブラウザからhttp://localhost:8080/にアクセスしてみて以下のページが表示されたら完了。

f:id:ashitaka1963:20200815101254p:plain

おわりに

SELinuxの設定当たりで一度躓きましたが、無事にゴールとしていたところまで無事に辿り着けました。

次回は、今回飛ばしたSELinuxの設定やApache HTTP Serverとの連携部分をやっていきたいと思います。

参考サイト

続きを読む

Apacheの設定ファイルを確認する

f:id:ashitaka1963:20200813130910p:plain

はじめに

前回、Apacheのインストールが完了したので今回はApacheの設定ファイルであるhttp.confの中身を確認したいと思います。

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • httpd.conf
    • 設定ファイルの場所
    • 34行目:ServerRootディレクティブ
    • 45行目:Listenディレクティブ
    • 59行目:Includeディレクティブ
    • 69,70行目:User,Groupディレクティブ
    • 89行目:ServerAdminディレクティブ
    • 105行目:Directoryディレクティブ
    • 106行目:AllowOverrideディレクティブ
    • 107行目:Requireディレクティブ
    • ★122行目:DocumentRootディレクティブ
    • 147行目:Optionsディレクティブ
    • 166行目:IfModuleディレクティブ
    • ★167行目:DirectoryIndexディレクティブ
    • 174行目:Filesディレクティブ
    • ★185行目:ErrorLogディレクティブ
    • ★192行目:LogLevelディレクティブ
    • ★220行目:CustomLogディレクティブ
  • おわりに
  • 参考

本記事のゴール

Apacheの設定ファイル(http.conf)のコマンドであるディレクティブについてやる気が出る限り確認する。

環境

  • Apaceh 2.4.37

httpd.conf

設定ファイルの場所

Apacheの設定ファイルは、/etc/httpd/conf配下のhttpd.confに記載されています。

34行目:ServerRootディレクティブ

ServerRoot "/etc/httpd"
  • Apacheサーバが存在するディレクトリを設定。
  • Apacheをインストールした場所に応じて適宜変更する。

45行目:Listenディレクティブ

Listen 80
  • Apacheで使用するポート番号を指定する。
  • 80番ポートを他で使っていないならデフォルト80のままでよさそう。

59行目:Includeディレクティブ

Include conf.modules.d/*.conf
  • サーバ設定ファイルから他の設定ファイルを読み込む。
  • /etc/httpd/conf.modules.d内のconfファイルをすべて読み込んでいる。

69,70行目:User,Groupディレクティブ

User apache
Group apache
  • User :サーバーがリクエストに応答する際に用いるユーザーID
  • Group:サーバーがリクエストに応答する際に所属するグループ

89行目:ServerAdminディレクティブ

ServerAdmin root@localhost
  • サーバがクライアントに送るエラーメッセージに含める電子メールアドレス
  • メール機能が使わないなら特にいじらなくてよさそう。

105行目:Directoryディレクティブ

<Directory />
    ・・・
</Directory>
  • 指定のファイルシステムディレクトリとサブディレクトリのみに 適用されるディレクティブを囲む
  • 上記だとルートディレクトリ(/)以下のすべてに適用されるディレクティブを内部に記載する。
  • なお、Directory ディレクティブは下位のディレクトリに対する設定によって上書きされる。
  • なので、全体としては拒否しておいて、あるディレクトリにおいては許可するといった記載になる。

106行目:AllowOverrideディレクティブ

AllowOverride none
  • .htaccessで許可されるディレクティブの種類を設定する。
  • .htaccessとは
  • noneが設定されているので、.htaccessは無視される(読み込まれない。)

107行目:Requireディレクティブ

Require all denied
  • アクセス制御に関する設定を行う。
  • all deniedなので、全てのアクセスを拒否している。
  • all grantedが設定されていれば、全てのアクセスが許可される。

★122行目:DocumentRootディレクティブ

DocumentRoot "/var/www/html"
  • Webから見えるメインのドキュメントツリーになるディレクト
  • クライアントからコンテンツリクエスト(httpリクエスト)した場合に、レスポンスとして返すファイルを配置する場所。
  • 絶対パスでない場合は、ServerRootからの相対パスとなる。

例えば/var/www/html/HelloWorld.htmlといったファイルを配置すれば、クライアント側からはhttp://localhost/HelloWorld.htmlでコンテンツを取得することができる。

147行目:Optionsディレクティブ

Options Indexes FollowSymLinks

166行目:IfModuleディレクティブ

<IfModule dir_module>
    ・・・
</IfModule>
  • IFがついてるからわかるように、指定したモジュールが存在する場合に処理されるディレクティブを設定することができる。

★167行目:DirectoryIndexディレクティブ

DirectoryIndex index.html
  • クライアントがファイル名を指定せずにサーバにリクエストを送った場合に、返されるデフォルトのファイルを設定する。
  • この設定だと、http://localhost/でリクエストを送った場合にindex.htmlが返される。

174行目:Filesディレクティブ

<Files ".ht*">
    ・・・
</Files>
  • Directoryディレクティブと似たようなもので、マッチするファイル名に適用されるディレクティブを設定する。
  • .htから始まるファイルが対象になる。

★185行目:ErrorLogディレクティブ

ErrorLog "logs/error_log"
  • エラーログを出力する場所を設定する。
  • logs/var/log/httpdへのシンボリックリンクなので、/var/log/httpd配下に出力される。

★192行目:LogLevelディレクティブ

LogLevel warn
  • 名前の通り、ログレベルを設定する。

★220行目:CustomLogディレクティブ

CustomLog "logs/access_log" combined

おわりに

一旦、やる気もなくなってきたので今回はここまでにしたいと思います。 ★がついてるのは個人的に重要そうor今後確認するであろう項目につけています。

今回の調査で、なんでファイル名指定してないのに、index.htmlが呼ばれるんだ~とか、なんでhtmlファイルは/var/www/htmlに置くんだー っていうのは、納得することが出来てよかった!

だけど、全部の項目を確認するのは、時間的にも厳しいと思うので必要なものを都度確認してまとめる方針に変えようかな~と考え中。(だれてしまうので。。。)

参考

続きを読む

VirtualBox上のLinux環境をWebサーバ化してみる

f:id:ashitaka1963:20200810141801p:plain

はじめに

前回で環境構築およびホストOSからSSH接続ができるにようになったので当初の目的であって、好きに使って壊せる環境で遊んでいきたいと思います。

まず手始めに今回はApacheをインストールして、Webサーバ化してみたいと思います。

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • 事前知識
  • Webサーバ化構築手順
  • ホストOSからゲストOSにHTTPアクセスする
  • おわりに
  • 参考サイト

本記事のゴール

  • CentOS 8.0にApacheをインストールする。
  • VirtualBoxにポートフォワーディング設定を行う。
  • ホストOSからアクセスする。

なお、本記事は VirtualBox + CentOS7 でApacheをインストール - HRR Co., Ltd.を参考にさせていただきました。

環境

事前知識

Apacheとは

以下、Wikipediaからの参照

Apache HTTP Server(アパッチ エイチティーティーピー サーバ)は、Apache License2.0の条件でリリースさ>れるフリーでオープンソースクロスプラットフォームのWebサーバソフトウェアである。ApacheApacheソフトウェア財団の支援のもと、開発者のオープンコミュニティによって開発・保守されている。

簡単にまとめると

  • Webサーバ用のオープンソースのソフトウェア
  • 世界中で高いシェアを誇っている人気ソフト。
  • 正式名称は、Apache HTTP Server

同様のソフトウェアとして、以下があるので名前を聞いたときにはApacheと似たようなものね。ってふんわり紐づけしておく。

  • IIS(Internet Information Services)
  • nginx(エンジンエックスと読むみたい。初見では読めね~)
  • GoogleWebServer

Webサーバ化構築手順

CentOS 8.0にApacheをインストールする

RLoginでホストOSからゲストOSにSSH接続し、root権限に昇格します。

[ashitaka@localhost ~]$sudo su -

パッケージ管理システムであるyumを使用してインストールします。 全てyesで回答で良いのでオプション-yを付けています。

なお、apacheじゃなくてhttpdインストールしてない?って感じになりそうですが、Linuxでインストールする際の名称はhttpdみたい。

[root@localhost ~]# yum install httpd -y

完了しました!と表示されたらインストールは完了です。

念のためバージョンを確認するコマンドを実行してみます。

[root@localhost ~]# httpd -version
Server version: Apache/2.4.37 (centos)
Server built:   Jun  8 2020 20:14:33

Apacheのバージョン2.4.37でインストールされていることが確認できます。

Apacheの起動設定

インストールした直後のApacheは起動されていません。 systemctlはサービスの起動や停止などを出来るコマンドでstatusは状態を確認するコマンドです。

[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)

なので、まずサービスを起動して状態を確認してみます。

[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-08-09 21:58:21 EDT; 19s ago
     Docs: man:httpd.service(8)
 Main PID: 30954 (httpd)
   Status: "Running, listening on: port 80"
    Tasks: 213 (limit: 11324)
   Memory: 25.0M
   CGroup: /system.slice/httpd.service
           ├─30954 /usr/sbin/httpd -DFOREGROUND
           ├─30955 /usr/sbin/httpd -DFOREGROUND
           ├─30956 /usr/sbin/httpd -DFOREGROUND
           ├─30957 /usr/sbin/httpd -DFOREGROUND
           └─30960 /usr/sbin/httpd -DFOREGROUND

 809 21:58:21 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
 809 21:58:21 localhost.localdomain httpd[30954]: AH00558: httpd: Could not reliably determine the server's fu>
 8月 09 21:58:21 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
 8月 09 21:58:21 localhost.localdomain httpd[30954]: Server configured, listening on: port 80

Activeの項目がactiveとなっていれば、起動完了です。

試しにゲストOS側で自身の80番ポートにcurlコマンドを使用してアクセスできるか試してみます。

[root@localhost ~]# curl http://localhost
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <title>CentOS 提供的 Apache HTTP 服务器测试页</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
    <link rel="shortcut icon" href="http://www.centos.org/favicon.ico"/>
    <link rel="stylesheet" media="all" href="noindex/common/css/bootstrap.min.css"/>
    <link rel="stylesheet" media="all" href="noindex/common/css/styles.css"/>
  </head>
  <body>
    # 省略
  </body>
</html>

文字化けしている部分もありますが、無事にレスポンスがあることが確認できます。

一応、apche起動していなければ以下のような返答が返ってきます。

[root@localhost ~]# curl http://localhost
curl: (7) Failed to connect to localhost port 80: 接続を拒否されました

VirtualBoxのポートフォワーディング設定(NATの場合)

続いて、ホストOS側からゲストOSの80番ポートにアクセスしてみます。

SSH接続のときと同様に、ホストOS側からゲスト側のHTTP接続用の80番ポートにアクセスするには、ポートフォワーディングの設定が必要になります。

  1. Oracle VM VirtualBoxマネージャーを開く。
  2. 仮想マシン上で右クリックをして、【設定】を開く。
  3. 【ネットワーク】→【高度(D)】→【ポートフォワーディング】をクリックする。
  4. 右上の+ボタンをクリックして、以下を設定する。

f:id:ashitaka1963:20200810141250p:plain

  • 名前
    • 任意の名前(今回はHTTP接続用とわかるようにするためにHTTPとする)
  • プロトコル
  • ホストIP
    • (空白)
  • ホストポート
    • 任意の数字(今回は8080)
  • ゲストIP
    • (空白)
  • ホストポート
    • 80(sshのポート番号)

以上の設定を有効にするために、仮想マシンの再起動を行う。

ホストOSからゲストOSにHTTPアクセスする

よし、これでapcheの起動も完了して、ポートフォワーディングの設定も有効にしたし、ブラウザからhttp://localhost:8080/にアクセスしてみる。 ポートはポートフォワーディングで設定した8080を指定する。

が、いつまでたっても返答が返ってこない。。。。

まあ、こうなることは想定済みで、原因は2つあるので次で説明していきます。

原因その1:Apache自動起動設定

結論から言うと、Apacheが起動されていないことが1つめの原因です。 というのも、ポートフォワーディングの設定を行った際に再起動もしたため、Apacheが停止されている状態になっています。

解決策として、毎回systemctl start httpdをコマンドで叩いてもいいけどそれはさすがに面倒くさいので、自動起動設定を行う。

[root@localhost ~]# systemctl enable httpd

これをしておくだけで、Linuxの起動時にApache自動起動されるようになる。

原因その2:ファイアウォールの設定

ファイアウォールのサービスであるfirewalldがデフォルトで起動されており、それが原因でホストOSから80番ポートへのアクセスがブロックされてしまっている。

なので、以下コマンドで80番ポートへのアクセスを許可します。

# ポートの追加
# --permanent       : 恒久設定(これを指定しないと再起動時のこの設定が消えてしまう。)
# --zone=public     : ゾーン設定(要確認)
# --add-port=80/tcp :  tcp接続による80番ポート接続を許可
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
# 設定の反映
[root@localhost ~]# firewall-cmd --reload
success

再挑戦

再び、ホストOSのブラウザからhttp://localhost:8080/にアクセスしてみる。

f:id:ashitaka1963:20200810141535p:plain

この画面が表示されれば無事にHTTP接続することが完了!!

念のためVirtualBoxからスナップショットを取っておくことをオススメします。

おわりに

今回も無事にゴールとしていたところまで完了です!

今回の手順通りにやっていれば恒久的な設定となっているので、VirtualBoxを再起動したとしてもブラウザからアクセスできるようになっています。

ただし、Webサーバ自体が停止している(VirtualBox上のLinuxが起動されていない)状態では、アクセスできないので注意してください。

次回はテストページ以外も表示されるようにしていきたいと思います。

参考サイト

続きを読む

【Windows】VirtualBox上のCentOSにSSH接続する

f:id:ashitaka1963:20200809153047p:plain

はじめに

前回VirtualBox上にLinux環境を構築できたので、ホストOSのWindowsからSSH接続してみたいと思います。

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • 事前準備
    • RLoginのインストール
    • VirtualBoxのポートフォワーディング設定(NATの場合)
  • パスワード認証方式でSSH接続する
  • 公開鍵認証方式でSSH接続する
    • 秘密鍵・公開鍵の作成
    • ゲストOSに公開鍵を渡す
    • RLoginでのSSH認証鍵による接続
  • おわりに
  • 参考サイト

本記事のゴール

SSHの認証方式には2種類あるので両方試します。

  • ホストOS(Windows)からゲストOS(CentOS8)に
    • パスワード認証方式でSSH接続する。
    • 公開鍵認証方式でSSH接続する。

環境

事前準備

RLoginのインストール

今回はターミナルソフトとして、RLoginを使用しますがTeratermなど使い慣れているものでOK。

RLoginはこちらからダウンロードできます。

VirtualBoxのポートフォワーディング設定(NATの場合)

Virtualbox内のゲストOSにアクセスする場合、ポートフォワーディングの設定が必要になります。

ホストOSからゲストOSにSSH接続するというのは、ホストOSからホストOS内のゲストOSに接続するということで、ホストOSからすると自分の中のゲストOSに接続するようなもの。

このような接続を実現するのがポートフォワーディングと呼ばれるもので、ホストOSのこのポートにアクセスしたら、仮想マシン内の特定のポートへ接続するといったことができる。

  1. Oracle VM VirtualBoxマネージャーを開く。
  2. 仮想マシン上で右クリックをして、【設定】を開く。
  3. 【ネットワーク】→【高度(D)】→【ポートフォワーディング】をクリックする。
  4. 右上の+ボタンをクリックして、以下を設定する。

f:id:ashitaka1963:20200809153047p:plain

  • 名前
    • 任意の名前(今回はSSH接続用とわかるようにするためにSSHとする)
  • プロトコル
  • ホストIP
    • (空白)
  • ホストポート
    • 任意の数字(今回は2222)
  • ゲストIP
    • (空白)
  • ホストポート
    • 22(sshのポート番号)

以上の設定を有効にするには、仮想マシンの再起動が必要になる。

パスワード認証方式でSSH接続する

事前準備が完了したので、パスワード認証方式でSSH接続します。

RLogin

  1. RLogin.exeを実行する。
  2. 【新規(N)】をクリックして、以下の内容を入力する。
  3. 【OK】をクリックして、設定した接続情報を選択して、再度【OK】をクリックする。
  4. 無事にログインできたらパスワード認証によるログインは完了!!

f:id:ashitaka1963:20200809152344p:plain

  • エントリー(上)
    • 任意の名前
  • プロトコル
  • ホスト名
    • localhsot
  • TCPポート
    • 2222(ポートフォワーディング設定のホストポートで設定したもの)
  • ログインユーザー
    • ashitaka(身で作成したユーザー名)
  • パスワード
    • 自身で設定したパスワード

コマンドプロンプト

コマンドプロンプトだと以下のコマンドを入力した後に、パスワードを入力することでログインできる。

# ssh ユーザー名@ホスト名 -p ポート番号
ssh ashitaka@localhost -p 2222

公開鍵認証方式でSSH接続する

続いて、よりセキュアな認証方式である公開鍵認証方式でSSH接続してみる。

公開鍵認証方式についてはこちらを参考にさせていただきました。

秘密鍵・公開鍵の作成

今回はホストOS側で鍵を作成し、ゲストOS側に鍵を転送します。

鍵を保存するためのフォルダを任意のパスに作成する。

mkdir .ssh

次のコマンドを実行して、鍵を作成する。

# -t : 署名アルゴリズム
# -f : 作成するキー名
# -C : コメント
ssh-keygen -t ed25519 -f .ssh/id_ed25519_localhost_key -C " "

そうするとパスフレーズが聞かれるので、パスワードを入力します。 パスフレーズを設定しない場合は、Enter連打でOK!

処理が完了すると、指定したフォルダ内に-fで指定したファイル名の秘密鍵と拡張子.pubが付与された公開鍵が作成されます。

ゲストOSに公開鍵を渡す

WinSCPやRLoginの機能を用いて、ホストOSからゲストOSの/home/ashitakaに公開鍵ファイルを転送します。(ashitaka部分は自身が作成したユーザー名に置き換える。)

以下のコマンドを順に実行し、公開鍵の設定を行います。

# ディレクトリ.sshを作成
mkdir .ssh
# ディレクトリ.sshのパーミッションを700変更(オーナーのみ読み込み、書き込み、実行が可能)
chmod 700 .ssh
# 公開鍵を.sshディレクトリのauthorized_keysというファイル名でコピーする。
cat id_ed25519_localhost_key.pub >> .ssh/authorized_keys
# ファイルauthorized_keysのパーミッションを600変更(オーナーのみ読み込み、書き込みのみ可能)
chmod 600 .ssh/authorized_keys
# 転送した鍵ファイルを削除する。
rm -f id_ed25519_localhost_key.pub

RLoginでのSSH認証鍵による接続

RLoginを起動して、新規(N)をクリックする。

入力内容は基本的にパスワード認証方式と同じでパスワードのところだけ空白にする。 そして、画面右下の【SSH認証鍵】をクリックして、先ほど作成した秘密鍵を選択し、【OK】をクリックする。

接続すると設定したパスフレーズを聞かれるので入力して、ログインできれば完了!!

おわりに

本記事のゴールとしていた、パスワード認証方式と公開鍵認証方式によるSSH接続ができました。

ただし、今の設定のままですとパスワード認証と公開鍵認証方式のどちらでも接続できる状態になっておりセキュアな状態とは言えません。

本来ならば鍵認証できるようになったらパスワード認証は無効化するのが常套手段と思いますが、長くなりそうなので今回はここまでにしておきます。

参考サイト

続きを読む

Rloginでコピペ(Ctrl + C, Ctrl + V)する

https://cdn-ak.f.st-hatena.com/images/fotolife/a/ashitaka1963/20200809/20200809201056.png

はじめに

RLoginの初期設定では、コピー(Ctrl + C)やペースト(Ctrl + V)のショートカットが有効ではないので、ショートカットでコピペできるようにする。

環境

  • RLogin 2.25.3

手順

RLoginを起動して、【編集】ボタンをクリックする。

f:id:ashitaka1963:20200809201013p:plain

左側のメニューから【キーボード】をクリックし、キーコード設定画面で【新規】をクリックする。

f:id:ashitaka1963:20200809201025p:plain

コピーの設定

Assign Key String画面で以下の内容を入力して、【OK】をクリックする。

f:id:ashitaka1963:20200809201056p:plain

  • Key Code
    • C
  • Ctrl
    • チェック
  • Assign String
    • $EDIT_COPY

ペーストの設定

同様に新規で以下を入力する。

f:id:ashitaka1963:20200809201112p:plain

  • Key Code
    • V
  • Ctrl
    • チェック
  • Assign String
    • $EDIT_PASTE

接続確認

設定したサーバにアクセスして、ショートカットキーが動作することを確認できればOK!

標準の設定にする

上記の手順で、コピペがショートカットでできるようになるがあくまで設定が適応されるのは設定した接続先だけにある。 しかし、毎回新規接続先を作るごとにこの設定を行うのは面倒なため、デフォルトの設定として登録する。

設定方法としては、先ほどコピペの設定を行ったサーバで右クリックして、【標準の設定にする】をクリックするだけ。

ただし、注意しないといけないのは、コピペの設定だけでなく、ポートフォワードの設定などもしているとそれもデフォルトの設定にされてしまう。 なので、デフォルト設定用の接続先を作り、それを【標準の設定にする】のが良いと思う。

f:id:ashitaka1963:20200809203431p:plain

参考サイト

続きを読む

【Windows】VirtualBoxにLinux環境を構築する

f:id:ashitaka1963:20200808234914p:plain

はじめに

好きに使って壊せる環境を作りたくなったので、Virtualboxでその環境を構築したいと思います。 (今の時代、コンテナだろ。。。って感じですがまあ備忘録として残す。)

目次

  • はじめに
  • 目次
  • 本記事のゴール
  • 環境
  • 事前準備
  • 環境構築手順
  • おわりに
  • 参考サイト

本記事のゴール

  • Windows環境(ホストOS)にVirtualboxをインストールする
  • VirtualboxLinux環境(ゲストOS)を作成する
  • スナップショットを作成する。

時間がかかるので基本的に画面スクショは少なめです。。。

なお、本記事は 【Linux】(初心者向け)VirtualBoxにCentOS7環境を構築する - SEワンタンの独学備忘録を参考にさせていただきました。

環境

事前準備

VirtualBoxのインストール

  1. Downloads – Oracle VM VirtualBoxから、[windows hosts]版をダウンロードをする。
  2. ダウンロードしたファイルをダブルクリックして、インストーラーを起動する。
  3. 特にこだわりがなければ基本的に[Next]をクリックする
  4. [Install] > [Finish]で完了

CentOSのISOファイルのダウンロード

  1. The CentOS Projectにアクセスして、[CentOS Linux]をクリックする。
  2. タブから[8(2004)]をクリックして、[x86_64]をクリックする。
  3. ダウンロード用ミラーサイトの一覧が表示されるので、とりあえず1番上のリンクをクリック。
  4. [CentOS-8.2.2004-x86_64-dvd1.iso]をクリックして、ダウンロードする。

環境構築手順

仮想マシンの作成

VirtualBoxのインストールが完了したので、仮想マシンを新規作成します。

  1. インストールしたVirtualBoxを起動する。
  2. [新規(N)]をクリックする。
  3. 名前:任意、オペレーティングシステムLinux、バージョン:Red Hat(64-bit)を選択して、[次へ]をクリックする。
  4. モリーサイズは、デフォルト(1024MB)で[次へ]をクリックする。
  5. ハードディスクもデフォルト(仮想ハードディスクを作成する)で[次へ]をクリックする。
  6. ハードディスクのファイルタイプもデフォルト(VDI(VirtualBox Disk Image))で[次へ]をクリックする。
  7. 物理ハードディスクにあるストレージもデフォルト(可変サイズ)で[次へ]をクリックする。
  8. ファイルの場所とサイズについては、デフォルト8GBのままで足りないので16GBに変更して[作成]をクリックする。

以上で仮想マシンの作成が完了となります。 ただし、枠組みのようなものができただけになりますので、次から中身の部分を作ります。

仮想マシンの起動

それでは作成した仮想マシンを起動して、OSの設定などを行います。

  1. 作成した仮想マシンを選択して、[起動]をクリックする。
  2. 起動ハードディスクを選択画面で、エクスプローラーの選択アイコンをクリックする。
  3. 光学ディスク画面にて、[追加]をクリックする。
  4. 事前準備でダウンロードしたisoファイル選択して、[開く]をクリックする。
  5. 光学ディスク画面に戻るので、追加したものを選択して、[選択]をクリックする。
  6. 起動ハードディスクを選択で、[起動]をクリックする。
  7. Install CentOS Linux8を選択して、[Enter]をクリックする。

以上の手順を完了するとコンソール画面に処理が表示され、 その後、WELOCME TO CENTOS LINUX 8.と書かれた言語を設定する画面が表示されます。

CentOSのインストール設定

それでは、CentOSの設定を行っていきます。

  1. 日本語を選択して、[続行]をクリックする。
  2. インストール概要画面が表示されるので、[インストール先]をクリックする。
  3. ディスクが設定されていることを確認して、[完了]をクリックする。
  4. インストール概要画面が表示されるので、[ネットワークとホスト名]をクリックする。
  5. Ethernetを[オン]にして、[完了]をクリックする。
  6. [インストールの開始]をクリックする。
  7. 設定画面が表示されるので、[rootパスワード]をクリックする。
  8. 任意のパスワードを入力して、[完了]をクリックする。
  9. [ユーザーの作成]から任意のユーザーを作成する。
  10. しばらく待っていると完了しました!と表示されるので、[再起動]をクリックする。
  11. 再起動すると、再び Install CentOS Linux8が再び表示されてしまう問題が発生したのでCentOSのインストールが上手くいかないを参考に解決する。
  12. 解決手順を実施した後に、再起動すると今度は初期セットアップが表示されるのでラインセンスに同意する。
  13. ログイン画面が表示されるので、作成したユーザーでログインする。

以上でVirtualBoxLinux環境を構築できました!

スナップショットの取得

最後にある時点のセーブデータのようなものであるスナップショットを取得します。

これにより今後OSインストールした直後の状態に戻したいときにこのスナップショットを使うことでこの状態に簡単に戻すことができます。

  1. Oracle VM VirtualBoxマネージャーにて、作成した仮想マシンを選択してメニューのスナップショットの[作成]をクリックする。
  2. 仮想マシンのスナップショット作成画面で任意の名前と説明を入力する。

おわりに

本記事のゴールとしてた、スナップショットの作成まで完了できました。 次回以降はこの環境をつかっていろんなことを試していきたいと思います!

参考サイト

続きを読む