はじめに
いよいよ都知事選が始まりました。オンラインが活用されると思いきや、やっぱり駅前で演説をしていて聴衆の密は避けられない今日この頃。2週間後が不安なgrnishiです。
個人的にはペッパー応援団が面白いなーと思っています。
本題
記憶が曖昧ではありますが、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アドレス直打ちでブラウザを叩く。
※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スクリプトなんかでまとめておくと一回叩いたら終わるのでゆっくりコーヒーが飲めますよ。