こんにちは、WebエンジニアのSHOOT(@Shoot58153748)です。
先日ふとインフラ周りいじってみたくなり、
Webエンジニア歴若干2年弱にしてなんと初のConohaVPS契約。
Laravelのデプロイ、ドメインやSSL通信設定等やったので、
今後再現できるように以下のサーバー環境構築手順を残しておきます。
- PHP/Laravel
- Webサーバー(Nginx)
- DB(MySQL)
- KVS(Redis)
- ドメイン設定(HTTPS化)
環境はCentOS8です。
ローカルで作ったLaravelアプリを本番サーバーにデプロイしたい方は
是非参考にしてください。
※Laravel8のローカル開発環境構築手順は過去記事参照
目次
前準備
VPS契約
コスパ重視で「ConohaVPS」を選びました。(1GB)
他だと「さくらVPS」が有名。
ドメイン購入
お名前.comで1円のドメイン購入しました。
DNS登録
ConohaVPSのDNSに登録(DNS>ドメイン追加)
※初期状態からAレコードを追加(赤部分にあなたのipAddress)
画面に表示されるNSタイプの値3つをコピー
それをお名前.com側に登録(ネームサーバー変更>その他のネームサーバーを使う)
以上でDNS設定が完了です。
それでは契約したVPSのサーバーに入って各種ミドルウェアインストールしていきます。
各種インストール
Git
dnf install git
Nginx
公式ドキュメント:http://nginx.org/en/linux_packages.html#RHEL-CentOS
新しいバージョンをインストールするためにnginx
のレポジトリ設定ファイルを編集
vi /etc/yum.repos.d/nginx.repo
------
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
-------
その後パッケージインストール
dnf install nginx
システム起動時に自動実行を設定
systemctl enable nginx
Nginx起動
systemctl start nginx
最後にhttp(80)ポート開放&リロード反映
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
すると
http://{your-ip}
でブラウザからNginxのトップページにアクセスできます。
MySQL
公式ドキュメント:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html
rpmパッケージインストール
→モジュールDisableに(CentOS8の場合、これを忘れるとパッケージインストールできない)
→パッケージをインストール
dnf install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum module disable mysql
dnf install mysql-community-server
MySQL起動
systemctl start mysqld
以下のコマンドを実行すると、初期パスワード等を設定できる
mysql_secure_installation
ここでDBを作成しておく。
mysql -uroot -p
create database {YOUR_DB_NAME}
Redis
Redisは普通にインストールし、起動する
dnf install -y redis
systemctl enable --now redis
PHP7.4
PHP7.3以上のインストールは、EpelとRemiパッケージが必要
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
PHPモジュールをDISABLEにし、PHP7.4をインストール
dnf module disable php
dnf module install -y php:remi-7.4
Laravel8
phpの必要そうな拡張パッケージをインストール
最低限必要なパッケージはLaravel公式ドキュメントで確認できる
https://laravel.com/docs/8.x/deployment#server-requirements
dnf install -y php-bcmath php-ctype php-fileinfo php-json php-mbstring php-openssl php-pdo php-tokenizer php-xml php-mcrypt php-mysqlnd php-pecl-xdebug php-gd php-intl php-zip php-opcache
composerをインストール
dnf install -y wget
wget https://getcomposer.org/installer -O composer-installer.php
php composer-installer.php --filename=composer --install-dir=/usr/local/bin
composer self-update
Laravel Projectをgit cloneしてパッケージをインストール
cd /var/www && git clone {Your Repository}
composer install
npm install
cp .env.stg .env
php artisan migrate
最後にプロジェクトディレクトリの所有者をnginxに設定する(Nginxでリクエストを受けるため)
chown -R nginx. /var/www/{Project Name}
Nginx設定
php-fpmを起動する&自動起動設定ON
systemctl start php-fpm
systemctl enable php-fpm
php-fpmの設定ファイルを編集(user, groupをnginxに)
vi /etc/php-fpm.d/www.conf
---
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
Nginxの設定ファイル(今回のドメイン:shoot-app.work)
Nginxの設定ファイル編集
ドメイン:shoot-app.work
vi /etc/nginx/conf.d/shoot-app.work.conf
-----------------------------------------
server {
listen 80;
server_name shoot-app.work;
root /var/www/laravel8-tutorial/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
access_log /var/log/nginx/shoot-app.access.log main;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
# pass the PHP scripts to FastCGI server listening on /run/php-fpm/www.sock
#
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
設定をテストして成功したら反映(reload)します。
nginx -t
nginx -s reload
以上で、http://shoot-app.workにアクセスできるようになりました。
次にSSL化に対応していきます。
Https化(Let’s Encrypt)
SSL証明書取得
Let’s Encryptを使用して無料で証明書を取得できます。
ソースコードをgit cloneして、コマンド実行
※nginxのプロセスを止めてから実行しないとエラーになるので注意
cd /opt/
git clone https://github.com/certbot/certbot
cd certbot
systemctl stop nginx
./certbot-auto certonly --standalone -t
コマンドライン上でメールアドレスやドメインを聞かれるので素直に入力すると
SSL証明書を取得できます。
最後に、Nginxの設定ファイルを編集し、サーバーを起動すればOK
Nginx設定ファイル編集
先ほどの設定ファイルにSSL通信のポート番号と証明書のパスを追加(+の行)
/etc/nginx/conf.d/shoot-app.work.conf
server {
listen 80;
+ listen 443 ssl;
+ ssl_certificate /etc/letsencrypt/live/shoot-app.work/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/shoot-app.work/privkey.pem;
server_name shoot-app.work;
root /var/www/laravel8-tutorial/public;
443ポートを開放する設定にします。
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
これで
https://shoot-app.work
でサイトにアクセスできるようになりました。
お疲れ様でした!
※SSL自動更新設定については別途記事書こうと思います
まとめ
Dockerなどのコンテナやクラウド技術の発展により、
生のLinuxサーバー構築機会は減少傾向にあります。
しかし生のLinuxサーバー構築の経験は
自動化されたインフラの裏で何が起きているかを理解する上でとても重要です。
その他実際に構築することで
- ネットワーク
- ドメイン
- DNS(名前解決)
- サーバーの仕組み
- SSL通信…
といったIT知識の理解を深めることにつながります。
インフラエンジニアのみならず、アプリ開発エンジニアにとっても
インフラ周りの知識強化は実務で役立つはずです。
是非とも自分でVPS契約して色々試してみてください!
コメント