Laravel本番環境構築メモ
CentOS7 + Nginx + PHP + PostgreSQL + Redis + Supervisorで本番環境を構築した時の作業履歴。
さくらのクラウドを使いました。
初期設定
今回に限らず、サーバ構築時の共通設定として以下の作業を行いました。
一般ユーザーの作成&sudo&ssh接続設定(公開鍵認証)&システムアップデート
参考: https://help.sakura.ad.jp/hc/ja/articles/206208181
sshdの再起動は
# systemctl restart sshd
参考URLにあるパケットフィルターはさくらのVPS用のものなので、ここではスルーします。
yum-cronによるパッケージの自動更新
インストール
# yum -y install yum-cron
設定
# vi /etc/yum/yum-cron.conf
自動更新を有効に設定
apply_updates = yes
サービス起動&自動起動設定
# systemctl start yum-cron # systemctl enable yum-cron
# systemctl enable yum-cron
Firewall設定
http、httpsのポートを開けます。
# vi /etc/firewalld/zones/public.xml
<zone>
…省略
<service name="http"/>
<service name="https"/>
</zone>
設定変更したらサービスを再起動します。
# systemctl restart firewalld
Nginx
インストール
# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
enabled=0
gpgcheck=0
yum -y --enablerepo=nginx install nginx
サービス起動&自動起動設定
# systemctl start nginx
# systemctl enable nginx
php&php-fpm
EPELリポジトリの追加
# yum install epel-release
インストール済みだったような。
remiリポジトリの追加
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
インストール
$ sudo yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-pgsql php-gd php-xml php-mcrypt php-fpm
php-fpmの設定
# vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock;
listen.owner = nginx
listen.group = nginx
php-fpm起動&自動起動設定
# systemctl start php-fpm
# systemctl enable php-fpm
Nginxでphpを設定
# vi /etc/nginx/conf.d/default.conf
root /usr/share/nginx/html;
location / {} の中からserver {} 直下に出す
location / {
index index.php index.html index.htm;
}
index.phpを追加
location ~ \.php$ {
#root html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
コメントを外して、それぞれ変更
動作確認用phpファイル作成
# vi /usr/share/nginx/html/phpinfo.php
<?php phpinfo(); ?>
Nginxを再起動
# systemctl restart nginx
ブラウザから /phpinfo.php にアクセスして表示されるのを確認
Composerインストール
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar /usr/local/bin/composer
PostgreSQL
インストール
# yum -y install postgresql-server postgresql-devel
初期化処理
# postgresql-setup initdb
サービス起動&自動起動設定
# systemctl start postgresql.service
# systemctl enable postgresql.service
パスワード認証に変更
# vi /var/lib/pgsql/data/pg_hba.conf
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
に変更
postgresユーザのDB接続パスワード設定
# su - postgres
$ psql -U postgres
postgres=# ALTER USER postgres encrypted password 'パスワード'; postgres=# \q
$ exit
サービス再起動
# systemctl restart postgresql.service
ユーザー作成
# su - postgres
$ createuser -P ユーザー名
パスワード入力
DB作成
$ psql -U postgres
postgres=# create database DB名 owner ユーザー名;
Redis
インストール
# yum install --enablerepo=epel,remi redis
サービス起動&自動起動設定
# systemctl start redis.service
# systemctl enable redis.service
Laravelアプリ
Laravelアプリのgitリポジトリがある前提です。
今回は /var/www ディレクトリに配置します。上記で作成した一般ユーザが書き込みできるよう権限を付加しておきます。
git clone
$ git clone リポジトリURL
$ cd リポジトリ名
Laravelセットアップ
$ composer install
$ cp .env.example .env
$ php artisan key:generate
$ vi .env
APP_ENV=production
APP_DEBUG=false
APP_URL=[LaravelアプリのURL]
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=[作成したDB名]
DB_USERNAME=[作成したDBユーザ名]
DB_PASSWORD=[DBユーザのパスワード]
QUEUE_CONNECTION=redis
MAIL_DRIVER=sparkpost
SPARKPOST_SECRET=[sparkpostのAPIキー]
メール送信は https://www.sparkpost.com/ を利用しました。
$ php artisan migrate:fresh --seed
$ chmod 777 -R /var/www/imbr-delivery/storage
Nginx設定変更
# vi /etc/nginx/conf.d/default.conf
root /var/www/[リポジトリ名]/public;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
}
設定変更後、サービスを再起動する。
# systemctl restart nginx
Let’s Encript
certbotのインストール
一般ユーザのホームディレクトリで行いました。
$ git clone https://github.com/certbot/certbot
証明書の取得
$ cd certbot
$ sudo ./certbot-auto --nginx
証明書の更新
0 4 1 * * /home/[一般ユーザ名]/certbot/certbot-auto renew && /bin/systemctl reload nginx
cronで設定します。
Supervisor
インストール
# yum install supervisor
サービス起動&自動起動設定
# systemctl start supervisord.service
# systemctl status supervisord.service
設定ファイル編集
# vi /etc/supervisord.d/laravel-worker.ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
directory=/var/www/[リポジトリ名]
command=php artisan queue:work redis --sleep=3 --tries=1
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/imbr-delivery/storage/logs/worker.log
supervisorの起動
# supervisorctl reread
# supervisorctl update
# supervisorctl start laravel-worker:*
その他
タスクスケジューラ
Laravelのタスクスケジューラを使うために以下のCron設定を行います。
0,10,20,30,40,50 * * * * cd /var/www/[リポジトリ名] && php artisan schedule:run >> /dev/null 2>&1