今回の講座はWebサーバーのApacheをインストールします。
Webサーバーの役割を簡単にいうと、特定のディレクトリ(フォルダー)を公開して、ブラウザなどで閲覧できるようにするのがWebサーバーです。
Apacheをインストールして起動させるのは凄く簡単ですし、きちんとした設定・コツさえ覚えてしまえば、技術をビジネスに変えることだってできます。
技術を磨くことだけにフォーカスするのではなくて、技術をビジネスに繋げる発想や考え方についても、少しずつ話していきたいと思います。
目次
インターネットサーバーの知られざる真実
特定のディレクトリを公開してブラウザなどで閲覧できるようにするのがWebサーバーと冒頭で説明しました。
1対nの関係
ただコレには続きがあって、1台のサーバーに複数のドメインを割り当てて、それぞれを公開することだってできるんです。
その証拠をhostコマンドで暴いてみましょう。最初にsu塾サイトのIPアドレスを調べてみます。
host www.superusers.jp
結果はこのように表示されたと思います(IPv6は省略しています)。
www.superusers.jp has address 133.130.89.76
次にNeo隊長の趣味サイトである「そらにマイル」のIPアドレスを調べます。
host www.sora2mile.com
表示されたIPアドレスを確認してくださいね。
www.sora2mile.com has address 133.130.89.76
www.superusers.jpと同じIPアドレスが表示されているはずです。
ガチンコ.su塾の使命
このことを知った塾生の中には、自分で構築したサーバーにお客さんとなったユーザーのドメインを割り当ててビジネスを始めている人もいます。
本や他のスクールではこのようなことを教えてくれませんが、エンジニアとしての技術だけではなくて稼ぐ発想を鍛えるのも使命です。
動画講座 WebサーバーApacheのインストール
Apacheのインストール方法
それでは、Apacheのインストールについて学んでいきましょう!
Apacheのインストールには二通りの方法があります。
パッケージ
一つ目は、ディストリビューターが配布しているパッケージをインストールする方法。
コンパイル
二つ目は、ソースファイルをダウンロード、コンパイルしてインストール方法です。
パッケージ版は簡単にインストールできますが、ソースファイルからコンパイルしてインストールするのは手間がかかります。
それでもNeo隊長はApacheのソースファイルをダウンロードして、コンパイル&インストールする方法を選びます。
それには理由があるのですが、ここではApacheがどのようなものなのか手っ取り早く見てもらうためにパッケージ版のApacheをインストールします。
Apacheのインストール方法
最初に書きましたが、Apache(パッケージ)のインストールは簡単です。
sudo yum install httpd httpd-manual
このコマンドだけでApacheがインストールされます。
それぞれのファイルやディレクトリが以下の階層に配置されるので、ポイントとなる部分を説明します。
Apacheの配置場所
├── etc
│ ├── httpd
│ │ ├── conf
│ │ │ ├── httpd.conf ❶ Apacheの設定ファイル
│ │ ├── conf.d
│ │ ├── conf.modules.d
│ │ ├── logs -> ../../var/log/httpd
│ │ └── modules -> ../../usr/lib64/httpd/modules
│ ├── logrotate.d
│ │ └── httpd ❷ ログローテーション設定ファイル
│ └── sysconfig
├── run
│ └── httpd
│ └── htcacheclean
├── usr
│ ├── lib
│ │ ├── systemd
│ │ │ └── system
│ │ │ └── httpd.service ❸ Apacheの起動・停止制御ファイル
│ │ └── tmpfiles.d
│ ├── lib64
│ │ └── httpd
│ │ └── modules
│ ├── libexec
│ │ └── initscripts
│ │ └── legacy-actions
│ │ └── httpd
│ ├── sbin
│ │ ├── httpd ❹ Apacheのhttpdバイナリーファイル
│ └── share
│ ├── doc
│ │ └── httpd-2.4.6
│ ├── httpd
│ │ ├── error
│ │ │ └── include
│ │ ├── icons
│ │ │ └── small
│ │ └── noindex
│ │ ├── css
│ │ │ └── fonts
│ │ │ ├── Bold
│ │ │ ├── BoldItalic
│ │ │ ├── ExtraBold
│ │ │ ├── ExtraBoldItalic
│ │ │ ├── Italic
│ │ │ ├── Light
│ │ │ ├── LightItalic
│ │ │ ├── Regular
│ │ │ ├── Semibold
│ │ │ └── SemiboldItalic
│ │ └── images
│ └── man
│ └── man8
└── var
├── cache
│ └── httpd
│ └── proxy
├── lib
│ └── dav
├── log
│ └── httpd ❺ ログの格納ディレクトリ
└── www
├── cgi-bin ❻ CGIディレクトリ
└── html ❼ ドキュメントルート
Apacheの7つのポイント
Apacheをインストールすると多くのファイルやディレクトリが配置されます。
これらの中でも特に重要、いえ、これだけ知っていれば大丈夫というファイルとディレクトリの役割を7つ厳選して簡単に説明します。
/etc/httpd/httpd.conf
このファイルがApacheの設定ファイルの大本です。httpd.confを見ればどのような設定がなされているのか全てが分かります。
yumでインストールされたApacheであれば/etc/httpd/httpd.confに設置されます。
他のLinuxやソースでインストールしたApacheは設置場所が異なることもあります。
Neo隊長は色々な組織のサーバーを見ることがあります。
その中には自分で構築したもの以外のサーバーもあるのですが、WebサーバーがApacheであればhttpd.confを探します。そういう時に役立つコマンドを紹介します。
sudo updatedb
このコマンドは、システム内のファイルやディレクトリの場所をデータベース化するコマンドです。
データベースを更新した後に、
locate httpd.conf
と入力すれば、瞬時にファイルのディレクトリパスが表示されるので便利です。
/etc/logrotate.d/httpd
sshのログが/var/log/secureに書き込まれるのと同じように、Webサーバーにもアクセスログが記録されます。
アクセスログを放っておくと肥大化しファイルを開くのに時間がかかったりと扱いにくくなることがあります。
そのようなことにならないように標準では1週間に1度、Apacheのログのログローテーションが行われます。
/usr/lib/systemd/system/httpd.service
Apacheを起動したり停止したりする際に参照されるファイルです。
CentOS 6まではサービスの起動や停止はserviceコマンドを使ったり、/etc/init.d配下に配置されているサービス制御スクリプトを利用して直接サービスの制御を行うこともできました。
この講座で使っているCentOS 7では、サービスの起動や停止の設定はsystemctlコマンドを使って行います。
ちなみに、SSHサーバーのファイルも同じディレクトリの中にあります。
/usr/sbin/httpd
Apacheの実行ファイルです。実行ファイルは設定ファイルの内容に沿って動作します。
これはApacheに限ったことではなく他のサーバーでも同じ。
Apacheの設定ファイルはhttpd.conf。sshサーバーはsshd_configと覚えておけば、どのような設定になっているのか自分が構築したサーバーでなくても分かるようになります。
/var/log/httpd
Apacheのアクセスログとエラーログが格納されるディレクトリです。
標準ではこのディレクトリの中にaccess_logとerror_logが作成されます。
/var/www/cgi-bin
デフォルトの設定ではPerlなどで書かれたプログラム、CGI(Common Gateway Interface)を設置する場所です。
/var/www/cgi-binの中にindex.cgiをviで作成してください。
sudo vi /var/www/cgi-bin/index.cgi
下のPerlで書かれたプログラムをコピーしてください。
#!/usr/bin/perl
use strict;
my $host_name = &GetHostByAddr($ENV{'REMOTE_ADDR'});
print "Content-type: text/html; charset=utf-8\n\n";
print "Your host name: $host_name";
exit;
sub GetHostByAddr {
my($ip) = @_;
my @addr = split(/\./, $ip);
my $packed_ip = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]);
my($name) = gethostbyaddr($packed_ip, 2);
return $name;
}
viをインサートモードにしてコピーしたプログラムを貼り付けて保存。
index.cgiのパーミッションを755に変更します。
sudo chmod 755 /var/www/cgi-bin/index.cgi
次に、Webサーバーが使う80番ポートで通信できるようにファイアーウォールの設定を行います。
sudo firewall-cmd –add-service=http –permanent
ファイアーウォールの設定を反映させるために設定をリロードします。
sudo firewall-cmd –reload
Apacheを起動してみましょう。
sudo systemctl start httpd
ブラウザのアドレスバーにサーバーのIPアドレスとcgi-binのPATHを入力してアクセスしてみましょう。
http://サーバーのIPアドレス/cgi-bin/index.cgi
あなたのホスト名が表示されましたか?
/var/www/html
次はドキュメントルートにindex.htmlを作成します。
sudo vi /var/www/html/index.html
下のHTMLソースをコピーしてください。
<!DOCTYPE html>
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<h1>SuperUser</h1>
<h2>SuperUser</h2>
<h3>SuperUser</h3>
<a href="https://www.superusers.jp/su-camp/linux8weeks02-04.html#_varwwwhtml">SuperUser Linux8Weeks02-04</a>
</body>
</html>
viをインサートモードにしてコピーしたHTMLソースを貼り付けて保存。
CGIではパーミッションを変更しましたが、HTMLファイルはその必要はありません。
http://サーバーのIPアドレス/
ブラウザでアクセスしてみてください。
httpd.confの中身
Apacheの設定ファイルを簡単に見ていきたいと思います。
viでhttpd.confを開いてください。
sudo vi /etc/httpd/conf/httpd.conf
viのコマンドモードで行番号を表示させましょう。
:set nu
User / Group
viのコマンドモードでUserを検索するとApacheのUserとGroupの設定に関する行を見つけることができます。
/User
62 # User/Group: The name (or #number) of the user/group to run httpd as.
63 # It is usually good practice to create a dedicated user and group for
64 # running httpd, as with most system services.
65 #
66 User apache
67 Group apache
パッケージ版のApacheをインストールすると、
- /etc/passwd
- /etc/group
- /etc/shadow
にユーザー(apache)が追加されます。
Apacheのソースファイルからインストールする場合は、Apacheのユーザーとグループを手動で追加する必要があるので覚えておいてください。
ErrorLog / CustomLog
次にログに関しての設定を見ていきましょう。
ErrorLog
ErrorLogを検索してください。
/ErrorLog
176 # ErrorLog: The location of the error log file.
177 # If you do not specify an ErrorLog directive within a <VirtualHost>
178 # container, error messages relating to that virtual host will be
179 # logged here. If you *do* define an error logfile for a <VirtualHost>
180 # container, that host’s errors will be logged there and not here.
181 #
182 ErrorLog “logs/error_log”
ServerRootからの相対パスでログの書き込み場所が指定されています。
ServerRootを検索してください。
/ServerRoot
いくつかヒットすると思いますが、以下のような内容のものが設定値です
31 ServerRoot “/etc/httpd”
この結果から/etc/httpd/logs/error_log にエラーログを書き込むということが分かります。
CustomLog
CustomLogを検索してください。
/CustomLog
211行目の行頭に#が入っていてコメントアウトされていますが、アクセスログは標準で/etc/httpd/logs/access_logに書き込まれます。
193 # The following directives define some format nicknames for use with
194 # a CustomLog directive (see below).
195 #
196 LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
197 LogFormat “%h %l %u %t \”%r\” %>s %b” common
198
199 <IfModule logio_module>
200 # You need to enable mod_logio.c to use %I and %O
201 LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\” %I %O” combinedio
202 </IfModule>
203
204 #
205 # The location and format of the access logfile (Common Logfile Format).
206 # If you do not define any access logfiles within a <VirtualHost>
207 # container, they will be logged here. Contrariwise, if you *do*
208 # define per-<VirtualHost> access logfiles, transactions will be
209 # logged therein and *not* in this file.
210 #
211 #CustomLog “logs/access_log” common
211行目のcommonは、197行目のLogFormatを適用するという意味になります。
通常アクセス元や閲覧者の使っているブラウザの種類を記録できるcombinedを指定することが多いです。
cgi-bin
247行目は、http://サーバーのIPアドレス/cgi-bin/ にアクセスがあったら、/var/www/cgi-bin/ 配下を参照するという意味になります。
240 # ScriptAlias: This controls which directories contain server scripts.
241 # ScriptAliases are essentially the same as Aliases, except that
242 # documents in the target directory are treated as applications and
243 # run by the server when requested rather than as documents sent to the
244 # client. The same rules about trailing “/” apply to ScriptAlias
245 # directives as to Alias.
246 #
247 ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
248
249 </IfModule>
250
251 #
252 # “/var/www/cgi-bin” should be changed to whatever your ScriptAliased
253 # CGI directory exists, if you have that configured.
254 #
255 <Directory “/var/www/cgi-bin”>
256 AllowOverride None
257 Options None
258 Require all granted
259 </Directory>
DocumentRoot
DocumentRootとはWeb上に公開することのできるディレクトリのことです。
119行目のように公開するディレクトリのパスを指定をします。
115 # DocumentRoot: The directory out of which you will serve your
116 # documents. By default, all requests are taken from this directory, but
117 # symbolic links and aliases may be used to point to other locations.
118 #
119 DocumentRoot “/var/www/html”
http://サーバーのIPアドレス/ にアクセスがあれば /var/www/html の中を参照するという意味になります。
160 # DirectoryIndex: sets the file that Apache will serve if a directory
161 # is requested.
162 #
163 <IfModule dir_module>
164 DirectoryIndex index.html
165 </IfModule>
先ほど、以下のURLにアクセスしたとき
http://サーバーのIPアドレス/
index.htmlが表示されたのは、164行目のDirectoryIndexでindex.htmlが指定されていたからです。
Apacheのアンインストール
ガチンコ.su塾では、パッケージ版のApacheではなくソースコードをダウンロードしてビルド(コンパイル)したものを使っていきます。
だから今インストールしたApacheをアンインストールします。
Apacheの停止
アンインストールする前にApacheを停止します。
sudo systemctl stop httpd
停止したらyumコマンドでApacheをアンインストール。
sudo yum remove httpd httpd-manual
次の講座は、開発環境を整えてC言語で書かれたプログラムをコンパイルしてみます。
コメント