# Ubuntu で Web サーバーを構築する手順

# Ubuntu を使う理由

今まで CentOS を Web サーバーの構築に使っていましたが、サポート終了を受け、後続の RockyLinux にするか Ubuntu にするかを悩んでました。

# Ubuntu と Rocky Linux を比較

  • 基盤
    Ubuntu: Ubuntu は Debian ベースのディストリビューションであり、デスクトップおよびサーバー用途の幅広いバリエーションが提供されています。Canonical Ltd.によって開発・サポートされています。
    Rocky Linux: Rocky Linux は、RHEL (Red Hat Enterprise Linux) と互換性のあるクローンディストリビューションで、CentOS の代替として開発されました。Rocky Linux は、CentOS Stream の変更に対するコミュニティの要望に応えるために誕生しました。
  • パッケージ管理
    Ubuntu: Debian ベースなので、APT (Advanced Package Tool) パッケージ管理システムを使用します。
    Rocky Linux: RHEL ベースなので、DNF (Dandified Yum) パッケージ管理システムを使用します。
  • リリースサイクル
    Ubuntu: LTS(Long Term Support)バージョンと通常のリリースバージョンがあります。LTS バージョンは 5 年間のサポートが提供されます。
    Rocky Linux: Rocky Linux は、RHEL と同様に長期サポートを提供し、CentOS Stream の変更に関係なく安定性を維持しようとしています。
  • ライセンス
    Ubuntu: Ubuntu はオープンソースで、多くのパッケージが GPL といったオープンソースライセンスで提供されています。
    Rocky Linux: Rocky Linux もオープンソースであり、RHEL と同様にオープンソースコミュニティからの貢献を受けています。
  • エコシステム
    Ubuntu: Ubuntu は幅広いエコシステムとコミュニティに支えられており、デスクトップからクラウド、IoT、コンテナまで幅広い領域で利用されています。
    Rocky Linux: Rocky Linux は RHEL との互換性を持ち、企業やサーバー環境での利用に適しています。

Ubuntu は広く普及しており、デスクトップ環境でも使いやすい一方、Rocky Linux はエンタープライズ環境やサーバーでの安定性が求められる場合に適しています。

# Ubuntu を使用する主要な理由

  1. オープンソースとコミュニティサポート
    Ubuntu はオープンソースの Linux ディストリビューションであり、多くのパッケージとツールがオープンソースライセンスで提供されています。また、広範なコミュニティサポートが存在し、問題の解決や質問への回答が得やすいです。
  2. 簡単なインストールと使用
    Ubuntu はインストールが比較的簡単で、新しいユーザーでも使いやすいデスクトップ環境を提供します。さらに、シンプルなコマンドを用いてソフトウェアのインストールやアップデートが行えます。
  3. 包括的なパッケージ管理
    Ubuntu は APT(Advanced Package Tool)と呼ばれる優れたパッケージ管理システムを使用しており、数千ものパッケージが公式リポジトリから利用可能です。これにより、必要なソフトウェアやツールを簡単にインストールできます。
  4. 幅広いアプリケーションサポート
    Ubuntu はデスクトップからサーバー、クラウド、IoT デバイス、コンテナまで、さまざまなプラットフォームで利用されており、幅広いアプリケーションと技術スタックに対応しています。
  5. 長期サポート(LTS)バージョン
    Ubuntu は LTS(Long Term Support)バージョンを提供しており、これらのバージョンは 5 年間のセキュリティアップデートとサポートが提供されます。これは、安定性と信頼性が求められるサーバー環境で特に重要です。
  6. クラウドインフラストラクチャのサポート
    Ubuntu は AWS、Azure、Google Cloud Platform など、主要なクラウドプロバイダーにおいて公式にサポートされており、クラウドネイティブアプリケーションの開発と運用が容易です。
  7. 活発なコミュニティとドキュメンテーション
    Ubuntu には活発なコミュニティが存在し、多くのオンラインリソースやドキュメンテーションが利用可能です。問題解決や情報の入手が迅速に行えます。

# Nginx を使う理由

Apache と Nginx は、両方とも人気のあるオープンソースの Web サーバーソフトウェアですが、Apache は柔軟性が高く、モジュールを多用することができます。.htaccess ファイルのサポートにより、共有ホスティング環境での利用が便利です。一方で、静的ファイルの高速配信や高負荷の状況に対するパフォーマンスでは、Nginx が優れています。Nginx は高パフォーマンスなリバースプロキシとして特に優れており、静的コンテンツの効率的な配信や負荷分散に適しています。また、設定がシンプルでリソース効率が高いため、Web サーバーやリバースプロキシとしての採用が増えています。

# Apache の特徴

  • 歴史と普及度
    Apache は最も古い Web サーバーソフトウェアの 1 つであり、長い歴史を持っています。そのため、多くのウェブサイトやアプリケーションで広く使用されています。
  • モジュール性
    Apache はモジュール性が高く、さまざまなモジュールを組み合わせて機能を拡張できます。これにより、柔軟性が高く、カスタマイズが容易です。
  • .htaccess ファイル
    Apache は.htaccess ファイルをサポートし、ディレクトリごとに設定をカスタマイズできるため、共有ホスティング環境で有用です。
  • モジュールとコミュニティ
    Apache は豊富なモジュールとコミュニティサポートがあり、さまざまな要件に対応できます。

# Nginx の特徴

  • パフォーマンス
    Nginx は高性能な Web サーバーソフトウェアで、静的ファイルの高速な配信と高い同時接続数を処理できます。特にリバースプロキシとして優れたパフォーマンスを発揮します。
  • イベント駆動アーキテクチャ
    Nginx はイベント駆動アーキテクチャを採用しており、少ないリソースで高負荷の状況に対応できるため、効率的なリソース利用が可能です。
  • リバースプロキシ
    Nginx はリバースプロキシとして優れた機能を提供し、バックエンドの Web アプリケーションサーバーへのリクエストの制御や負荷分散が得意です。
  • シンプルな設定
    Nginx の設定は比較的シンプルで直感的であり、軽量でありながら効果的な設定が行えます。
  • コミュニティとエコシステム
    Nginx には広範なコミュニティサポートとエコシステムがあり、カスタムモジュールやサードパーティの拡張機能も利用できます。

# 環境構造

  • Ubuntu 22.04 LTS
  • Nginx
  • Mysql
  • PHP 8.2

# Ubuntu ユーザー追加

adduser hapicode

# 追加したユーザーにも管理者権限を与える
usermod -aG sudo hapicode

# ユーザー切り替え
su - hapicode

# ユーザー削除
deluser hapicode

# ユーザー削除ホームディレクトリも一緒に
deluser hapicode --remove-home

# Ubuntu サービス管理

# 現在起動しているサービスの一覧を表示
systemctl -t service

# --all で停止中も含めて全サービスをリスト
systemctl -t service --all

# サービスの起動設定の一覧を表示
systemctl list-unit-files -t service

# サービス停止
systemctl stop nginx

# サービス無効化
systemctl disable nginx

# Nginx インストール

# パッケージインストール
apt -y install nginx

# 設定ファイル編集
vim /etc/nginx/sites-available/default

# nginx リロード
systemctl reload nginx

# Nginx 設定まわり

/etc/nginx/sites-available/hapicode.com


server {

	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	# Add index.php to the list if you are using PHP
    server_name hapicode.com;
	root /var/www/api.uniauc.jp/public;
	index index.php index.html;
    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php$query_string;
    }

    location = /favicon.ico {
            access_log off;
            log_not_found off;
    }

    location = /robots.txt {
            access_log off;
            log_not_found off;
    }

    # error_page 404 /404.html;

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_pass  unix:/run/php/php8.2-fpm.sock;
		fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
	}

    location ~ /\.(?!well-known).* {
            deny all;
    }

	# location / {
	# 	# First attempt to serve request as file, then
	# 	# as directory, then fall back to displaying a 404.
	# 	try_files $uri $uri/ =404;
	# }

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}


    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/hapicode.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hapicode.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}
server {
    if ($host = hapicode.com) {
        return 301 https://$host$request_uri;
    }


	listen 80 ;
	listen [::]:80 ;
    server_name hapicode.com;
    return 404;
}

# Lets Encrypt SSL 証明書導入

Ubuntu の Nginx ウェブサーバーに Let's Encrypt SSL 証明書を導入

# Certbotのインストール
apt install certbot python3-certbot-nginx

# Certbotが自動的にNginxの設定を調整し、SSL証明書の取得と設定
certbot --nginx -d hapicode.com

# 証明書の自動更新をテスト
certbot renew --dry-run

# Mysql 初期設定

初期設定

mysql_secure_installation

# [Unix_Socket] 認証に切り替えるか否か
# [no] でも root のみ デフォルトで [Unix_Socket] 認証は有効
Switch to unix_socket authentication [Y/n] n

# root パスワードを設定すると パスワードでも root ログイン可能となる
# root パスワードを設定しない場合は OS の root ユーザーのみが MariaDB root ユーザーとしてログイン可
Change the root password? [Y/n] n

# 匿名ユーザーは削除する
Remove anonymous users? [Y/n] y

# root のリモートログインは無効とする
Disallow root login remotely? [Y/n] y

# テストデータベースは削除する
Remove test database and access to it? [Y/n] y

# 特権情報をリロードする
Reload privilege tables now? [Y/n] y

# Mysql 接続

# ログイン
mysql -u root -p

# ルート権限確認
MariaDB [(none)]> show grants for root@localhost;
+-----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                               |
+-----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+-----------------------------------------------------------------------------------------------------------------------------------------+

# ユーザー情報一覧表示
MariaDB [(none)]> select user,host,password from mysql.user;
+-------------+-----------+----------+
| User        | Host      | Password |
+-------------+-----------+----------+
| mariadb.sys | localhost |          |
| root        | localhost | invalid  |
| mysql       | localhost | invalid  |
+-------------+-----------+----------+

# PHP 8.2 インストール

Ubuntu のパッケージリストを更新し、必要なパッケージをインストール

apt update
apt upgrade

# 依存パッケージ
apt install -y curl php8.2 php8.2-fpm php8.2-mbstring php8.2-xml php8.2-mysql php8.2-json php8.2-zip unzip git mysql-client

# composer install
curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

# ゴミ処理
apt -y autoremove \
    && apt clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
2023-10-05
  • server
  • nginx

関連記事

積水ハウス 個人情報流出 SQL インジェクション攻撃か
ZeroSSL で無料 SSL できるけど Let's Encrypt と比較
ジェネレーティブ AI と大規模言語モデル(LLM)を学ぶためのリソース
XZ Utils 事件対応
メールサーバー移行と POP & IMAP 設定
Docker Supervisor 使ってバッチ処理
よく使う WSL コマンド
自宅サーバー構築!  Nextcloud で NAS クラウドストレージ
no such file or directory: /usr/share/zsh/vendor-completions/_docker
oh my zsh 使うべし
AWS CloudWatch ログ監視で Lambda 処理
AWS SES メール開封確認  DB に集計
Vim 操作とショートカット
DDNS 無料ダイナミック DNS サービス 4 つ
Nginx 基本設定
SPF メール送信なりすまし対策
Windows Mac Linux hosts ファイル場所
AWS Unresolved resource dependencies [AWSEBV2LoadBalancer] エラー
ディスク容量を確認する df コマンド
Laravel Address already in use の原因
content-security-policy 設定
AWS Elastic Beanstalk php.ini 設定変更
AWS Elastic Beanstalk 環境設定
AWS のタイムゾーンを UTC 協定世界時から JST 日本標準時に変更
Docker の基本的な使い方
Amazon DynamoDB 制限調査
AWS 504 Gateway Timeout エラー対応
Shell と Bash のいろいろ
Mac ターミナル SSH 接続設定
Elastic Beanstalk \$\SERVER['REMOTEADDR'] 取得できない
crontab 設定いろいろ
AWS EC2 の amazon-linux-extras の話
デプロイツール Capistrano
解決! xserver php バージョンアップした時に ssh 環境に反映されない
youtube 見れるように vpn サーバー建ててみた
xserver に vim インストール
xserver に nodejs インストール
レンタルサーバーなら xserver おすすめ理由
Docker command でドッカー練習する時のメモ
Windows10 Home に Docker 入れた時のメモ
Centos7 Webserver 構築の時のメモ