MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
コンテナ - LEMPのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
コンテナ - LEMP
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == LEMP環境とは、Linux、Nginx、MySQL または MariaDB、PHPを組み合わせたWebアプリケーション開発・運用のための基盤環境である。<br> <br> Docker ComposeまたはPodman Composeを使用することで、これらのコンポーネントを個別のコンテナとして構築し、相互に連携させることができる。<br> コンテナ化によって、環境の再現性が高まり、開発環境と本番環境の差異を最小限に抑えることが可能となる。<br> <br> LEMP環境の構築により、高性能で軽量なWeb開発環境を実現することができる。<br> * Nginxは、Apacheと比較して軽量で高性能である。 * PHP-FPMにより、PHPプロセスの管理が最適化される。 * Alpine Linuxベースのイメージを使用することで、コンテナサイズが大幅に削減される。 * Docker/Podman Composeにより、環境の再現性が保証される。 * 適切な設定により、開発環境と本番環境の両方に対応できる。 <br> LEMP環境は、小規模なWebサイトから大規模なWebアプリケーションまで、幅広い用途に対応できる。<br> 用途に応じて、キャッシュサーバ (Redis、Memcached) や リバースプロキシ (Varnish) 等を追加することにより、さらなるパフォーマンス向上が可能である。<br> <br><br> == LEMP環境の各コンポーネント == LEMP環境の各コンポーネントは、以下に示す役割を担う。<br> * Linux *: コンテナのベースとなるオペレーティングシステム (Alpine、Debian、Ubuntu等) * Nginx *: HTTPサーバとして動作し、静的ファイルの配信やPHP-FPMへのリクエスト転送を担当する。 * MySQL / MariaDB *: リレーショナルデータベースとしてアプリケーションのデータを永続化する。 * PHP-FPM *: サーバサイドのスクリプト言語として動的なWebページを生成する。(PHP-FPM形式で動作) <br> Docker Compose または Podman Composeを使用することにより、LEMP環境を効率的に構築・管理できる。<br> コンテナ化によって、開発環境の再現性が高まり、チーム内での環境統一も容易になる。<br> <br><br> == LEMP環境の特徴 == * Nginx、MySQL、PHPが独立したコンテナとして動作する。 * Nginxは軽量で高性能なWebサーバとして、大量の同時接続を効率的に処理できる。 * PHP-FPMを使用することで、PHPプロセスの管理が最適化される。 * 設定ファイルやデータは、ホスト側で管理され永続化される。 * 環境変数を使用することで、設定の柔軟性が高い。 * phpMyAdminにより、データベースの視覚的な管理が可能である。 * SSL対応により、HTTPS通信をサポートできる。 <br> 開発環境として使用する場合は、Xdebugやホットリロード機能を追加することにより、更に開発効率を向上させることができる。<br> <br> <u>ただし、本番環境では、セキュリティ設定を強化し、適切なバックアップを実施することが重要である。</u><br> <br><br> == 環境の前提条件 == LEMP環境を構築する前に、以下に示すソフトウェアがインストールされている必要がある。<br> <br> ==== Docker環境の場合 ==== * Docker Engine (バージョン20.10以降を推奨) * Docker Compose (バージョン2.0以降を推奨) <br> インストールが正常に完了したかどうかを確認する。<br> docker --version docker-compose --version <br> ==== Podman環境の場合 ==== * Podman (バージョン4.0以降を推奨) * Podman Compose (バージョン1.0以降を推奨) <br> インストールが正常に完了したかどうかを確認する。<br> podman --version podman-compose --version <br><br> == ディレクトリ構成 == LEMP環境を構築するために、ディレクトリ構成を作成する。<br> 以下に示す構成は、各コンポーネントの設定ファイルやデータを整理して管理するためのものである。<br> <br> lemp-project/ ├── docker-compose.yml # Compose設定ファイル (または、compose.yml) ├── nginx/ │ ├── Dockerfile # Nginx用のDockerfile (カスタマイズする場合) │ ├── nginx.conf # Nginxメイン設定ファイル │ └── conf.d/ │ └── default.conf # デフォルトサーバブロック設定 ├── php/ │ ├── Dockerfile # PHP用のDockerfile (拡張モジュールを追加する場合) │ └── php.ini # PHP設定ファイル ├── mysql/ │ ├── conf.d/ │ │ └── my.cnf # MySQL設定ファイル │ └── init/ │ └── 01-init.sql # 初期化SQLスクリプト └── www/ └── html/ └── index.php # Webコンテンツのルートディレクトリ <br><br> == 基本的なComposeファイルの設定 == LEMP環境を構築するためのComposeファイルを作成する。<br> この設定では、Nginx、PHP-FPM、MySQL または MariaDBの3つのサービスを定義して、それぞれを連携させる。<br> <br> docker-compose.yml または compose.yml という名前でファイルを作成する。<br> <br> 以下の例では、最新の安定版バージョンを使用している。<br> * Nginx 1.27 * PHP 8.4 (FPM形式) * MySQL 8.4 LTS * phpMyAdmin <br> Nginxはリバースプロキシとして動作し、PHPリクエストをPHP-FPMコンテナに転送する。<br> ヘルスチェックの設定も含まれており、MySQLコンテナが完全に起動するまで待機してから、他のサービスがデータベースへの接続を試みることができる。<br> <br> <syntaxhighlight lang="yaml"> version: '3.8' services: # Webサーバ (Nginx) nginx: image: nginx:1.27-alpine container_name: lemp-nginx ports: - "0.0.0.0:8080:80" volumes: - ./www/html:/var/www/html - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - nginx-logs:/var/log/nginx depends_on: - php networks: - lemp-network restart: unless-stopped # PHPプロセッサ (PHP-FPM) php: build: context: ./php dockerfile: Dockerfile container_name: lemp-php volumes: - ./www/html:/var/www/html - ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro environment: - PHP_FPM_USER=www-data - PHP_FPM_GROUP=www-data depends_on: db: condition: service_healthy networks: - lemp-network restart: unless-stopped # データベースサーバ (MySQL 8.4 LTS) db: image: mysql:8.4 container_name: lemp-db environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: myapp MYSQL_USER: dbuser MYSQL_PASSWORD: dbpassword volumes: - mysql-data:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d - ./mysql/conf.d:/etc/mysql/conf.d ports: - "0.0.0.0:3306:3306" networks: - lemp-network restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_ROOT_PASSWORD"] interval: 10s timeout: 5s retries: 5 start_period: 30s # データベース管理ツール (phpMyAdmin) phpmyadmin: image: phpmyadmin:latest container_name: lemp-phpmyadmin environment: PMA_HOST: db PMA_PORT: 3306 PMA_USER: root PMA_PASSWORD: rootpassword ports: - "0.0.0.0:8081:80" depends_on: db: condition: service_healthy networks: - lemp-network restart: unless-stopped # 永続化ボリュームの定義 volumes: mysql-data: driver: local nginx-logs: driver: local # ネットワークの定義 networks: lemp-network: driver: bridge </syntaxhighlight> <br> NginxコンテナはAlpine Linuxベースの軽量イメージを使用し、PHPはFPM (FastCGI Process Manager)形式で動作する。<br> データベースとしてはMySQL 8.4 LTSを使用して、環境変数でデータベース名やユーザ情報を設定している。<br> <br> depends_onディレクティブに condition: service_healthy を追加することにより、データベースのヘルスチェックが成功するまでPHPサービスの起動を待機できる。<br> また、全サービスはlemp-networkという専用のネットワークで接続され、サービス名でお互いに通信できる。<br> <br> Nginxはphpサービス名を使用してPHP-FPMと通信し、PHPはdbサービス名を使用してデータベースと通信する。<br> <br><br> == Nginx設定ファイルの作成 == Nginxの動作を制御するため、設定ファイルを作成する。<br> <br> ==== Nginx設定ファイル (nginx.conf) ==== nginx/nginx.confファイルを作成して、Nginxの基本設定を記述する。<br> <br> <syntaxhighlight lang="nginx"> user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # Gzip圧縮設定 gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; # セキュリティヘッダ add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; # サーバブロック設定を読み込む include /etc/nginx/conf.d/*.conf; } </syntaxhighlight> <br> この設定では、ワーカープロセス数を自動設定し、gzip圧縮とセキュリティヘッダを有効にしている。<br> <br> ==== サーバブロック設定 (default.conf) ==== nginx/conf.d/default.confファイルを作成して、仮想ホスト設定を記述する。<br> <br> <syntaxhighlight lang="nginx"> server { listen 80; listen [::]:80; server_name localhost; root /var/www/html; index index.php index.html index.htm; # ログ設定 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # 最大アップロードサイズ client_max_body_size 64M; # ルートロケーション location / { try_files $uri $uri/ /index.php?$query_string; } # PHPファイルの処理 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; # FastCGIバッファ設定 fastcgi_buffer_size 128k; fastcgi_buffers 256 16k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; # タイムアウト設定 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; } # 静的ファイルのキャッシュ設定 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|svg|woff|woff2|ttf|eot)$ { expires 30d; add_header Cache-Control "public, immutable"; } # 隠しファイルへのアクセスを拒否 location ~ /\. { deny all; access_log off; log_not_found off; } # 特定のファイルへのアクセスを拒否 location ~ /(?:README|LICENSE|CHANGELOG|\.git) { deny all; } } </syntaxhighlight> <br> この設定では、PHPファイルをPHP-FPMコンテナ (php:9000) に転送して、静的ファイルのキャッシュ設定や隠しファイルの保護を行っている。<br> <br> fastcgi_passディレクティブでphp:9000を指定することにより、Composeで定義したphpサービスのポート9000 (PHP-FPMのデフォルトポート) に接続する。<br> <br><br> == PHP-FPM設定 == PHP-FPMコンテナをカスタマイズするため、Dockerfileを作成する。<br> <br> ==== Dockerfileの作成 ==== php/Dockerfileを作成して、必要な拡張モジュールをインストールする設定を記述する。<br> <br> 以下の例では、画像処理 (gd)、データベース接続 (mysqli、pdo_mysql)、文字列処理 (mbstring)、ファイル圧縮 (zip)等の一般的な拡張モジュールをインストールしている。<br> <br> <syntaxhighlight lang="dockerfile"> FROM php:8.4-fpm-alpine # システムパッケージの更新と必要なライブラリのインストール RUN apk add --no-cache \ freetype-dev \ libjpeg-turbo-dev \ libpng-dev \ libzip-dev \ oniguruma-dev \ libxml2-dev \ icu-dev \ && rm -rf /var/cache/apk/* # PHP拡張モジュールのインストール RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ gd \ mysqli \ pdo \ pdo_mysql \ mbstring \ zip \ exif \ pcntl \ bcmath \ opcache \ intl # 作業ディレクトリの設定 WORKDIR /var/www/html # www-dataユーザーでの実行 USER www-data </syntaxhighlight> <br> このDockerfileでは、Alpine Linuxベースの軽量なPHP-FPMイメージを使用している。<br> Alpine Linuxは非常に小さいサイズのLinuxディストリビューションであり、コンテナイメージのサイズを大幅に削減できる。<br> <br><br> == コンテナの起動と動作確認 == Compose設定ファイルを作成したら、以下のコマンドでコンテナを起動する。<br> <br> ==== Docker Composeの場合 ==== docker-compose up -d --build <br> または、Docker Compose V2の場合は以下のコマンドでも起動できる。<br> docker compose up -d --build <br> 起動したコンテナの状態を確認するには、以下のコマンドを実行する。<br> <br> docker-compose ps <br> ==== Podman Composeの場合 ==== podman-compose up -d --build <br> 起動したコンテナの状態を確認するには、以下のコマンドを実行する。<br> <br> podman-compose ps <br> 正常に起動している場合は、nginx、php、dbの3つのコンテナがUpステータスで表示される。<br> <br> ==== 初回起動時の注意点 ==== MySQLコンテナは初回起動時にデータベースの初期化を行うため、完全に起動するまで数十秒かかる場合がある。<br> ログを確認して、MySQLが完全に起動したことを確認する。<br> <br> docker-compose logs -f db # または podman-compose logs -f db <br> <u>ready for connections</u> というメッセージが表示されている場合、MySQLの起動が完了している。<br> <br> また、PHP-FPMコンテナのログも確認できる。<br> <br> docker-compose logs -f php # または podman-compose logs -f php <br> <u>ready to handle connections</u> というメッセージが表示されていれば、PHP-FPMが正常に動作している。<br> <br><br> == PHPの動作確認 == ==== phpinfo()による確認 ==== www/html/index.phpファイルを作成し、以下に示す内容を記述する。<br> <br> <syntaxhighlight lang="php"> <?php phpinfo(); ?> </syntaxhighlight> <br> Webブラウザで http://localhost:8080 にアクセスすると、PHPの詳細情報が表示される。<br> この画面では、PHPのバージョンや有効な拡張モジュール、サーバAPI (FPM/FastCGI) 等を確認することができる。<br> PHP 8.4の機能や設定が正しく適用されているかを確認する。<br> <br> Server APIの項目が <u>FPM/FastCGI</u> と表示されていれば、PHP-FPMが正しく動作している。<br> <br> ==== データベース接続の確認 ==== 次に、PHPからMySQLへの接続を確認する。<br> www/html/db-test.phpファイルを作成し、以下に示す内容を記述する。<br> <br> <syntaxhighlight lang="php"> <?php $servername = "db"; // Composeファイルで定義したサービス名 $username = "dbuser"; $password = "dbpassword"; $database = "myapp"; try { // PDOを使用した接続 // DSN (Data Source Name)を構築してデータベースに接続 $conn = new PDO( "mysql:host=$servername;dbname=$database;charset=utf8mb4", $username, $password ); // エラーモードを例外に設定 (データベース操作でエラーが発生した時に例外をスローする) $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 接続成功メッセージ echo "接続情報: MySQL via PDO<br>"; // サーバーバージョンの表示 echo "サーバーバージョン: " . $conn->getAttribute(PDO::ATTR_SERVER_VERSION) . "<br>"; // Nginxで動作していることを確認 echo "Webサーバ: " . $_SERVER['SERVER_SOFTWARE'] . "<br>"; } catch (PDOException $e) { // 接続エラーが発生した場合の処理 die("接続失敗: " . $e->getMessage()); } // PDOの場合、接続は自動的にスクリプト終了時にクローズされる // 明示的にクローズする場合は以下のように記述する $conn = null; ?> </syntaxhighlight> <br> http://localhost:8080/db-test.php にアクセスして、接続成功メッセージが表示される場合は、PHP-FPM、Nginx、MySQL間の連携が正常に動作している。<br> <br><br> == PHP設定のカスタマイズ == PHPの動作をカスタマイズするため、php.iniファイルを作成および設定する。<br> <br> ==== カスタムphp.iniの作成 ==== php/php.iniファイルを作成して、必要な設定を記述する。<br> <br> 以下の例では、実行時間の上限、メモリ制限、アップロードファイルサイズ等を調整している。<br> PHP 8.4では、OPcacheやJITコンパイラの設定も重要である。<br> <br> 開発環境ではエラーを画面に表示させることにより、問題の早期発見が可能になる。<br> 本番環境では、セキュリティの観点からエラーをログファイルに記録する設定に切り替えることが推奨される。<br> <br> <syntaxhighlight lang="ini"> ; 基本設定 max_execution_time = 300 max_input_time = 300 memory_limit = 256M ; アップロード設定 upload_max_filesize = 64M post_max_size = 64M ; エラー表示設定 (開発環境用) display_errors = On display_startup_errors = On error_reporting = E_ALL ; 本番環境用設定 (本番環境ではこちらを使用) ; display_errors = Off ; display_startup_errors = Off ; error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; log_errors = On ; error_log = /var/log/php/error.log ; タイムゾーン設定 date.timezone = Asia/Tokyo ; セッション設定 session.save_handler = files session.save_path = "/tmp" session.gc_maxlifetime = 1440 ; OPcache設定 (PHP 8.4でのパフォーマンス向上) opcache.enable = 1 opcache.memory_consumption = 128 opcache.interned_strings_buffer = 8 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 2 opcache.validate_timestamps = 1 ; JITコンパイラ設定 (PHP 8.4の機能) ; 本番環境では有効化を検討 opcache.jit = tracing opcache.jit_buffer_size = 100M ; PHP-FPM固有の設定 ; これらはphp-fpm.confで設定することもできる </syntaxhighlight> <br> Composeファイルで既に設定しているため、このphp.iniファイルは自動的にコンテナ内の /usr/local/etc/php/conf.d/custom.ini として読み込まれる。<br> <br><br> == MySQL初期化スクリプト == コンテナ起動時に自動的にデータベーステーブルを作成、あるいは、初期データを投入する場合、初期化スクリプトを使用する。<br> <br> ==== 初期化SQLの作成 ==== mysql/init/01-init.sqlファイルを作成して、テーブル定義やサンプルデータを記述する。<br> <br> <syntaxhighlight lang="sql"> -- データベースの使用 USE myapp; -- ユーザテーブルの作成 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 記事テーブルの作成 CREATE TABLE IF NOT EXISTS posts ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, title VARCHAR(200) NOT NULL, content TEXT, published BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- サンプルデータの挿入 INSERT INTO users (username, email, password_hash) VALUES ('admin', 'admin@example.com', '$2y$10$abcdefghijklmnopqrstuvwxyz1234567890'), ('testuser', 'test@example.com', '$2y$10$1234567890abcdefghijklmnopqrstuvwxyz'); INSERT INTO posts (user_id, title, content, published) VALUES (1, '最初の投稿', 'これはテスト投稿です。', TRUE), (1, '2番目の投稿', 'もう一つのテスト投稿です。', TRUE), (2, 'ユーザ投稿', 'テストユーザからの投稿です。', FALSE); </syntaxhighlight> <br> このSQLファイルは、MySQLコンテナの初回起動時に自動的に実行される。<br> /docker-entrypoint-initdb.dディレクトリに配置されたSQLファイルは、ファイル名の昇順で実行されるため、複数のファイルを使用する場合は 01-、02- のように番号を付加して実行順序を制御できる。<br> <br><br> == MySQL設定のカスタマイズ == MySQLの動作をカスタマイズするため、設定ファイルを作成する。<br> <br> ==== カスタムmy.cnfの作成 ==== mysql/conf.d/my.cnfファイルを作成して、以下に示す内容を記述する。<br> <br> 以下の例では、文字コードをutf8mb4、日本時間 (UTC+9)を設定している。<br> また、パフォーマンスチューニングのためのバッファサイズやスロークエリログの設定も含まれている。<br> <br> <syntaxhighlight lang="ini"> [mysqld] # 文字コード設定 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # タイムゾーン設定 default-time-zone = '+09:00' # 接続設定 max_connections = 200 max_connect_errors = 100 # パフォーマンス設定 innodb_buffer_pool_size = 256M innodb_log_file_size = 64M innodb_flush_log_at_trx_commit = 2 # ログ設定 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow-query.log long_query_time = 2 # バイナリログ設定 (レプリケーション用) # server-id = 1 # log_bin = /var/log/mysql/mysql-bin.log # binlog_expire_logs_seconds = 604800 # MySQL 8.0以降では expire_logs_days の代わりに使用 [client] default-character-set = utf8mb4 </syntaxhighlight> <br> Compose設定ファイルで既に設定しているため、この設定ファイルは自動的に読み込まれる。<br> <br><br> == phpMyAdminの追加 == データベースを視覚的に管理するため、phpMyAdminを追加することができる。<br> phpMyAdminは、Webブラウザ上でデータベースの操作が可能なツールである。<br> <br> 既にCompose設定ファイルにphpMyAdminサービスが含まれているため、追加の設定は不要である。<br> <br> ==== アクセス方法 ==== http://localhost:8081 でphpMyAdminにアクセスできる。<br> ログイン画面では、Composeファイルで指定したデータベースユーザ (dbuser)またはrootユーザでログインできる。<br> <br> 管理者ユーザの場合<br> * ユーザ名: root * パスワード: rootpassword <br> 一般ユーザの場合<br> * ユーザ名: dbuser * パスワード: dbpassword <br><br> == アクセス方法とテスト == コンテナを起動した後、以下のURLでそれぞれのサービスにアクセスできる。<br> <br> ==== Webサーバ ==== http://localhost:8080 にアクセスすると、./www/html/index.phpの内容が表示される。<br> <br> ==== phpMyAdmin ==== http://localhost:8081 にアクセスすると、phpMyAdminのログイン画面が表示される。<br> <br> ==== データベース接続テスト ==== PHPからMySQLへの接続をテストするため、./www/html/db-connect.phpファイルを作成する。<br> <br> <syntaxhighlight lang="php"> <?php // データベース接続設定 $host = 'db'; // Composeで定義したサービス名 $dbname = 'myapp'; $username = 'dbuser'; $password = 'dbpassword'; try { // PDOを使用した接続 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "<h2>データベース接続成功!</h2>"; // MySQLバージョン情報の表示 $version = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION); echo "<p>MySQLバージョン: " . htmlspecialchars($version) . "</p>"; // Webサーバ情報の表示 echo "<p>Webサーバ: Nginx + PHP-FPM</p>"; echo "<p>PHPバージョン: " . phpversion() . "</p>"; // ユーザテーブルの内容を取得 $stmt = $pdo->query("SELECT * FROM users"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "<h3>登録ユーザ一覧</h3>"; echo "<table border='1' cellpadding='5'>"; echo "<tr><th>ID</th><th>ユーザ名</th><th>メールアドレス</th><th>登録日時</th></tr>"; foreach ($users as $user) { echo "<tr>"; echo "<td>" . htmlspecialchars($user['id']) . "</td>"; echo "<td>" . htmlspecialchars($user['username']) . "</td>"; echo "<td>" . htmlspecialchars($user['email']) . "</td>"; echo "<td>" . htmlspecialchars($user['created_at']) . "</td>"; echo "</tr>"; } echo "</table>"; } catch (PDOException $e) { echo "<h2>データベース接続エラー</h2>"; echo "<p>エラー内容: " . htmlspecialchars($e->getMessage()) . "</p>"; } ?> </syntaxhighlight> <br> http://localhost:8080/db-connect.php にアクセスして、ユーザ一覧が表示されれば、LEMP環境が正しく動作している。<br> <br><br> == MariaDBを使用する場合 == MySQLの代わりにMariaDBを使用することもできる。<br> MariaDBはMySQLのフォーク版であり、互換性がある。<br> <br> ==== Compose設定の変更 ==== Composeファイルのdbサービスを、以下に示すように変更する。<br> <br> 主な変更点は、イメージ名を mariadb:11.8、環境変数名を MARIADB_ で始まるものに変更している点である。<br> ボリューム名も mysql-data から mariadb-data に変更することが推奨される。<br> <br> <syntaxhighlight lang="yaml"> db: image: mariadb:11.8 container_name: lemp-mariadb environment: MARIADB_ROOT_PASSWORD: rootpassword MARIADB_DATABASE: myapp MARIADB_USER: dbuser MARIADB_PASSWORD: dbpassword volumes: - mariadb-data:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d - ./mysql/conf.d:/etc/mysql/conf.d ports: - "0.0.0.0:3306:3306" networks: - lemp-network restart: unless-stopped healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 10s timeout: 5s retries: 5 start_period: 30s </syntaxhighlight> <br> MariaDB 12.1は最新の機能を提供しており、MariaDB 11.8はLTS版として長期サポートが提供される。<br> 用途に応じて適切なバージョンを選択する。<br> <br><br> == 環境変数ファイルの使用 == パスワード等の機密情報をCompose設定ファイルに直接記述するのではなく、.envファイルに分離することができる。<br> これにより、設定ファイルをバージョン管理システムで管理する際に、機密情報を除外できる。<br> <br> ==== .envファイルの作成 ==== プロジェクトルートに.envファイルを作成して、環境変数を定義する。<br> <br> <syntaxhighlight lang="sh"> # データベース設定 MYSQL_ROOT_PASSWORD=rootpassword MYSQL_DATABASE=myapp MYSQL_USER=dbuser MYSQL_PASSWORD=dbpassword # データベースバージョン (MySQL 8.4 LTS または MariaDB 11.8 LTS 推奨) DB_VERSION=8.4 # Nginxバージョン NGINX_VERSION=1.27-alpine # PHPバージョン PHP_VERSION=8.4-fpm-alpine # ポート設定 WEB_PORT=8080 PMA_PORT=8081 </syntaxhighlight> <br> ==== Composeファイルの更新 ==== Composeファイルを編集して、環境変数を参照するように変更する。<br> これにより、開発環境と本番環境で異なる設定値を使用する場合でも、Composeファイルを変更する必要がなくなる。<br> <br> <u>.envファイルを.gitignoreに追加して、バージョン管理から除外する。</u><br> <br> <syntaxhighlight lang="yaml"> nginx: image: nginx:${NGINX_VERSION} container_name: lemp-nginx ports: - "0.0.0.0:${WEB_PORT}:80" # ... 以下省略 db: image: mysql:${DB_VERSION} container_name: lemp-db environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} # ... 以下省略 </syntaxhighlight> <br><br> == データの永続化とバックアップ == コンテナを削除してもデータを保持するため、適切な永続化戦略が必要である。<br> <br> ==== ボリュームの確認 ==== 作成されたボリュームを確認する。<br> <br> # Docker Composeの場合 docker volume ls # Podman Composeの場合 podman volume ls <br> <プロジェクト名>_mysql-data という名前のボリュームが作成されていることを確認する。<br> <br> ==== データベースのバックアップ ==== MySQLデータベースの内容をバックアップする。<br> <br> パスワード入力を求められるので、ルートパスワードを入力する。<br> バックアップファイルbackup.sqlが作成される。<br> <br> # Docker Composeの場合 docker-compose exec db mysqldump -u root -p myapp > backup.sql # Podman Composeの場合 podman-compose exec db mysqldump -u root -p myapp > backup.sql <br> ==== バックアップの復元 ==== バックアップから復元するには、以下のコマンドを実行する。<br> <br> docker-compose exec -T db mysql -u root -p myapp < backup.sql # または podman-compose exec -T db mysql -u root -p myapp < backup.sql <br> ==== 完全バックアップスクリプト ==== 定期的なバックアップを自動化するため、シェルスクリプトを作成する。<br> <br> 以下の例では、backup.shという名前で以下に示す内容を保存している。<br> <br> <syntaxhighlight lang="sh"> #!/usr/bin/env sh # バックアップディレクトリの作成 BACKUP_DIR="./backups" mkdir -p $BACKUP_DIR # タイムスタンプの生成 TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # データベースのバックアップ echo "データベースをバックアップしています..." docker-compose exec -T db mysqldump -u root -prootpassword --all-databases > "$BACKUP_DIR/mysql_$TIMESTAMP.sql" # Webコンテンツのバックアップ echo "Webコンテンツをバックアップしています..." tar -czf "$BACKUP_DIR/www_$TIMESTAMP.tar.gz" ./www # 古いバックアップの削除 (30日以上前のファイル) find $BACKUP_DIR -type f -mtime +30 -delete echo "バックアップが完了しました: $TIMESTAMP" </syntaxhighlight> <br> スクリプトに実行権限を付与する。<br> chmod u+x backup.sh <br> 定期的にバックアップを実行するには、cronに登録する。<br> crontab -e <br> # 毎日午前3時にバックアップを実行する例 0 3 * * * cd /path/to/lemp-project && ./backup.sh <br><br> == SSLの設定 == HTTPS通信を有効にするため、SSL証明書を設定する。<br> <br> ==== 自己署名証明書の作成 ==== 開発環境では、自己署名証明書を使用できる。<br> 例えば、以下に示すコマンドで自己署名証明書を生成することができる。<br> <br> mkdir -p ./ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./ssl/server.key \ -out ./ssl/server.crt \ -subj "/C=JP/ST=Tokyo/L=Tokyo/O=Development/CN=localhost" <br> ==== SSL用のNginx設定ファイル作成 ==== nginx/conf.d/ssl.confファイルを作成して、HTTPS設定を記述する。<br> <br> <syntaxhighlight lang="nginx"> server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name localhost; root /var/www/html; index index.php index.html index.htm; # SSL証明書の設定 ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # SSL設定の最適化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # ログ設定 access_log /var/log/nginx/ssl-access.log; error_log /var/log/nginx/ssl-error.log; # 最大アップロードサイズ client_max_body_size 64M; # ルートロケーション location / { try_files $uri $uri/ /index.php?$query_string; } # PHPファイルの処理 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; # FastCGIバッファ設定 fastcgi_buffer_size 128k; fastcgi_buffers 256 16k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; # タイムアウト設定 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; } # 静的ファイルのキャッシュ設定 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|svg|woff|woff2|ttf|eot)$ { expires 30d; add_header Cache-Control "public, immutable"; } # 隠しファイルへのアクセスを拒否 location ~ /\. { deny all; access_log off; log_not_found off; } } # HTTPからHTTPSへのリダイレクト (オプション) server { listen 80; listen [::]:80; server_name localhost; return 301 https://$server_name$request_uri; } </syntaxhighlight> <br> ==== Compose設定の更新 ==== Composeファイルのnginxサービスに、TCP 443番ポートとSSL証明書のマウントを追加する。<br> <br> <syntaxhighlight lang="yaml"> nginx: image: nginx:1.27-alpine container_name: lemp-nginx ports: - "0.0.0.0:8080:80" - "0.0.0.0:8443:443" volumes: - ./www/html:/var/www/html - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./ssl:/etc/nginx/ssl:ro - nginx-logs:/var/log/nginx # ... 以下省略 </syntaxhighlight> <br> 再起動する。<br> docker-compose down docker-compose up -d # または podman-compose down podman-compose up -d <br> https://localhost:8443 にアクセスすると、HTTPSでWebサーバにアクセスできる。<br> Webブラウザは自己署名証明書の警告を表示するが、開発環境では問題ない。<br> <br> 本番環境では、Let's Encrypt等の認証局から正式な証明書を取得することが推奨される。<br> <br><br> == Composerのインストール == PHPの依存関係管理ツールであるComposerをコンテナにインストールする方法を説明する。<br> <br> ==== Dockerfileへの追加 ==== php/Dockerfileファイルに、Composerをインストールする設定を追加する。<br> <br> <syntaxhighlight lang="dockerfile"> # Composerのインストール RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Composerのバージョン確認 RUN composer --version </syntaxhighlight> <br> 再ビルド後、コンテナ内でComposerを使用できる。<br> docker-compose exec php composer --version <br> ==== プロジェクトでのComposer使用例 ==== Laravel等のフレームワークをインストールする。<br> <br> docker-compose exec php composer create-project laravel/laravel /var/www/html/laravel <br> または、既存のcomposer.jsonファイルがある場合は、依存パッケージをインストールする。<br> docker-compose exec php composer install <br><br> == Node.jsとnpmの追加 == フロントエンドのビルドツールを使用する場合、Node.jsとnpmが必要になることがある。<br> <br> ==== Dockerfileへの追加 ==== php/Dockerfileファイルに、Node.jsをインストールする設定を追加する。<br> Alpine Linux用のNode.jsインストール方法を使用する。<br> <br> <syntaxhighlight lang="dockerfile"> # Node.jsとnpmのインストール RUN apk add --no-cache nodejs npm # バージョン確認 RUN node --version && npm --version </syntaxhighlight> <br> これにより、コンテナ内でnpmコマンドを使用できるようになる。<br> docker-compose exec php npm install docker-compose exec php npm run build # または podman-compose exec php npm install podman-compose exec php npm run build <br><br> == 開発時の設定 == 開発効率を向上させるための設定がある。<br> <br> ==== Xdebugの設定 ==== PHPのデバッグツールXdebugをインストールすることで、ステップ実行やブレークポイント設定が可能になる。<br> <br> php/Dockerfileに以下に示す設定を追加する。<br> <br> <syntaxhighlight lang="dockerfile"> # Xdebugのインストール RUN apk add --no-cache $PHPIZE_DEPS \ && pecl install xdebug \ && docker-php-ext-enable xdebug \ && apk del $PHPIZE_DEPS # Xdebug設定 RUN echo "xdebug.mode=develop,debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini </syntaxhighlight> <br> ==== ホットリロードの設定 ==== ファイル変更を自動的に検知してWebブラウザをリロードするため、ブラウザ拡張機能 (Live Server)やnpmパッケージ (browser-sync)が使用できる。<br> <br> ==== ログの確認を簡単にする ==== Composeファイルにログ設定を追加することにより、ログの確認が容易になる。<br> <br> <syntaxhighlight lang="yaml"> nginx: # ... 既存の設定 logging: driver: "json-file" options: max-size: "10m" max-file: "3" php: # ... 既存の設定 logging: driver: "json-file" options: max-size: "10m" max-file: "3" </syntaxhighlight> <br><br> == トラブルシューティング == ==== コンテナが起動しない ==== ログを確認して、エラーメッセージを特定する。<br> <br> docker-compose logs nginx docker-compose logs php docker-compose logs db # または podman-compose logs nginx podman-compose logs php podman-compose logs db <br> 設定ファイルの構文エラーがある場合は、以下に示すコマンドで検証する。<br> docker-compose config # または podman-compose config <br> Nginx設定ファイルの構文チェックは、以下のコマンドで行える。<br> docker-compose exec nginx nginx -t # または podman-compose exec nginx nginx -t <br> ==== データベースに接続できない ==== データベースコンテナが完全に起動するまで待つ必要がある。<br> <br> まず、ヘルスチェックを確認する。<br> statusカラムにhealthyと表示されている場合は、接続可能である。<br> <br> docker-compose ps # または podman-compose ps <br> 次に、接続情報が正しいかどうかを確認する。<br> ホスト名は、Composeファイルで定義したサービス名 (db)を使用する必要がある。<br> この時、localhostや127.0.0.1では接続できない。<br> <br> ==== PHPファイルがダウンロードされる (実行されない) ==== NginxからPHP-FPMへの接続が正しく設定されていない可能性がある。<br> <br> nginx/conf.d/default.confファイルを確認して、fastcgi_passディレクティブがphp:9000を指している<br> ことを確認する。<br> <br> また、PHPコンテナが正常に動作しているかを確認する。<br> docker-compose logs php # または podman-compose logs php <br> <u>ready to handle connections</u> というメッセージが表示されていれば、PHP-FPMは正常に動作している。<br> <br> ==== ポート番号の競合 ==== 既に他のサービスがポートを使用している場合、異なるポート番号に変更する。<br> <br> ports: - "0.0.0.0:8081:80" # 8080の代わりに8081を使用 - "0.0.0.0:8444:443" # 8443の代わりに8444を使用 <br> ==== パーミッションエラー ==== ボリュームマウントしたディレクトリのパーミッションを確認する。<br> <br> sudo chown -R 1000:1000 ./www/html chmod -R 755 ./www/html <br> ==== PHP拡張モジュールが見つからない ==== 必要な拡張モジュールがインストールされているか確認する。<br> <br> docker-compose exec php php -m # または podman-compose exec php php -m <br> インストールされていない場合は、Dockerfileに追加して再ビルドする。<br> <br> ==== MySQLの文字化け ==== 文字コード設定を確認する。<br> phpMyAdminまたはコマンドラインで以下に示すクエリを実行する。<br> <br> SHOW VARIABLES LIKE 'character%'; <br> 全てutf8mb4と表示されていることを確認する。<br> もし異なる場合は、my.cnfの設定を見直す。<br> <br> ==== コンテナ内のファイルが見えない ==== ボリュームマウントの設定を確認する。<br> 相対パスが正しいか、ホスト側のディレクトリが存在するかどうかを確認する。<br> <br> ls -la ./www/html <br> ==== メモリ不足エラー ==== Docker Desktop / Podman Desktopの設定で、割り当てメモリを増やす。<br> また、php.iniの <code>memory_limit</code> を調整する。<br> <br> ==== 502 Bad Gateway エラー ==== このエラーは、NginxがPHP-FPMに接続できない場合に発生する。<br> <br> 以下を確認する。<br> * PHPコンテナが起動しているか * fastcgi_passの設定が正しいか (php:9000) * NginxとPHPコンテナが同じネットワークに接続されているか <br> docker-compose ps docker-compose logs php <br><br> == パフォーマンス最適化 == ==== OPcacheとJITの有効化 ==== php.iniで既に設定したOPcacheとJITコンパイラにより、PHPスクリプトの実行速度が大幅に向上する。<br> PHP 8.4では、JITコンパイラの最適化がさらに改善されている。<br> <br> 本番環境では、opcache.validate_timestampsを0に設定して、ファイル更新チェックを無効化することで、さらなる高速化が可能である。<br> <br> ==== MySQLのクエリキャッシュ ==== MySQL 8.0以降ではクエリキャッシュが廃止されたため、アプリケーション側でキャッシュ (Redis、Memcached等)を使用することが推奨される。<br> <br> ==== Nginxの静的ファイルキャッシュ ==== nginx.confで既に設定したgzip圧縮により、テキストファイルの転送サイズが削減される。<br> <br> さらに、FastCGIキャッシュを有効にすることで、動的コンテンツのキャッシュも可能になる。<br> <br> nginx.confのhttpブロック内に以下を追加する。<br> <br> <syntaxhighlight lang="nginx"> # FastCGIキャッシュの設定 fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHPCACHE:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; </syntaxhighlight> <br> そして、server ブロックの location ~ \.php$ 内に以下を追加する。<br> <br> <syntaxhighlight lang="nginx"> fastcgi_cache PHPCACHE; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $http_pragma $http_authorization; add_header X-FastCGI-Cache $upstream_cache_status; </syntaxhighlight> <br> ==== ワーカープロセス数の調整 ==== nginx.confの <code>worker_processes</code> を調整することで、Nginxのパフォーマンスを最適化できる。<br> <br> autoに設定すると、利用可能なCPUコア数に応じて自動的に調整される。<br> 手動で設定する場合は、CPUコア数と同じ値を設定することが推奨される。<br> <br><br> == セキュリティ対策 == ==== 本番環境での設定変更 ==== 本番環境では、以下に示す設定変更が推奨される。<br> <br> * php.iniでエラー表示を無効化する。 *: <syntaxhighlight lang="ini"> display_errors = Off log_errors = On error_log = /var/log/php/error.log </syntaxhighlight> *: <br> * 環境変数からパスワードを分離する。 *: <syntaxhighlight lang="sh"> # 本番環境では.envファイルを使用せず、環境変数を直接設定する export MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32) </syntaxhighlight> *: <br> * Nginxのserver_tokensを無効化する (バージョン情報の非表示) *: nginx.confのhttpブロック内に以下を追加する。 *: <syntaxhighlight lang="nginx"> server_tokens off; </syntaxhighlight> *: <br> * セキュリティヘッダーの強化 *: nginx.confで既に基本的なセキュリティヘッダーを設定しているが、さらに以下を追加できる。 *: <syntaxhighlight lang="nginx"> add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Content-Security-Policy "default-src 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; </syntaxhighlight> <br> ==== ファイアウォール設定 ==== 外部からのアクセスを許可する場合、ファイアウォールでポート開放を行う。<br> <br> * Linuxの場合 ** firewalld使用時 **: <syntaxhighlight lang="text"> sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --permanent --add-port=8443/tcp sudo firewall-cmd --reload </syntaxhighlight> **: <br> ** ufw使用時 **: <syntaxhighlight lang="text"> sudo ufw allow 8080/tcp sudo ufw allow 8443/tcp sudo ufw reload </syntaxhighlight> *: <br> * Windows 11の場合 *: <br> *: PowerShellを管理者権限で起動する。 *: HTTPポートの受信ルールを追加する。 *: <syntaxhighlight lang="powershell"> New-NetFirewallRule -DisplayName "LEMP HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow </syntaxhighlight> *: <br> *: HTTPSポートの受信ルールを追加する。 *: <syntaxhighlight lang="powershell"> New-NetFirewallRule -DisplayName "LEMP HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow </syntaxhighlight> *: <br> *: 接続テストを別PCから実行する。 *: <syntaxhighlight lang="powershell"> Test-NetConnection -ComputerName <サーバのIPアドレス> -Port 8080 Test-NetConnection -ComputerName <サーバのIPアドレス> -Port 8443 </syntaxhighlight> *: <br> *: ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。 *: <syntaxhighlight lang="powershell"> Remove-NetFirewallRule -DisplayName "LEMP HTTP" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "LEMP HTTPS" -ErrorAction SilentlyContinue </syntaxhighlight> <br><br> == コンテナの管理コマンド == ==== コンテナの起動 ==== docker-compose up -d # または podman-compose up -d <br> ==== コンテナの停止 ==== docker-compose down # または podman-compose down <br> データボリュームも削除する場合は、-vオプションを追加する。<br> docker-compose down -v # または podman-compose down -v <br> ==== コンテナの再起動 ==== docker-compose restart # または podman-compose restart <br> # 特定のサービスのみ再起動する場合 docker-compose restart <サービス名> # または podman-compose restart <サービス名> <br> ==== コンテナのログ確認 ==== docker-compose logs -f <サービス名> # または podman-compose logs -f <サービス名> <br> # 例: Nginxのログを確認 docker-compose logs -f nginx # 例: PHP-FPMのログを確認 docker-compose logs -f php <br> ==== コンテナ内でコマンド実行 ==== docker-compose exec <サービス名> sh # 例: PHPコンテナに入る docker-compose exec php sh # 例: MySQLコンテナに入る docker-compose exec db mysql -u root -p # または podman-compose exec <サービス名> sh # 例: PHPコンテナに入る podman-compose exec php sh # 例: MySQLコンテナに入る podman-compose exec db mysql -u root -p <br> <u>※注意</u><br> <u>Alpine Linuxベースのコンテナでは、bashの代わりにshを使用する。</u><br> <br> ==== イメージの再ビルド ==== docker-compose build docker-compose up -d --build # または podman-compose build podman-compose up -d --build <br> ==== リソース使用状況の確認 ==== docker stats # または podman stats <br> ==== Nginxの設定リロード ==== 設定ファイルを変更した後、Nginxをリロードする。<br> <br> docker-compose exec nginx nginx -s reload # または podman-compose exec nginx nginx -s reload <br><br> == バージョン別の注意事項 == ==== PHP 8.4の特徴 ==== PHP 8.4では、以下に示す機能が追加または改善されている。<br> * プロパティフック機能の追加 * 非対称可視性プロパティのサポート * JITコンパイラのさらなる最適化 * 新しい配列関数の追加 * パフォーマンスの全般的な向上 <br> ==== Nginx 1.27の特徴 ==== Nginx 1.27は安定版として提供されており、本番環境での使用に最適である。<br> * 高い安定性とパフォーマンス * HTTP/2、HTTP/3 (QUIC)のサポート * 効率的なイベント駆動アーキテクチャ * 低メモリフットプリント * リバースプロキシとロードバランサー機能 <br> ==== MySQL 8.4 LTSの特徴 ==== MySQL 8.4はLTSとして提供されているため、本番環境での使用に最適である。<br> * 安定性と信頼性が検証されている。 * セキュリティアップデートが長期間提供される。 * パフォーマンスが最適化されている。 * 豊富なドキュメントとコミュニティサポート <br> ==== MariaDB 11.8 LTSの特徴 ==== MariaDB 11.8は長期サポート版 (LTS) として提供されており、本番環境での使用に最適である。<br> * MySQLとの高い互換性 * 安定性と信頼性が検証されている * パフォーマンスの向上 * セキュリティ機能の改善 <br><br> == WordPress等のCMS導入例 == LEMP環境でWordPressを導入する場合の手順を説明する。<br> <br> ==== WordPressのダウンロードと配置 ==== 最新のWordPressをダウンロードして展開する。<br> <br> cd www/html wget https://ja.wordpress.org/latest-ja.tar.gz tar -xzf latest-ja.tar.gz <br> WordPressを任意の場所に配置する。<br> mv wordpress/* . rm -rf wordpress latest-ja.tar.gz <br> ==== Nginx設定の調整 ==== WordPressに最適化したNginx設定を作成する。<br> nginx/conf.d/wordpress.confファイルを作成する。<br> <br> <syntaxhighlight lang="nginx"> server { listen 80; server_name localhost; root /var/www/html; index index.php; # WordPressのパーマリンク設定 location / { try_files $uri $uri/ /index.php?$args; } # PHPファイルの処理 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } # wp-config.phpへの直接アクセスを拒否 location = /wp-config.php { deny all; } # 静的ファイルのキャッシュ location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; add_header Cache-Control "public, immutable"; } } </syntaxhighlight> <br> ==== wp-config.phpの設定 ==== wp-config-sample.phpをコピーしてwp-config.phpを作成して、データベース接続情報を設定する。<br> <br> <syntaxhighlight lang="php"> define('DB_NAME', 'myapp'); define('DB_USER', 'dbuser'); define('DB_PASSWORD', 'dbpassword'); define('DB_HOST', 'db'); define('DB_CHARSET', 'utf8mb4'); define('DB_COLLATE', ''); </syntaxhighlight> <br><br> == Let's EncryptによるSSL証明書の取得 == 本番環境では、Let's Encryptを使用して無料のSSL証明書を取得できる。<br> <br> ==== Certbotのインストール ==== Certbotコンテナを使用して証明書を取得する。<br> <br> docker run -it --rm \ -v ./ssl:/etc/letsencrypt \ -v ./www/html:/var/www/html \ certbot/certbot certonly --webroot \ -w /var/www/html \ -d example.com \ -d www.example.com \ --email admin@example.com \ --agree-tos <br> ==== Nginx設定の更新 ==== 取得した証明書を使用するようにNginx設定を更新する。<br> <br> <syntaxhighlight lang="nginx"> ssl_certificate /etc/nginx/ssl/live/example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/example.com/privkey.pem; </syntaxhighlight> <br> ==== 自動更新の設定 ==== 証明書は90日間有効であるため、自動更新を設定する。<br> <br> sudo crontab -e <br> 0 3 * * * docker run --rm -v ./ssl:/etc/letsencrypt -v ./www/html:/var/www/html certbot/certbot renew --quiet && docker-compose exec nginx nginx -s reload # または 0 3 * * * podman run --rm -v ./ssl:/etc/letsencrypt -v ./www/html:/var/www/html certbot/certbot renew --quiet && podman-compose exec nginx nginx -s reload <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板,Docker,Podman,LEMP,Nginx,MySQL,MariaDB,PHP,Container |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:コンテナ]]
コンテナ - LEMP
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse