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に先ほど作ったシェルスクリプトを実行