Linuxサーバー構築入門|ApacheとNginxの設定:黒い画面の恐怖を乗り越え、Webの世界を支える技術

目次

「黒い画面」が怖くて、指が震えた夜

もう15年以上前の話になりますが、私が初めて「Linuxサーバー」というものに触れた日のことは、今でも鮮明に覚えています。
当時の私は、WindowsのGUI(グラフィカルな画面)しか触ったことのない、ひよっこのプログラマーでした。マウスでカチカチすれば何でも動く、アイコンをクリックすればソフトが起動する。そんな世界で生きていたんです。

ある日、先輩から「このWebサイト、テストサーバーに上げといて」と、1台のノートPCを渡されました。
画面を見て、絶句しました。
そこには、真っ黒な背景に、愛想のない白い文字のカーソルが点滅しているだけ。
マウスを動かしてもポインタは現れない。アイコンもない。スタートボタンもない。

「え…これ、どうやって操作するんですか?」

恐る恐るキーボードを叩いてみました。ls とか cd とか、ネットで調べたコマンドを見よう見まねで。
すると画面には、「Permission denied(権限がありません)」という無慈悲なエラーメッセージ。
何をしていいかわからず、変なコマンドを打ってサーバーを壊してしまうんじゃないかという恐怖で、指先が冷たくなったのを覚えています。

「自分には向いていないかもしれない」

そう本気で思いました。でも、逃げるわけにはいかなかった。
泣きそうになりながら黒い画面と格闘し、エラーログを読み漁り、ようやくWebページが表示された時のあの瞬間。
ブラウザのアドレスバーにIPアドレスを打ち込み、Enterキーを押した直後、画面に「Hello World」が表示された時の、あの震えるような感動。

今の私は断言できます。
この「黒い画面(ターミナル)」の向こう側には、無限の自由が広がっています。
世界中のWebサイトの大部分を支えているLinuxサーバー。そして、そこで動くWebサーバーソフトであるApacheやNginx。
これらを自在に操れるようになった時、あなたは単なる「利用者」から、Webの世界を構築する「創造主」へと進化します。

「インフラなんて難しそう」
「クラウド(AWSなど)全盛の時代に、Linuxの中身を知る必要あるの?」

そう思うかもしれません。私もそう思っていました。
でも、クラウドの裏側で動いているのは結局Linuxです。Webサーバーの設定を知らなければ、クラウドの便利な機能も使いこなせません。
そして何より、このスキルは「食いっぱぐれない」んです。
派手なアプリ開発に比べて地味ですが、サーバー構築・運用のスキルは、どの現場でも、どんな時代でも、喉から手が出るほど求められています。

今回は、かつて黒い画面の前で震えていた私が、どうやってLinuxサーバーと仲良くなり、ApacheやNginxを使いこなして飯を食えるようになったのか。その知識と経験を、泥臭い失敗談も交えながら、徹底的に解説します。
教科書的なコマンドの羅列ではありません。現場で「使える」生きた知識を持ち帰ってください。

深夜のオフィスで、真っ黒な画面(ターミナル)が表示されたモニターを前に、冷や汗をかきながらキーボードに手を置いている若手エンジニアの背中を描いた線画イラスト

Webサーバーって結局なに? レストランのウェイターに例えてみる

技術的なコマンドを覚える前に、そもそも「Webサーバー」とは何なのか、そのイメージを共有しておきましょう。
専門書には「HTTPリクエストを受け取り、適切なレスポンスを返すソフトウェア」なんて書いてありますが、これだと眠くなりますよね。

私はよく、Webサーバーを「レストランのウェイター」に例えて説明しています。

  • お客さん(Webブラウザ/ユーザー): 「この料理(ページ)ください」と注文します。
  • ウェイター(Webサーバー): 注文を聞き、厨房に伝え、出来上がった料理をお客さんのテーブルまで運びます。
  • 厨房(プログラミング言語/DB): PHPやRubyなどのシェフが、食材(データ)を調理して料理を作ります。

Webサーバー(ApacheやNginx)の仕事は、お客さんからの注文(URLへのアクセス)を正しく受け取り、静的なメニュー(画像やHTML)ならそのまま渡し、手の込んだ料理(動的コンテンツ)なら厨房にオーダーを通すことです。
もしウェイターがいなければ、いくら美味しい料理を作るシェフ(プログラム)がいても、お客さんは注文すらできません。
Webサービスにおいて、Webサーバーは「お店の顔」であり、サービスの入り口を守る重要な役割を担っているのです。

なぜLinuxなのか? Windowsじゃダメなのか?

「WindowsでもWebサーバーは立てられるじゃん」
その通りです。IIS(Internet Information Services)というソフトがあります。
でも、世の中のWebサーバーのシェアは圧倒的にLinux(Unix系)です。なぜか。

理由はシンプル。
「軽くて、安定していて、無料だから」です。

サーバーというのは、24時間365日働き続けるブラック企業のような環境です。そこでWindowsのように「更新プログラムがあるので再起動します」なんて勝手に休憩されたら困りますよね。
Linuxは、必要な機能だけを厳選して動かせるため、非常に安定しています。GUI(グラフィカルな画面)すらないので、余計なメモリも食いません。
そして、オープンソースなのでOS代がかかりません。サーバーを100台、1000台と増やす大規模サービスにおいて、OSライセンス料がタダというのは、経営的に最強のメリットなんです。

Apache vs Nginx 仁義なき戦い

Webサーバーソフトには、長年ライバル関係にある二大巨頭が存在します。
老舗のApache(アパッチ)と、新鋭のNginx(エンジンエックス)です。
「どっちを使えばいいの?」というのは、エンジニア界隈で常に議論されるテーマ(宗教戦争に近いもの)ですが、それぞれの特徴を知れば、迷うことはありません。

Apache:頼れる万能執事

Apache HTTP Serverは、インターネットの黎明期からWebを支えてきた、超ベテランです。
私が業界に入った頃は「WebサーバーといえばApache」一択でした。
彼(擬人化するなら、経験豊富な初老の執事)の特徴は、「多機能で、融通が利くこと」です。

  • 動的コンテンツが得意: PHPなどのプログラムを、サーバー内部のモジュールとして組み込んで動かすことができます。
  • .htaccess が使える: これが最大の特徴であり、今でもApacheが選ばれる理由です。ディレクトリごとに設定ファイルを置いて、手軽にアクセス制限やリダイレクト設定ができます。レンタルサーバーでよく使われるのもこれが理由です。

ただし、弱点があります。
「一度にたくさんのお客さんが来ると、パニックになる」ことです。
Apacheは、お客さん一人ひとりに対して、専属のウェイター(プロセス/スレッド)を割り当てる「プロセス駆動モデル」を採用しています。お客さんが1万人来たら、ウェイターも1万人必要になる。これではメモリが足りなくなり、サーバーがダウンしてしまいます。これを「C10K問題(クライアント1万台問題)」と呼びます。

Nginx:超高速なサイボーグ忍者

そんなApacheの弱点を克服するために生まれたのが、Nginxです。
彼(擬人化するなら、超高速で仕事をさばくサイボーグ忍者)の特徴は、「とにかく大量のアクセスをさばけること」です。

  • イベント駆動モデル: 少数のウェイターが、高速で店内を動き回り、一人で何千人もの注文をさばくイメージです。メモリ消費が非常に少なく、大量の同時接続に強い。
  • 静的コンテンツが爆速: 画像やCSSファイルを返す速度は、Apacheより圧倒的に速いです。
  • リバースプロキシ機能: 自分の後ろに別のサーバーを置いて、アクセスを振り分ける「司令塔」としての能力が非常に高い。

弱点は、Apacheほど器用ではないこと。.htaccess は使えませんし、PHPを動かすにも別のプログラム(PHP-FPM)と連携する必要があります。設定もシステム全体で管理する必要があり、手軽さという点ではApacheに劣ります。

現場でのリアルな使い分け

現代のWeb開発現場での使い分けは、ざっくりこうです。

  • 手軽に済ませたい、WordPressをレンタルサーバーで動かす、社内ツール: Apache
  • 大量アクセスが予想される、Webアプリのフロント、マイクロサービス: Nginx

あるいは、「Nginxを最前線に置いて、後ろでApacheを動かす」というハイブリッド構成もよく使われます(後述します)。
副業エンジニアとしては、両方の基本的な設定ができるようになっておくのが、案件獲得への近道です。どちらか一方しか知らないと、対応できる案件が半減してしまいますから。

Apacheをイメージした重厚な執事と、Nginxをイメージした近未来的な忍者が背中合わせに立っている様子。それぞれの特徴を表すアイテム(執事は分厚い本、忍者は手裏剣のような光)を持っているイラスト

実践!ApacheでWebサーバーを構築する

では、実際に手を動かしていきましょう。
ここでは、AWSのEC2(Amazon Linux 2023)や、一般的なCentOS/RHEL系を想定して解説します。(Ubuntuの人は yumapt に読み替えてくださいね)

1. インストールと起動

まずは、パッケージマネージャーを使ってApacheをインストールします。Linuxではソフトのインストールもコマンド一発です。黒い画面を開いて、打ち込んでみてください。

# インストール
sudo yum install httpd -y

# バージョン確認(これが出ればOK)
httpd -v

インストールできたら、起動します。
ここで忘れてはいけないのが、「自動起動の設定」です。
サーバーというのは、たまに再起動が必要です。その時、Webサーバーが勝手に立ち上がってくれないと、深夜のメンテナンス後に「サイトが見れません!」とクライアントから電話がかかってくることになります。私はこれで一度、デート中に呼び出されたことがあります。二度と御免です。

# 起動
sudo systemctl start httpd

# 自動起動を有効化
sudo systemctl enable httpd

# ステータス確認(active (running) ならOK)
sudo systemctl status httpd

2. 設定ファイルの歩き方

Apacheの魂とも言える設定ファイルは、通常 /etc/httpd/conf/httpd.conf にあります。
このファイルを開くと、英語のコメントと設定がズラリと並んでいて、初心者はここで「ウッ」となります。わかります、私もそうでした。
でも、最初に見るべきポイントは限られています。

# ドキュメントルート(Webサイトのファイル置き場)
DocumentRoot "/var/www/html"

# ポート番号(通常は80)
Listen 80

# ユーザーとグループ(誰の権限で動くか)
User apache
Group apache

基本的には、この DocumentRoot で指定された場所(/var/www/html)に index.html を置けば、ブラウザからアクセスできるようになります。まずはここだけ押さえておけばOKです。

3. バーチャルホスト(VirtualHost)の設定

一つのサーバーで、複数のドメイン(例:siteA.comsiteB.com)を運用したい。そんな時に使うのがバーチャルホストです。
副業で「コスト削減のために1台のサーバーに複数のサイトを同居させたい」という相談はめちゃくちゃ多いので、これは必須スキルです。

/etc/httpd/conf.d/ ディレクトリの下に、siteA.conf のようなファイルを作り、以下のように記述します。

<VirtualHost *:80>
    ServerName siteA.com
    DocumentRoot /var/www/siteA
    ErrorLog logs/siteA-error_log
    CustomLog logs/siteA-access_log common
</VirtualHost>

こうすることで、Apacheは「あ、siteA.comへのアクセスだな。じゃあこっちのフォルダを見せよう」と判断してくれます。
設定ファイルを書き換えたら、必ず構文チェックをしてから再起動しましょう。これをサボって、スペルミスで本番サーバーを停止させた時の冷や汗といったら…思い出したくもありません。

# 設定ファイルの構文チェック(Syntax OKなら安心)
sudo apachectl configtest

# 設定の再読み込み(停止させずに反映)
sudo systemctl reload httpd
薄暗い部屋で、複数のモニターに囲まれたエンジニアが、Apacheの設定ファイル(httpd.conf)を慎重に編集している様子。画面には複雑なコードが表示され、緊張感が漂うイラスト

実践!Nginxで爆速サーバーを作る

次はNginxです。最近のモダンなWeb開発現場では、こちらが標準になりつつあります。私も最近の新規構築案件はほとんどNginxです。

1. インストールと起動

手順はApacheとほぼ同じです。

# インストール
sudo yum install nginx -y

# 起動と自動起動
sudo systemctl start nginx
sudo systemctl enable nginx

2. 設定ファイルの構造

Nginxの設定ファイルは /etc/nginx/nginx.conf がメインですが、Apacheよりも構造が構造化(ブロック化)されていて、プログラマーには読みやすいかもしれません。括弧 {} で囲まれているので、プログラムコードに近い感覚です。

http {
    # 全体的な設定
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # ログのフォーマット定義など

    # 個別のサイト設定を読み込む
    include /etc/nginx/conf.d/*.conf;
}

個別のサイト設定は /etc/nginx/conf.d/ の下に siteA.conf のように作ります。

3. serverブロックとlocationブロック

Nginxの設定の肝は、このブロックの理解です。

server {
    listen       80;
    server_name  siteA.com;
    root         /usr/share/nginx/html;

    # 基本のアクセス設定
    location / {
        index  index.html index.htm;
    }

    # 画像ファイルなどはキャッシュを効かせる
    location ~* \.(jpg|jpeg|png|gif|css|js)$ {
        expires 30d;
        access_log off;
    }
}

location ブロックを使うことで、「画像の時だけ特別な処理をする」「/api/ へのアクセスは別のプログラムに飛ばす」といった柔軟な制御が可能になります。
特に静的ファイル(画像など)の配信設定をチューニングすることで、Webサイトの表示速度を劇的に改善できます。これは「サイトが重いからなんとかして」という案件で非常に役立ちます。キャッシュ設定を一行入れるだけで爆速になり、クライアントに魔法使い扱いされたこともあります。

現場のリアル:リバースプロキシという必殺技

さて、ここからが少しプロっぽい話です。
実際の現場では、「Nginxをリバースプロキシとして使う」構成が非常に多いです。

「リバースプロキシ? 逆の代理人?」
難しく聞こえますが、要は「受付係」のことです。

インターネットからのアクセスを、まずNginx(受付係)が受け取ります。

  • 「画像の注文? はい、それは私が持ってます(高速配信)」
  • 「プログラムの処理? それは後ろにいるアプリケーションサーバー(PHPやPython、Node.jsなど)にお願いします」

こうやって役割分担をすることで、全体のパフォーマンスを最大化するのです。
設定例を見てみましょう。

server {
    listen 80;
    server_name my-app.com;

    location / {
        # 後ろにいるアプリ(例:ポート3000で動くNode.js)に丸投げする
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

この proxy_pass という一行が、リバースプロキシの魔法です。
これを使えば、Nginxの後ろにWordPress(Apache)を置いたり、Railsを置いたり、Node.jsを置いたりと、自由自在な構成が組めます。
「WordPressが重い」という相談を受けた時、手前にNginxを置いてキャッシュさせるだけで、劇的に速くなります。知っているか知らないかだけで、提案の幅が大きく変わる技術です。

ホワイトボードの前で、エンジニアが「Nginxのリバースプロキシ構成」を図解しているシーン。Nginxが受付となり、後ろのアプリケーションサーバーに指示を出しているような図を描いているイラスト

サーバー構築でハマる「落とし穴」と対処法

コマンド通りにやったのに動かない。ブラウザで見ても「接続できません」。
初心者の9割はここで心が折れます。私も何度もPCを投げそうになりました。
でも安心してください。原因はたいてい決まっています。私が何百回とハマった落とし穴を共有します。

1. Firewall(防火壁)が閉じている

サーバーソフトは動いているのに、外から繋がらない。
これは間違いなくFirewallの仕業です。サーバーはデフォルトで、外部からの接続を遮断しています。
AWSなら「セキュリティグループ」の設定で、80番ポート(HTTP)と443番ポート(HTTPS)を開放する必要があります。
サーバー内部でも firewalldiptables が動いている場合は、そこでも穴を開ける必要があります。

「家(サーバー)の中に人はいるのに、玄関のドア(ポート)が溶接されて開かない状態」だと思ってください。ドアを開けましょう。

2. 権限(Permission)の悪夢

「403 Forbidden」というエラーが出たら、それは「お前には見せる権限がない」と言われています。
Webサーバー(ApacheやNginx)は、通常 apachenginx といった専用のユーザー権限で動いています。
公開したいファイル(index.htmlなど)の持ち主(オーナー)が root になっていたり、パーミッション(権限設定)が 700(自分しか見れない)になっていたりすると、Webサーバーはファイルを読み取れません。

chown コマンドで持ち主を変えるか、chmod コマンドで読み取り権限(その他ユーザーにRead権限)を与えてあげる必要があります。
初心者の頃、これに気づかずに3時間悩み続けたことがあります。ログを見れば一発なんですが、焦っているとログを見る余裕すらなくなるんですよね。

3. SELinuxという番犬

LinuxにはSELinuxという強力なセキュリティ機能があります。これが有効になっていると、正しい設定をしていても「変な動きをした」とみなされてアクセスをブロックされることがあります。
初心者のうちは、一旦無効化(setenforce 0)して動作確認するのも一つの手です。もちろん本番運用では適切に設定すべきですが、学習段階ではこの番犬に噛みつかれて挫折する人が多すぎます。

4. ログを見ろ、とにかくログを見ろ

動かない時、画面の前で腕組みしていても解決しません。
サーバーは、自分がなぜ動かないのか、ちゃんと日記(ログ)に書いてくれています。

  • Apache: /var/log/httpd/error_log
  • Nginx: /var/log/nginx/error.log

このファイルを tail -f コマンドでリアルタイム監視しながら、ブラウザでアクセスしてみるのです。
そこに答えは書いてあります。「ファイルがない」「設定ファイルの〇行目がおかしい」「権限がない」。
ログと友達になること。これがインフラエンジニアへの最短ルートです。

PC画面に表示された「503 Service Temporarily Unavailable」のエラー表示を見て、エンジニアが冷静に黒い画面でログ(error_log)を確認し、原因を特定しようとしている様子のイラスト

副業エンジニアとしてのサーバー構築スキル

最後に、このスキルがどう仕事に繋がるのか、お金の話をしましょう。

プログラミングスクールでは、RubyやPHPの書き方は教えてくれますが、それを「本番サーバーで動かし続ける方法」までは深く教えないことが多いです。
だからこそ、「インフラもわかるWebエンジニア」は希少価値が高いのです。

WordPress高速化・移行案件

クラウドソーシングなどで意外と多いのが、「WordPressサイトが重いからなんとかして」「サーバーを引っ越したい」という案件です。
これらは、PHPのコードをいじるよりも、Webサーバーの設定(Nginxへの移行やキャッシュ設定)や、サーバーのスペック調整で解決することが多いです。
「Kusanagi」のような高速化技術を使うのも手です。
原因調査から対応まで含めて、数万円~数十万円の単価になることもあります。私もよくこの手の案件で小遣い稼ぎをしています。

SSL化(HTTPS化)対応

今どき、鍵マークのつかない(http://)サイトは、ブラウザから警告が出されます。
「Let's Encrypt」という無料のSSL証明書を使えば、コマンド数回でHTTPS化が可能です。
certbot というツールを使えば、証明書の取得からWebサーバーの設定書き換え、定期更新まで自動化できます。
これも「サイトを安全にしたい」というクライアントにとっては、喉から手が出るほど欲しい技術です。

FAQ:初心者が抱えるモヤモヤ

Q. 結局、最初はどっちを覚えればいいの?
A. 個人的にはNginxをおすすめします。モダンな現場での採用率が高いのと、設定ファイルの書き方が直感的だからです。でも、古いシステムの保守案件などではApacheも現役なので、知識として「こういうものだ」と知っておくことは重要です。

Q. Dockerを使えば、サーバー構築なんていらないのでは?
A. 確かにDocker(コンテナ技術)は便利ですが、そのDockerコンテナを動かす土台(ホストOS)や、コンテナ内のWebサーバー設定(nginx.confなど)の知識は結局必要になります。基礎を知らずにDockerを使うと、トラブルが起きた時に手も足も出なくなります。まずは生(ベアメタル)のLinuxで構築してみる経験が、後で活きてきます。

Q. サーバー構築の勉強はどうやってすればいい?
A. 自分のPCにVirtualBoxを入れるか、AWSの無料枠を使って、実際にサーバーを立てて壊してを繰り返すのが一番です。「Webサーバーを立てて、自分のスマホからアクセスして『Hello World』を見る」。この成功体験を一度味わってください。感動しますよ。

黒い画面の向こうにある自由

ここまで、Linuxサーバー構築とWebサーバーの設定について、駆け足で解説してきました。
コマンドだらけで、頭が痛くなったかもしれません。

でも、思い出してください。
あなたが普段何気なく見ているWebサイトやアプリも、すべてこの「黒い画面」の中で動いているプログラムたちが、せっせと働いているおかげで表示されているんです。

夜のオフィスで、エンジニアが自分のPC画面を見ている。画面にはターミナルのログが緑色で流れ続け、正常に稼働しているサーバーのモニタリンググラフが表示されている。コーヒーを飲みながら、安定稼働しているシステムを満足げに見守っている様子

私が初めて自分で立てたサーバーに、ブラウザからアクセスしてページが表示された時。
それは単なる「Hello World」の文字でしたが、私にとっては「世界と繋がった」瞬間でした。
自分の手で構築した城(サーバー)が、インターネットという広大な海の中に存在している。その全能感とワクワク感は、何物にも代えがたいものでした。

サーバー構築ができるようになると、あなたはもう「誰かが作った環境」に縛られることはありません。
自分の好きな言語で、好きな構成で、好きなサービスを世界中に公開できる。
その自由を手に入れるための鍵が、Apacheであり、Nginxであり、Linuxなのです。

怖がらずに、ターミナルを開いてみてください。
最初はエラーの嵐かもしれません。でも、そのエラーの一つ一つが、あなたを強いエンジニアへと育ててくれます。
私もそうやって、何度もサーバーを壊しながらここまで来ました。

さあ、あなたの最初のサーバーを立ち上げましょう。
Webの世界は、あなたのコマンドを待っています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いたエンジニア

上原 玲のアバター 上原 玲 インフラエンジニア

インフラ構築に強く、AWS・GCPを用いた大規模環境の運用経験が豊富。冷静な判断と堅実な設計で、チームからの信頼が厚い。多趣味で、最近は写真撮影にハマり中。休日はカメラを片手に各地を巡る。穏やかな雰囲気で後輩にも優しい。

目次