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