gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

重い腰をあげてCentOS8で開発環境を構築してみた

f:id:grnishi:20200620005243p:plain

はじめに

いよいよ都知事選が始まりました。オンラインが活用されると思いきや、やっぱり駅前で演説をしていて聴衆の密は避けられない今日この頃。2週間後が不安なgrnishiです。

個人的にはペッパー応援団が面白いなーと思っています。

hochi.news

本題

記憶が曖昧ではありますが、CentOSは2007年に5から使い始めました(確か5.2)。その後、2011年か2012年頃から6を使っています。

なぜか7を使う事なく今に至ります。

ちなみにそれ以前はFreeBSD、それより前はIRIXとかRedHatとか。私のUnix系OS遍歴はこんな感じです。Debianは周りでは使っていましたが私は今のところほど使わず(インストールだけしたことはあります)

あと一瞬だけTurboLinuxも使っていました。そういえばターボリナックス社とは某機動戦士のゲームを一緒に開発した思い出があり、今どうしているかな?と検索してみたら2019年末に終了したそうです。寂しいですね。

そろそろCentOS6系もサポート終了が近づいていますし、PHP7.4入れるのに一苦労しそうという事もあって、今日から新規サーバは8系を使うと心に決めて重い腰をあげました。

また、前々職の頃(13年ぐらい前)からサーバ側の面倒を見るようになってずっとソースコードからインストールをしていました。バージョンが上がるたびに依存関係に悩まされていました。細かい設定が出来るなど利点も多くあるのですが、いい加減時代に逆行している気がします。

というわけで、すべてパッケージ管理システムで入れてみようかと思います。

CentOS 8はyumからdnfに変わったんですね。yumも使えますが。基本的な使い方は同じなのであんまり気になりませんが。

目標

いわゆるLAMP環境(Linux、Apache、MySQL、PHP)+Redisとmemcachedで簡単なサンプルページを動かす。

環境

GCP Compute EngineでCentOS 8を選択してインスタンスを作成した。

また、本記事は2020年6月21日に行った作業ログです。

インストールする各ソフトウェア

Apache httpd

MySQL

PHP

Redis

Memcached

基本的にはdnfでデフォルトのバージョンでインストールしますが、phpが7.2だったのでphp7.4を選択します。

では始めます。

まずはOSの確認を

# cat /etc/redhat-release 
CentOS Linux release 8.2.2004 (Core) 

MySQLのインストール

# dnf install -y mysql-server

PHPのインストール

dnfでインストールできるPHPは7.2なので7.4をインストールする

# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf module install php:remi-7.4

httpdのインストール

# dnf install -y httpd

redisのインストール

# dnf install -y redis

memcachedのインストール

# dnf install -y memcached

諸々使うPHPモジュールをインストール

# dnf install -y php-memcached php-gd php-mcrypt php-opcache php-mbstring php-mysqli php-zip php-redis

MySQLの設定

まずは自動起動設定と起動

# systemctl enable mysqld
# systemctl start mysqld

初期パスワードを確認

# less /var/log/mysql/mysqld.log | grep password
2020-06-21T06:43:04.165784Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

ん?パスワードがempyだと。とりあえずmysql_secure_installationの実行を。

mysql_secure_installation

設定したパスワードでログイン

mysql -u root -p

とりあえず適当にデータベースとテーブルを作っておく

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> use test;
Database changed
mysql> create table test_table (id int(11) primary key auto_increment, message varchar(32));
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> desc test_table;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| message | varchar(32) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

設定ファイルはこの辺に ※コメント消してます

# cat /etc/my.cnf
[client-server]
!includedir /etc/my.cnf.d

# ls /etc/my.cnf.d/
client.cnf  mysql-default-authentication-plugin.cnf  mysql-server.cnf

httpdの設定

まずは自動起動設定と起動

# systemctl enable httpd
# systemctl start httpd

設定ファイルはこの辺の

# cat /etc/httpd/conf/httpd.conf

とりあえずデフォルトのドキュメントルートが/var/www/html/になっているので

# vi /var/www/html/index.php
<?php
  echo hogehoge

特にドメイン等設定していないので、IPアドレス直打ちでブラウザを叩く。

http://127.0.0.1/

※IPアドレスは適宜書き換え。

Redisの設定

まずは自動起動設定と起動

# systemctl enable redis
# systemctl start redis

設定ファイルはこの辺に。 ※長いので場所だけ

# cat /etc/redis.conf

とりあえずこのままにしておきます。

Memcachedの設定

まずは自動起動設定と起動

# systemctl enable memcached
# systemctl start memcached

設定ファイルはこの辺に。

# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"

PHPでテストプログラム

<?php
  $mysqli = new mysqli("localhost", "root", "y0cdy36qA!", "test");
  $redis = new Redis();
  $redis->connect("localhost", 6379);
  $memcached = new Memcached();
  $memcached->addServer("localhost", 11211);

  $sql = "INSERT INTO test_table (message) VALUES('mysqli test')";
  $mysqli->query($sql);
  $sql = "SELECT * FROM test_table";
  $stmt = $mysqli->query($sql);
  $item = $stmt->fetch_assoc();
  echo $item["message"]."\n";

  $redis->set("test_key", "redis test");
  $item = $redis->get("test_key");
  echo $item . "\n";

  $memcached->set("test_key", "memcached test");
  $item = $memcached->get("test_key");
  echo $item . "\n";
# php test.php
mysqli test
redis test
memcached test

無事に各ストレージにアクセスできました。

せっかくなのでhttps環境も

当然、みんな大好きLet's encryptです。先にDNSの設定は済ませておきましょう。

mod_sslをインストール

# dnf install -y mod_ssl

certbotをインストール

# dnf install -y certbot

証明書を発行する。 ※サンプルとして、example.comで書いていますが、自分のドメインを。

# certbot certonly --webroot -w /var/www/html/ -d example.com -m mail@example.com

ダイアログを進めていくと、Congratuations!と出てきて、鍵の保存先が表示される。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-09-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

所在を確認

# ls /etc/letsencrypt/live/example.com/
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

更新時は

# certbot renew

です。crontabに登録するなり。

ssl.confを修正

mod_sslインストール時にとりあえずファイル

# cd /etc/httpd/conf.d/
# vi ssl.conf

下記のあたりを修正

DocumentRoot "/var/www/html"
ServerName example.com:443
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

SELinuxを無効化 ※開発なのでとりあえず

# vi /etc/selinux/config

SELINUX=disabled

サーバ再起動が必要だけど、とりあえず

# setenforce 0
# getenforce
Permissive

httpdを再起動

# systemctl restart httpd

ブラウザからhttpsでアクセスしてみると無事に表示されました。

CentOS 8を触ってみて

ここまでだと、yumがdnfになった事とserviceがsystemctlになったぐらいしか違いが無かったです。

その他調べてみると、ファイルシステムがxfsになっているとか(7から)、iptablesがnftablesになっているとか、ntpがchronyになっているとか。

Google先生と仲良くしながら徐々に慣れていけば良いでしょう。

さいごに

CentOS 8に開発環境を構築してみました。これは開発環境なので本番だともっと話が変わってきます。

fluentdだったりdstatだったりnagiosなりzabbixなり色々必要だったりします。

httpdやmysqlなどのパラメータも調整する必要があるでしょう。

そもそもGCPだからtimezoneがUTCになっていますし、メールも送信できませんし。

あくまで開発環境でのお話でした。

こういうのはまとめてshスクリプトなんかでまとめておくと一回叩いたら終わるのでゆっくりコーヒーが飲めますよ。