ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
はじめに
本記事では海外 / 国内主要 VPS (Virtual Private Server) 上で CentOS Stream 9 / RHEL 9 系(AlmaLinux / Rocky Linux 含む)に Apache HTTP Server を導入する手順を、初期セキュリティ・SSL 化までまとめて扱います。
主要 VPS の選定
| VPS | 特徴 | 最安プラン |
|---|---|---|
| Vultr | 世界 30+ リージョン、SSD 標準 | $2.5/月〜 |
| Linode (Akamai) | 歴史と安定性 | $5/月〜 |
| DigitalOcean | 開発者向け UI、Marketplace 豊富 | $4/月〜 |
| さくらの VPS | 国内、円建て、24/7 日本語サポート | 643 円/月〜 |
| ConoHa VPS | 国内、長期割引 | 483 円/月〜 |
| WebARENA Indigo | 低価格 | 349 円/月〜 |
| Hetzner | 欧州、コスパ最強 | €4.59/月〜 |
Step 1: VPS インスタンスの作成
- VPS 管理画面にログイン
- 「Deploy New Server」「サーバー追加」等を選択
- OS: AlmaLinux 9 または Rocky Linux 9 を選択(CentOS 7 は EOL 済、Stream 9 でも可)
- プラン: 1 vCPU / 1GB RAM から開始可能。本番は 2GB+ 推奨
- SSH 鍵を登録(Vultr / Linode はインスタンス作成時に投入可能)
- 起動完了後、表示された IP に SSH
Step 2: 初期セキュリティ設定
SSH 鍵認証セットアップ
# 手元 PC で鍵生成 (まだなら)
ssh-keygen -t ed25519 -C "your-email@example.com"
# 公開鍵を VPS にコピー
ssh-copy-id root@your-vps-ip
# または手動で /root/.ssh/authorized_keys に貼る
# 接続テスト
ssh root@your-vps-ip
# パスワード入力なしでログインできれば OK
非 root 作業ユーザー作成
# 作業ユーザー作成
adduser deploy
passwd deploy
# sudo 権限付与
usermod -aG wheel deploy
# SSH 鍵を deploy ユーザーにコピー
mkdir -p /home/deploy/.ssh
cp /root/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
# deploy で再ログインしてテスト
ssh deploy@your-vps-ip
sudo whoami # root と表示されれば OK
sshd 設定強化
# /etc/ssh/sshd_config を編集
sudo vim /etc/ssh/sshd_config
# 推奨設定:
PermitRootLogin no # root 直接ログイン禁止
PasswordAuthentication no # パスワード認証無効化
PubkeyAuthentication yes # 鍵認証のみ
Port 22022 # デフォルト 22 から変更 (任意)
PermitEmptyPasswords no
MaxAuthTries 3
# 構文チェックして再起動
sudo sshd -t
sudo systemctl restart sshd
# 再ログインで確認 (元の接続は切らずに別ウィンドウで)
ssh -p 22022 deploy@your-vps-ip
システム更新と基本ツール
sudo dnf update -y
# 必須ツール
sudo dnf install -y vim wget curl tar git bash-completion
# EPEL リポジトリ
sudo dnf install -y epel-release
# fail2ban (brute-force 攻撃対策)
sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban
# /etc/fail2ban/jail.local
sudo tee /etc/fail2ban/jail.local > /dev/null <<EOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 3
[sshd]
enabled = true
port = 22022
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Step 3: firewalld 設定
# 状態確認
sudo systemctl status firewalld
# 現在の許可
sudo firewall-cmd --list-all
# SSH ポート変更時は新ポートを許可
sudo firewall-cmd --permanent --add-port=22022/tcp
sudo firewall-cmd --permanent --remove-service=ssh
# HTTP / HTTPS 許可
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 反映
sudo firewall-cmd --reload
# 確認
sudo firewall-cmd --list-all
# クラウド VPS は別途「コントロールパネルの Firewall / Security Group」設定も必須
# Vultr: Firewall Group, AWS: Security Group, Linode: Cloud Firewall
Step 4: Apache HTTP Server 導入
# インストール
sudo dnf install -y httpd
# バージョン確認
httpd -v
# Server version: Apache/2.4.x
# 起動 + 自動起動
sudo systemctl enable --now httpd
# 状態確認
sudo systemctl status httpd
# ブラウザで http://your-vps-ip にアクセス
# → Apache のテストページが表示されれば成功
Step 5: バーチャルホスト設定
# ドキュメントルート作成
sudo mkdir -p /var/www/example.com/public_html
sudo chown -R deploy:deploy /var/www/example.com
# テストページ
echo '<h1>Hello example.com</h1>' > /var/www/example.com/public_html/index.html# /etc/httpd/conf.d/example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/log/httpd/example.com-error.log
CustomLog /var/log/httpd/example.com-access.log combined
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost># 構文チェック
sudo httpd -t
# リロード (無停止)
sudo systemctl reload httpd
# DNS の A レコードを VPS IP に向けたら http://example.com で表示確認
Step 6: SELinux 対応
# SELinux モード確認
getenforce # Enforcing が望ましい
# 標準パス /var/www は最初から httpd_sys_content_t が付いている
# 非標準パスを使う場合
sudo dnf install -y policycoreutils-python-utils
sudo semanage fcontext -a -t httpd_sys_content_t '/data/web(/.*)?'
sudo restorecon -Rv /data/web
# Apache から外部接続(DB / API)
sudo setsebool -P httpd_can_network_connect 1
# Apache から DB 接続
sudo setsebool -P httpd_can_network_connect_db 1
# 拒否ログ
sudo journalctl -t setroubleshoot --since "1 hour ago"
Step 7: PHP インストール
# Remi リポジトリで最新 PHP 8.x
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module enable -y php:remi-8.3
# Apache 連携 (mod_php) + 必須拡張
sudo dnf install -y php php-mysqlnd php-mbstring php-xml php-gd \
php-curl php-zip php-intl php-bcmath
# バージョン
php -v
# PHP 8.3.x
# Apache 再起動 (mod_php 反映のため)
sudo systemctl restart httpd
# 動作確認
echo '<?php phpinfo();' | sudo tee /var/www/example.com/public_html/info.php
# http://example.com/info.php で確認 → 確認後すぐ削除
sudo rm /var/www/example.com/public_html/info.php
Step 8: MariaDB (MySQL 互換)
# MariaDB インストール
sudo dnf install -y mariadb-server
sudo systemctl enable --now mariadb
# 初期セキュリティ設定
sudo mysql_secure_installation
# - root パスワード設定
# - 匿名ユーザー削除
# - リモート root ログイン無効化
# - test DB 削除
# - 権限テーブル再読み込み
# データベース作成
sudo mysql -u root -p <<EOF
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;
EOF
Step 9: Apache or Nginx の選択
| 項目 | Apache | Nginx |
|---|---|---|
| 同時接続性能 | prefork は重い、event MPM で改善 | イベント駆動で軽量 |
| .htaccess | ○ 動的読込 | × 起動時 conf のみ |
| mod_php | ○ | × (PHP-FPM 必須) |
| 静的配信 | ○ | ◎ 高速 |
| リバースプロキシ | △ | ◎ |
| WordPress 互換 | ◎ (.htaccess 文化) | ○ (設定書換必要) |
Step 10: Let's Encrypt SSL 化
sudo dnf install -y certbot python3-certbot-apache
# 証明書取得 + Apache 設定自動書き換え
sudo certbot --apache -d example.com -d www.example.com
# 自動更新は certbot-renew.timer が systemd で動く
sudo systemctl status certbot-renew.timer
sudo certbot renew --dry-run
# 結果: /etc/httpd/conf.d/example.com-le-ssl.conf が自動生成
# → https://example.com で アクセス可能
Step 11: 監視と運用
- アクセスログ:
/var/log/httpd/access_log - エラーログ:
/var/log/httpd/error_log - logrotate は標準で設定済 (
/etc/logrotate.d/httpd) - Uptime 監視: UptimeRobot / Better Uptime / Mackerel
- リソース監視: Netdata, Prometheus + Grafana, Datadog, NewRelic
- バックアップ:
tar+ cron, BorgBackup, クラウド側 Snapshot
ufw / iptables を使う場合(参考)
CentOS 標準は firewalld ですが、Debian 系から移行した場合は ufw / iptables を直接使う場合もあります:
# firewalld を停止して iptables を使う場合(非推奨)
sudo systemctl disable --now firewalld
sudo dnf install -y iptables-services
sudo systemctl enable --now iptables
# ルール例
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22022 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -P INPUT DROP
sudo service iptables save
FAQ
Q: CentOS 7 ではダメ?
A: 2024 年 6 月で EOL。セキュリティパッチが出ないため新規構築は AlmaLinux 9 / Rocky Linux 9 を推奨。
Q: VPS と AWS EC2 の違いは?
A: VPS は固定料金で分かりやすく個人向け。EC2 は従量課金で柔軟、エンタープライズ向け。同等スペックでは VPS が安価。
Q: 初期パスワードログインのまま放置するとどうなる?
A: 数時間以内に全世界から SSH brute-force 攻撃が始まります。必ず鍵認証化 + fail2ban + 不要なら root ログイン無効化を。
Q: バックアップはどう取る?
A: クラウド側の Snapshot 機能(VPS 提供元)+ コンテンツとデータベースを別途オフサイト(S3 / Backblaze B2 等)に保存の二重化が推奨。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?