当ブログ人気記事!
転職体験談
Laravelで学ぶWebアプリ開発
誰でも作れるチャットアプリ
未経験への勧め

【CentOS8】Laravel8×MySQL×Redis×Nginx×Let’sEncryptの環境構築手順

プログラミング

こんにちは、WebエンジニアのSHOOT(@Shoot58153748)です。

先日ふとインフラ周りいじってみたくなり、
Webエンジニア歴若干2年弱にしてなんと初のConohaVPS契約。

Laravelのデプロイ、ドメインやSSL通信設定等やったので、
今後再現できるように以下のサーバー環境構築手順を残しておきます。

  • PHP/Laravel
  • Webサーバー(Nginx)
  • DB(MySQL)
  • KVS(Redis)
  • ドメイン設定(HTTPS化)

環境はCentOS8です。

ローカルで作ったLaravelアプリを本番サーバーにデプロイしたい方は
是非参考にしてください。

※Laravel8のローカル開発環境構築手順は過去記事参照

スポンサーリンク

前準備

VPS契約

コスパ重視で「ConohaVPS」を選びました。(1GB)

他だと「さくらVPS」が有名。

ドメイン購入

お名前.comで1円のドメイン購入しました。

DNS登録

ConohaVPSのDNSに登録(DNS>ドメイン追加)
※初期状態からAレコードを追加(赤部分にあなたのipAddress)

画面に表示されるNSタイプの値3つをコピー
それをお名前.com側に登録(ネームサーバー変更>その他のネームサーバーを使う)

以上でDNS設定が完了です。

それでは契約したVPSのサーバーに入って各種ミドルウェアインストールしていきます。

各種インストール

Git

dnf install git

Nginx

公式ドキュメント:http://nginx.org/en/linux_packages.html#RHEL-CentOS

新しいバージョンをインストールするために
nginxのレポジトリ設定ファイルを編集

vi /etc/yum.repos.d/nginx.repo

------
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
-------

その後パッケージインストール

dnf install nginx

システム起動時に自動実行を設定

systemctl enable nginx

Nginx起動

systemctl start nginx

最後にhttp(80)ポート開放&リロード反映

firewall-cmd --add-service=http --permanent
firewall-cmd --reload


すると
http://{your-ip}
でブラウザからNginxのトップページにアクセスできます。

MySQL

公式ドキュメント:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

rpmパッケージインストール
→モジュールDisableに(CentOS8の場合、これを忘れるとパッケージインストールできない)
→パッケージをインストール

dnf install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum module disable mysql
dnf install mysql-community-server

MySQL起動

systemctl start mysqld

以下のコマンドを実行すると、初期パスワード等を設定できる

mysql_secure_installation

ここでDBを作成しておく。

mysql -uroot -p

create database {YOUR_DB_NAME}

Redis

Redisは普通にインストールし、起動する

dnf install -y redis
systemctl enable --now redis

PHP7.4

PHP7.3以上のインストールは、EpelとRemiパッケージが必要

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm

PHPモジュールをDISABLEにし、PHP7.4をインストール

dnf module disable php
dnf module install -y php:remi-7.4

Laravel8

phpの必要そうな拡張パッケージをインストール
最低限必要なパッケージはLaravel公式ドキュメントで確認できる
https://laravel.com/docs/8.x/deployment#server-requirements

dnf install -y php-bcmath php-ctype php-fileinfo php-json php-mbstring php-openssl php-pdo php-tokenizer php-xml php-mcrypt php-mysqlnd php-pecl-xdebug php-gd php-intl php-zip php-opcache

composerをインストール

dnf install -y wget
wget https://getcomposer.org/installer -O composer-installer.php
php composer-installer.php --filename=composer --install-dir=/usr/local/bin
composer self-update

Laravel Projectをgit cloneしてパッケージをインストール

cd /var/www && git clone {Your Repository}
composer install
npm install
cp .env.stg .env
php artisan migrate

最後にプロジェクトディレクトリの所有者をnginxに設定する(Nginxでリクエストを受けるため)

chown -R nginx. /var/www/{Project Name}

Nginx設定

php-fpmを起動する&自動起動設定ON

systemctl start php-fpm
systemctl enable php-fpm

php-fpmの設定ファイルを編集(user, groupをnginxに)

vi /etc/php-fpm.d/www.conf

---
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx

Nginxの設定ファイル(今回のドメイン:shoot-app.work)

Nginxの設定ファイル編集

ドメイン:shoot-app.work

vi /etc/nginx/conf.d/shoot-app.work.conf

-----------------------------------------
server {
    listen       80;
    server_name  shoot-app.work;
    root   /var/www/laravel8-tutorial/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index  index.php;

    charset utf-8;

    access_log  /var/log/nginx/shoot-app.access.log  main;

    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 /index.php;

    # pass the PHP scripts to FastCGI server listening on /run/php-fpm/www.sock
    #
    location ~ \.php$ {
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_param  SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include        fastcgi_params;
    }

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

設定をテストして成功したら反映(reload)します。

nginx -t
nginx -s reload

以上で、http://shoot-app.workにアクセスできるようになりました。
次にSSL化に対応していきます。

Https化(Let’s Encrypt)

SSL証明書取得

Let’s Encryptを使用して無料で証明書を取得できます。
ソースコードをgit cloneして、コマンド実行
※nginxのプロセスを止めてから実行しないとエラーになるので注意

cd /opt/
git clone https://github.com/certbot/certbot
cd certbot 
systemctl stop nginx

./certbot-auto certonly --standalone -t

コマンドライン上でメールアドレスやドメインを聞かれるので素直に入力すると
SSL証明書を取得できます。

最後に、Nginxの設定ファイルを編集し、サーバーを起動すればOK

Nginx設定ファイル編集

先ほどの設定ファイルにSSL通信のポート番号と証明書のパスを追加(+の行)

/etc/nginx/conf.d/shoot-app.work.conf

server {
    listen       80;
+    listen       443 ssl;

+    ssl_certificate     /etc/letsencrypt/live/shoot-app.work/fullchain.pem;
+    ssl_certificate_key /etc/letsencrypt/live/shoot-app.work/privkey.pem;

    server_name  shoot-app.work;
    root   /var/www/laravel8-tutorial/public;


443ポートを開放する設定にします。

firewall-cmd --add-service=https --permanent
firewall-cmd --reload

これで
https://shoot-app.work
でサイトにアクセスできるようになりました。

お疲れ様でした!
※SSL自動更新設定については別途記事書こうと思います

まとめ

Dockerなどのコンテナやクラウド技術の発展により、
生のLinuxサーバー構築機会は減少傾向にあります。

しかし生のLinuxサーバー構築の経験は
自動化されたインフラの裏で何が起きているかを理解する上でとても重要です。

その他実際に構築することで

  • ネットワーク
  • ドメイン
  • DNS(名前解決)
  • サーバーの仕組み
  • SSL通信…

といったIT知識の理解を深めることにつながります。

インフラエンジニアのみならず、アプリ開発エンジニアにとっても
インフラ周りの知識強化は実務で役立つはずです。

是非とも自分でVPS契約して色々試してみてください!

プログラミング
スポンサーリンク
シェアする
SHOOTをフォローする
WebエンジニアSHOOTのブログ

コメント

タイトルとURLをコピーしました