🐘

さくらのVPSのUbuntu 18.04にPHP 7.3のLAMP環境とSSL化をセットアップしてDeployerでデプロイ

2020/05/06に公開

さくらのVPSのUbuntu 18.04イメージにPHP7.3のLAMP環境とSSL化をセットアップして、Deployerでデプロイできるようにするまでのすべての手順を丁寧に列挙します。

DigitalOcean版は こちら

1. OSインストール

コントロールパネルにて以下のようにUbuntu 18.04をインストールします。

今回は ufw によるファイアウォール設定は使わず、コントロールパネルのパケットフィルタ機能を使用します。

パケットフィルタを使用する場合、OS内部の ufw の設定がどうなっていようと、パケットフィルタで許可しているポートにしかアクセスできなくなるので、注意が必要です。

https://twitter.com/ttskch/status/1256089674247888896

2. OSをセットアップ

ローカル側

$ ssh ubuntu@xxx.xxx.xxx.xxx

サーバー側

# タイムゾーンを変更
% sudo timedatectl set-timezone Asia/Tokyo

% sudo apt update

# PHP7.3を入れるための用意(標準のままだと7.2が入ってしまう)
% sudo apt install software-properties-common -y
% sudo apt-add-repository ppa:ondrej/php
% sudo apt update

# LAMP環境を作る(apache2はUbuntu 18.04に初めから入っているので追加インストール不要)
% sudo apt install php7.3 mysql-server php7.3-mysql -y
% sudo a2dismod php7.2
% sudo a2enmod php7.3
% sudo service apache2 restart

# 必要に応じてPHPエクステンションをインストール(下記は例)
% sudo apt install php7.3-ctype php7.3-fileinfo php7.3-iconv php7.3-mbstring php7.3-simplexml php7.3-xml -y

# Deployerによるデプロイに必要なものを一式インストール
# @see acl: https://github.com/deployphp/deployer/issues/1118#issuecomment-296160569
% sudo apt install git curl zip unzip php-zip acl -y

# フロントエンドのビルド用に最新のnpmをインストール(標準だと3.5.2が入るのでさすがに古い)
# @see https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
% sudo apt install nodejs npm -y
% sudo npm -v
3.5.2
% sudo npm i -g n
% sudo n stable
% sudo chown -R ubuntu:ubuntu /usr/local/bin/npm /usr/local/bin/npx /usr/local/lib/node_modules/
% sudo npm i -g npm@latest
% npm -v
6.14.4

# Apacheのmod_rewriteを有効化
% sudo a2enmod rewrite
% sudo service apache2 restart

# MySQLを設定
% sudo service mysql start
% sudo mysql -uroot

# データベースを作成
mysql> create database database_name;

# ユーザーを作成
mysql> create user user@localhost identified by "password_here";
mysql> grant all privileges on database_name.* to user@localhost;

mysql> exit;

# ドキュメントルートに書き込みできるように
% sudo chown -R ubuntu:ubuntu /var/www/html

3. サーバーからGitHubのコードベースをpullできるように

GitHubリポジトリがprivateな場合は、デプロイ時にサーバーがpullできるようにSSHキーをGitHubに登録しておきます。

サーバー側

% ssh-keygen -t rsa -N "" -C "" -f ~/.ssh/id_rsa
% cat ~/.ssh/id_rsa.pub # この公開鍵をコピー

コピーした公開鍵を https://github.com/{user}/{repo}/settings/keys/new で適当な名前を付けて登録します。

4. 一旦デプロイを実行

ある程度複雑な構成のアプリなら、サーバー側で色々必要な設定をしていない状態の初回のデプロイ失敗すると思いますが、サーバー側にファイル一式を生成させるために一旦デプロイを実行します。

ローカル側

Deployerの使い方については こちらの過去記事 をご参照ください。

$ dep deploy
# 失敗するのを待つ

サーバー側

# コードベースのうちWebサーバーが書き込みを行うディレクトリがあれば、パーミッションを設定する
% chmod -R a+rw /var/www/html/{project_name}/shared/path/to/{writable_dirs}
# ※ デフォルトのWebサーバー実行ユーザは www-data なので、もう少し厳しく設定したい場合は chmod -R a+w ではなく、chmod -R www-data:user とかにするとよいかと思います  

# 例えば .env.dist を .env にリネームして内容を適切に変更するなどを行う
% cat /var/www/html/{project_name}/release/.env.dist > /var/www/html/{project_name}/shared/.env
% vi /var/www/html/{project_name}/shared/.env # 適切に変更

ローカル側

サーバー側の準備が整ったら、再度デプロイを実施します。サーバー側の調整が正しく済んでいれば、今度は成功します👍

$ dep deploy

5. ApacheのVirtual Hostを作成

Apacheのvhostの設定内容もコードベースで管理しておくのがおすすめです。僕はいつも

  • /docs/apache/http.conf
  • /docs/apache/https.conf

みたいな感じで SSL化してないとき用 SSL化したあと用 の2ファイルをコードベースに入れてあります。

以降の説明はこれを前提に進めます🙏

http.conf の内容

僕がいつも使っているのはだいたいこんな内容です。

<Directory />
    AllowOverride None
    Deny from all
</Directory>

<Directory "/var/www/html/{project_name}/current/public">
    AllowOverride All
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

<VirtualHost *:80>
    ServerName {domain}
    # ServerAlias xxx.xxx.xxx.xxx
    DocumentRoot "/var/www/html/{project_name}/current/public"
    ErrorLog ${APACHE_LOG_DIR}/{project_name}.error.log
    CustomLog ${APACHE_LOG_DIR}/{project_name}.access.log common
</VirtualHost>

https.conf の内容

僕がいつも使っているのはだいたいこんな内容です。

<Directory />
    AllowOverride None
    Deny from all
</Directory>

<Directory "/var/www/html/{project_name}/current/public">
    AllowOverride All
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/{project_name}/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/{project_name}/privkey.pem
        BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
        <FilesMatch \.php$>
            SSLOptions +StdEnvVars
        </FilesMatch>

        ServerName {project_name}
        DocumentRoot "/var/www/html/{project_name}/current/public"
        ErrorLog ${APACHE_LOG_DIR}/{project_name}.error.log
        CustomLog ${APACHE_LOG_DIR}/{project_name}.access.log common
    </VirtualHost>
</IfModule>

<VirtualHost *:80>
    ServerName {project_name}
    RedirectMatch (.*) https://{project_name}$1
</VirtualHost>

実際に設定

サーバー側

# 使わないので削除
% a2dissite 000-default.conf

# vhostの設定ファイルをコードベースからコピー
% cp /var/www/html/{project_name}/current/docs/apache/http.conf /etc/apache2/sites-available/{project_name}.conf
% a2ensite {project_name}.conf
% service apache2 reload

これでひとまず http でサイトにアクセスできる状態まで来ました👍

7. SSL化

サーバー側

# certbot(Let's Encryptのクライアント)をインストールして、証明書を取得
% apt install certbot -y
% certbot certonly --agree-tos --webroot -w /var/www/html/{project_name}/current/public -d {ドメイン}
# 対話式で設定を埋めていってください

# ApacheでSSLを有効化して、confファイルをSSL用のものに入れ替え
% a2enmod ssl
% cp /var/www/html/{project_name}/current/docs/apache/https.conf /etc/apache2/sites-available/{project_name}.conf
% service apache2 restart

これで、 https でサイトにアクセスできる状態になります👍

GitHubで編集を提案

Discussion