「黒い画面」が怖くて、指が震えた夜
もう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でWebサーバーを構築する
では、実際に手を動かしていきましょう。
ここでは、AWSのEC2(Amazon Linux 2023)や、一般的なCentOS/RHEL系を想定して解説します。(Ubuntuの人は yum を apt に読み替えてくださいね)
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.com と siteB.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

実践!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を置いてキャッシュさせるだけで、劇的に速くなります。知っているか知らないかだけで、提案の幅が大きく変わる技術です。

サーバー構築でハマる「落とし穴」と対処法
コマンド通りにやったのに動かない。ブラウザで見ても「接続できません」。
初心者の9割はここで心が折れます。私も何度もPCを投げそうになりました。
でも安心してください。原因はたいてい決まっています。私が何百回とハマった落とし穴を共有します。
1. Firewall(防火壁)が閉じている
サーバーソフトは動いているのに、外から繋がらない。
これは間違いなくFirewallの仕業です。サーバーはデフォルトで、外部からの接続を遮断しています。
AWSなら「セキュリティグループ」の設定で、80番ポート(HTTP)と443番ポート(HTTPS)を開放する必要があります。
サーバー内部でも firewalld や iptables が動いている場合は、そこでも穴を開ける必要があります。
「家(サーバー)の中に人はいるのに、玄関のドア(ポート)が溶接されて開かない状態」だと思ってください。ドアを開けましょう。
2. 権限(Permission)の悪夢
「403 Forbidden」というエラーが出たら、それは「お前には見せる権限がない」と言われています。
Webサーバー(ApacheやNginx)は、通常 apache や nginx といった専用のユーザー権限で動いています。
公開したいファイル(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 コマンドでリアルタイム監視しながら、ブラウザでアクセスしてみるのです。
そこに答えは書いてあります。「ファイルがない」「設定ファイルの〇行目がおかしい」「権限がない」。
ログと友達になること。これがインフラエンジニアへの最短ルートです。

副業エンジニアとしてのサーバー構築スキル
最後に、このスキルがどう仕事に繋がるのか、お金の話をしましょう。
プログラミングスクールでは、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サイトやアプリも、すべてこの「黒い画面」の中で動いているプログラムたちが、せっせと働いているおかげで表示されているんです。

私が初めて自分で立てたサーバーに、ブラウザからアクセスしてページが表示された時。
それは単なる「Hello World」の文字でしたが、私にとっては「世界と繋がった」瞬間でした。
自分の手で構築した城(サーバー)が、インターネットという広大な海の中に存在している。その全能感とワクワク感は、何物にも代えがたいものでした。
サーバー構築ができるようになると、あなたはもう「誰かが作った環境」に縛られることはありません。
自分の好きな言語で、好きな構成で、好きなサービスを世界中に公開できる。
その自由を手に入れるための鍵が、Apacheであり、Nginxであり、Linuxなのです。
怖がらずに、ターミナルを開いてみてください。
最初はエラーの嵐かもしれません。でも、そのエラーの一つ一つが、あなたを強いエンジニアへと育ててくれます。
私もそうやって、何度もサーバーを壊しながらここまで来ました。
さあ、あなたの最初のサーバーを立ち上げましょう。
Webの世界は、あなたのコマンドを待っています。
