2021.02.26

ConoHa VPS Laravelの本番環境を構築

まずはサーバーのセキュリティ対策を講じる。

SSL接続できるようにする

まずはSSL接続できるようにモジュールを追加

# yum install mod_ssl

インストールが終わったら一応確認

# httpd -M

//これが追加されていればOK
ssl_module (shared)

ファイアウォール確認

# firewall-cmd --list-all

//httpsではまだ接続できない
services: dhcpv6-client http ssh

ファイアウォールのhttps接続のポートを開放

# firewall-cmd --zone=public --add-service=https --permanent
# firewall-cmd --reload
# firewall-cmd --list-all

//httpsが追加されていればOK
services: dhcpv6-client http https ssh

証明書がないので警告がでるけどとりあえずSSL接続のポートは解放されました。

表示部分を作る

わかりやすいようにドキュメントルートはドメイン名にして進める。

# cd /var/www/html
# mkdir ドメイン名
# mkdir ドメイン名/public

laravel環境構築の際のpublicも一緒に作っておく。

パーミッションの調整

# chown -R apache:apache ドメイン名

SSL証明書の発行

無料のLet’s Encriptを使用していく。

cerbotをインストール

# yum -y install certbot

証明書発行

回数に制限があるのでドメインのネームサーバーが浸透してから行ってください。

certbot certonly --agree-tos --non-interactive -d 【ドメイン名】 --webroot -w /var/www/html/【ドメイン名】/public --email 【管理者のメールアドレス】

暗唱鍵が追加されていたら成功

# ls /etc/letsencrypt/live/【ドメイン名】

README  cert.pem  chain.pem  fullchain.pem  privkey.pem

バーチャルホストの設定

ドメインで表示できるようにvirtualhostを設定する。

# vi /etc/httpd/conf/httpd.conf
//NameVirtualHost *:80を追加する
〜
Listen 80
NameVirtualHost *:80

ドメイン用の設定ファイルを作成する。

# vi /etc/httpd/conf.d/【ドメイン】.conf
<VirtualHost *:80>
  ServerName ドメイン名
  DocumentRoot "/var/www/html/ドメイン名/public"
  DirectoryIndex index.html index.php
  ErrorLog /var/log/httpd/ドメイン名_error_log
  CustomLog /var/log/httpd/ドメイン名_access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/html/ドメイン名/public">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>
</VirtualHost>
<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
  SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!3DES:!RC4:!DH
  SSLHonorCipherOrder on
  ServerName ドメイン名
  DocumentRoot "/var/www/html/ドメイン名/public"
  SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
  ErrorLog /var/log/ドメイン名-ssl-error_log
  CustomLog /var/log/ドメイン名-ssl-access_log combined
  <Directory "/var/www/html/ドメイン名/public">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>
</VirtualHost>

WEBサーバーを再起動してhttp、https共にアクセスできるか確認

# systemctl restart httpd.service

Let’s Encriptの自動更新を設定する

Let’s Encriptの有効期限は90日間なので有効期限が切れる前に自動で更新するようにcronを設定する。
毎日AM3時に設定しているが適宜変えてください。

# vi /etc/crontab

//crontabに以下を追加
00 03 * * * root /usr/bin/certbot renew --post-hook "systemctl restart httpd.service"

Laravelのインストールとパーミッションを変更する。

こちらの記事で手順を説明しています。

データベースの自動バックアップを設定する。

バックアップの置き場、処理を作る。

バックアップをおくディレクトリとシェルスクリプトをおくディレクトリを作る。

# mkdir /var/bkup
# mkdir /var/shell
# chmod 755 /var/bkup
# chmod 755 /var/shell

シェルスクリプトを作る。

# vi /var/shell/backup_mysql.sh
#!/bin/bash

#バックアップ先
D_DIR="/var/bkup/"

#DB 名
DB_NAME="データベース名"

#DB ユーザー
DB_USER="データベースのユーザー名"

#削除対象の日付 30日前
RMDAY=30

#削除対象の日付作成
RM_DATE=`date +"%Y%m%d" --date "${RMDAY} days ago"`

#今日の日付作成
TODAY=`date +'%Y%m%d'`

#dumpファイル名
D_FILE=${DB_NAME}"-"${TODAY}".sql"

#削除処理
for file in `find ${D_DIR}* -type f -name "${DB_NAME}-*.sql.gz"` ;
do
    #ファイルの日付取得
    F_DATE=`echo $file | sed -e "s/.*${DB_NAME}-\([0-9]\{8\}\)\.sql\.gz$/\1/g"`

    #日付比較      F_DATE  <= RM_DATE
    if [   ` expr $F_DATE + 0` -le  ` expr $RM_DATE + 0 `  ] ; then

    #ファイル削除
    rm -f $file
    fi
done;

#mysql dump 圧縮
mysqldump -u ${DB_USER} -pパスワード  $DB_NAME > ${D_DIR}${D_FILE}
chmod 666 ${D_DIR}${D_FILE}
igzip ${D_DIR}${D_FILE}

シェルスクリプトにDBパスワードを記述しているのでパーミッションを引き締める。

chmod 700 /var/shell/backup_mysql.sh

cron設定をする

# vi /etc/crontab
30 03 * * * root /var/shell/backup_mysql.sh

毎日AM3:30に先ほど作ったシェルスクリプトを実行