nakayumcの技術ブログ

エンジニア2年目のブログです。

LinuC-1 に合格した話

取得した経緯

学校で掲示されていたパンフレットで「学校でLinuCのチケットを買うと、LinuC 101、102がそれぞれ1万円で受けられる」ので取得してみました。

LinuC とはなんぞや?

簡単に言えば、Linuxの認定資格 LPI-JAPAN公式HPを見た方がわかりやすいかと思います、、。

お家騒動的なのがあってLPICとLinuCがあるみたいです。 資格のレベル感はあまり変わらないみたいですが、 LPIC: 世界的 LinuC: 日本独自 らしいです... 。

勉強方法

・まず合格教本でざっと読む ・実際に触ってコマンドを叩いてみる ・問題集を解く ・ping-tの問題集とコマ門を少しやりました。

使った本

最短突破 LinuCレベル1 バージョン10.0 合格教本[101試験, 102試験対応][Amazon] ・Linux教科書 LinuCレベル1 スピードマスター問題集 Version10.0対応 [Amazon]

この本を使ってました。

本番の試験

まず、Pearson VUEで申し込む。

当日は10分前ぐらいに着いて、説明を聞いたり、顔写真を撮ってもらったらテストスタート。 ほとんどの問題が、選択問題でした。

事前に練習していた問題とほぼ似ている、全く同じ問題が出ました。 そのおかげで、最初に問題を見た段階で「あ、この問題分かる、分からない」 がすぐ判断できます。

テストが終わると、すぐに合否が出ます。

点数は、最低200点で、最高が800点です。

私の点数は、
101試験: 706点

102試験: 666点

だったので、100点満点にすると、80ー90点くらい取ることができたと思います。

資格にチャレンジしてわかったこと

こんなに本買う必要なかったと思いました。

試験日先に決めて、申し込んでおくと、 ・お金かかってる ・時間が限られている

と自分にいい意味でプレッシャーをかけられます。 私の場合、2週間前に、試験の予約をして、超集中型で取り組めました!

かなりおすすめです!

Apache(httpd)をソースから構築する

概要

今回はソースからインストールしてLAMP環境を構築していきます。必要になるものはなるべくソースからインストールしていますが、wgetgccはdnfコマンドでパッケージからインストールします。この記事は Apacheをソースからインストールします。MySQLPHPは次回の記事でインストールしていきます。

環境

OS - ホスト: ESXi 7.0.1 - OS: CentOS8 (最小限のインストール)

使用ライブラリ - apache-2.4.46 - apr-1.7.0 - apr-util-1.6.1 - openeel-3.0.0 - pcre-8.44 - expat-2.3.0

事前準備

Apacheソースコードからインストールするためには、gccmakepcrepcre-devel のライブラリが必要になります。 なので、それらをあらかじめインストールしておきます。

# dnf install gcc gcc-c++ make pcre pcre-devel perl wget

httpdをソースからインストール

今回は、ソースからApache(httpd)をインストールしていきます。 以下のページにApacheのビルドに必要なライブラリやインストール手順が書かれていて、ここを参考にしています。 Compiling and Installing – Apache HTTP Server Version 2.4 これに従うと、APRAPR-Util と PCRE というのライブラリが必要になりますが、その他にもExpatというライブラリや追加した方が良いモジュールもあるので、作業がスムーズになるように整理してまとめていきます。 まず、Apache本体をダウンロードします。

# cd /usr/local/src 
# wget https://ftp.yz.yamagata-u.ac.jp/pub/network/apache/httpd/httpd-2.4.46.tar.gz
# tar zxvf httpd-2.4.46.tar.gz

APRAPR-Util

APR(Apache Portable Runtime)は、Apacheのサポートライブラリで、OS等の環境の違いを吸収する機能です。使用するOSが、機能が備わっていない場合、このAPRが代わりとなってその機能を提供してくれます。

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/apr/apr-1.7.0.tar.gz
# tar zxvf apr-1.7.0.tar.gz
# mv apr-1.7.0 httpd-2.4.46/srclib/apr

APR-Utilも同様に、ダウンロードと解凍をして、解凍できたディレクトリをhttpd-2.4.46/srclib/apr-utilに移動させます

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/apr/apr-util-1.6.1.tar.gz
# tar zxvf apr-util-1.6.1.tar.gz
# mv apr-util-1.6.1.tar.gz httpd-2.4.46/srclib/apr-util

以上でAPRAPR-Utilの準備は終わりです。

PCRE

PCRE(Perl Compatible Regular Expressions)は、Perl互換の正規表現を他の言語でも使えるようにするもので、多くのミドルウェアで必要とされているライブラリです。 事前準備が終わっていなければ、インストールしてください。 PCREのビルドをしていきます。wget でダウンロードして、展開・解凍を行い、解凍・展開してビルドします。

# wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
# tar zxvf pcre-8.44.tar.gz
# cd pcre-8.44.tar.gz
# ./configure 
# make 
# make install

Expat

Expatとは、XMLファイルの中身のデータを解析・整形するライブラリです。 Welcome to Expat! · Expat XML parser のサイトから、wget でダウンロードして、展開・解凍を行い、解凍・展開してビルドします。

# wget https://github.com/libexpat/libexpat/releases/download/R_2_3_0/expat-2.3.0.tar.gz 
# tar zxvf expat-2.3.0.tar.gz 
# cd expat-2.3.0.tar.gz 
# ./configure 
# make 
# make install

OpenSSL

これでApacheのビルドができますが、TLS通信は必須なので、OpenSSLをソースからビルドしていきます。 この段階で設定しておかないと、後からOpenSSLを使用できないからです。(再度ビルドすることになる)

# wget https://www.openssl.org/source/openssl-3.0.0-alpha14.tar.gz
# tar zxvf openssl-3.0.0-alpha14.tar.gz
# cd openssl-3.0.0-alpha14.tar.gz
# ./config
# make
# make install

Apacheのビルド

これで準備ができたので、Apacheをビルドしていきます。

# cd httpd-2.4.46/
# ./configure \
--prefix=/usr/local/httpd \
--with-included-apr \
--with-pcre=/usr/local/src/pcre-8.44/pcre-config \
--enable-mods-shared=all \
--enable-ssl \
--with-ssl=/usr/local/ssl \
--with-mpms-shared=all
# make
# make install

configureのオプションは以下の通りです。

オプション 説明
–prefix インストールするディレクトリを指定
–with-included-apr srclib内のAPRAPR-Utilもビルド対象にする
–with-pcre インストールしたPCREのディレクトリを指定
–enable-mods-shared 動的モジュールをビルド対象にする
–enable-ssl sslモジュールをビルド対象にする
–with-ssl インストールしたOpenSSLのディレクトリを指定
–with-mpms-shared worker, prefork, eventをビルド対象にする

ビルドができたら、新しくapacheのユーザとグループを作成し、メイン設定ファイルを変更します。 サービスを動かす用のユーザなので、デフォルトシェルに/sbin/nologinを指定して、ログインを禁止にします。

# cd /usr/local/httpd/
# groupadd apache
# useradd apache -g apache -s /sbin/nologin
# chown -R apache.apache .
# vi conf/httpd.conf

# vi /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl stop

[Install]
WantedBy=multi-user.target

以下のコマンドで変更を反映させます。

# systemctl daemon-reload

ファイアウォールの設定を変更して、HTTP/HTTPS通信用の待ち受けポートを開放させます。

# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload

自動起動&今すぐ起動の設定を行います。

# systemctl enable httpd --now

まずはcurlコマンドでページをとってこれるか確認します。

# curl http://192.168.1.220
<html><body><h1>It works!</h1></body></html>

そしたら、実際にWebブラウザで開いてみて、この画面が表示されればApacheがビルドして、起動することができています。

まとめ

こんかいは、Apacheのみでしたが、これから、LAMP環境のMySQL PHPのソースからのインストールに挑戦していきたいと思います。

ESXi7.0でVMFSL領域を減らしてデータストアの容量を増やす方法

TL;DR

・ESXi7.0からコンテナに対応するため、ESX-OSData(VMFSL領域)が作られます

・VMFSLの容量を減らすにはインストール時にオプションを付ける必要があり、既にインストール済みの方はクリーンインストールする必要があります。 減らす方法は以下をご覧下さい。

概要

バージョン7.0の新機能等はこちらのリリースノートに詳しく詳細が記載されています。

簡単に言うと「Kubernetesへのネイティブに対応するため」で、要するにコンテナ対応です。

まず、公式ガイドの ESXi ハードウェア要件をまとめると以下のようになります。

  • ESXi 6.7 まで - 最低 1 GB の起動デバイス - VMFS ボリュームと 4 GB のパーティションを起動デバイスに作成するには、5.2 GB 以上のデバイスが必要(HDD/SSD/SAN 等) - SDカード、USB メモリをブートデバイスとする場合はコアダンプの保存に利用するため 4GB 以上、推奨は 16 GB 以上のフラッシュドライブの利用が推奨されている
  • ESXi 7.0 から - 最低 4 GB の起動デバイス - SD カード、USB メモリをブートデバイスとする場合は 8 GB 以上が推奨 - HDD、SSD、NVMe などのその他のデバイスでは 32 GB 以上が推奨され、ブート パーティションESX-OSData ボリュームが作成される - 138GB を超える HDD、SSD、NVMe ドライブの場合は ブート パーティション、ESX-OSData ボリューム、および VMFS データストアが作成される

このように、ESXi 7 では新たに ESX-OSData という VMFS-L フォーマットの新しい領域が作成されます。

可変の ESX-OSData が 120GB まで拡張されるため、VMFSで利用できる容量が少なくなってしまいます。

VMFSL(VMFS-L)を減らす方法

「コンテナなんか使わないのに!」と考えている方(大半がこれ)は無駄な容量なので削減したいところですが、この領域を減らすにはインストール時に起動オプションを入れる必要があり、インストール済みの方は再度クリーンインストールする必要があるということです。

※インストール後は減らすことが出来ません。 もし出来たら連絡していただけますと幸いです。修正いたします。

ではやり方を説明していきます。

この操作を実行したことによって損害が発生しても責任は負えません。 自己責任でお願いいたします。
※ライセンスキーを控える、仮想マシン等のデータは別のデータストア(他のHDDやSSD)に移しておくことをおすすめします。

いつも通りにrufusなどでESXiのインストーラを作成してください。 インストーラーが起動したら、すぐに(右下に書いてある)SHIFT + O を押して、起動オプションを編集します。

既に、cdromBoot runweaselが記述されているので、うしろに(今回は8GBでインストールを進めます)

autoPartitionOSDataSize=8192

を追記(大小文字は区別されます)して、Enterを押してください。

あとはそのままインストール作業をしてください。インストールできたら、Web管理画面に移動して、パーティションを確認してみましょう。

このようにVMFSLの領域が8GBになっています。

まとめ

VMFSLが大量に浪費されているのは Kubernetes へのネイティブな対応するためでした。これで容量を増やすことができると思います。 それでは、楽しいESXiライフを。

RHEL8でNginx1.18+PHP7.4+MariaDB10.3でWordPressをインストールする

はじめに

WordPressをRHEL8環境下でインストールしたので備忘録として手順をまとめます。

CentOS8が、2021年12月31日にサポートが終了してしまうので、代わりのOSを探していたところ、2月1日から個人開発者には本番環境を含む最大16システムまで無料でRed Hat Enterprise Linuxの利用が認められるようになりました。(個人でも商用でも1人で使用するサーバに限られるようです。)  

インストールした環境

- ホスト: ESXi 6.7
- OS: Red Hat Enterprise Linux 8
- nginx 1.18
- PHP 7.4
- MariaDB 10.3
- WordPress 5.7

今回はRed Hat CDNを使用して [サーバー] で進めました。

各パッケージのインストールと設定

RHEL8ではパッケージ管理に大きな変更がありました。 Red Hatからリリースされるコンテンツは BaseOS と Appstream の二つのリポジトリから配信されるようになり、特に Appstream では、従来のパッケージ形式のソフトウェア管理に加わる形で、新たにモジュールという概念が追加されました。 モジュールとは、小さなリポジトリの集合から構成されるもので、RPM をさらに拡張させた新たなパッケージ管理の仕組みです。yum コマンドの使用感をそのままに新たな概念が導入された結果、dnf コマンドにはパッケージ形式とモジュール形式という二つのインストール形式が共存することになりました。

nginx1.18のインストール

普通に dnf module install でインストールすると1.14のバージョンがインストールされます。 下記のコマンドを叩いてみてください。

dnf module list nginx

この画像を見てみると、Stream列のところの 1.14 に [d][e] となっていますね。これは、インストールされるデフォルト[d]のバージョンが1.14で、それが有効[e]になっていることを示しています。ですので、dnf module install で進めると1.14がインストールされるわけです。

なので、下記のコマンドで1.18のnginxをインストールします。

dnf module install nginx:1.18

nginxの起動&自動起動の有効化

下記のコマンドで起動と自動起動の有効化が同時にすることができます。

systemctl --now enable nginx
firewalld (ポート着信許可設定)

次に、firewall-cmd コマンドで http(80) と https(443) のポートを開けていきます。

firewall-cmd --permanent --add-service=http
success

firewall-cmd --permanent --add-service=https
success

firewall-cmd --reload
success

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client http https ssh <- ここに「http」と「https」が追加されたことを確認
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

次に、正しくポートが空いているか実際に確認します。

サイトにアクセスできるか確認

これでサーバのIPアドレスでアクセスすると下記のような画面が表示されます。

この画面が出れば、正しくポートが開いています。

PHP7.4のインストール

PHPも同様に、dnf module install を使用して、インストールしていきます。

dnf module install php:7.4

あと、WordPressを動かすのに足りないパッケージもインストールします。

dnf install php php-devel php-mysqlnd php-pdo php-gd

PHPのバージョン確認

バージョンが7.4であることを確認します。

# php -v
PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
 
# php-fpm -v
PHP 7.4.6 (fpm-fcgi) (built: May 12 2020 08:09:15)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
PHPのバージョン非表示

続いて、PHPバージョンを非表示にしていきますWappalyzerという chrome拡張機能でバージョンが 7.4.6であることが分かってしまいます。このような状態だと、攻撃に有用な情報を取得される可能性がありますので念のため非表示にします。

変更するには /etc/php.ini ファイルを変更します。

vi /etc/php.ini

目安として380行目あたりにあると思われますが、expose_php = On を Off に変更します。

;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = On <- Off に変更

/etc/php-fpm.d/www.conf のユーザ変更
vi /etc/php-fpm.d/www.conf

/etc/php-fpm.d/www.confをスーパーユーザーのテキストエディタで開き、下記のように2つの箇所を変更してください。

変更前
user = apache
group = apacheapache の部分をnginxに変更

変更後
user = nginx
group = nginx
変更前
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

↑コメントを外して、nobody を nginx に変更

変更後
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

編集が終わったら保存してエディタを終了します。

また、このままだとセッションを保存しておくディレクトリの所有者が apache になっていて、ユーザーのログインなどが出来なくなってしまうのでchownコマンドで変更します。

chown -R nginx:nginx /var/lib/php/session

これができたら起動します。

systemctl enable --now php-fpm

MariaDB10.3 のインストール

MariaDBは dnf install を使用してインストールしていきます。

dnf install mariadb-server mariadb

起動&ユーザー作成

まずMySQLを起動と自動起動を有効化します。

systemctl enable --now mariadb

そしたら、mysql_secure_installationコマンドで、rootパスワード設定と初期設定をしていきます。

mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):何も打たずにEnter
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
# パスワード入力
New password:
# パスワード再入力
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

# 匿名ユーザを削除するか? [y]を選択
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

# rootユーザのリモートログインをブロックするか? [y]を選択
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

# テストDBを削除するか? [y]を選択
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

# 権限テーブルをリロードするか? [y]を選択
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
データベース作成

MySQL内でWordPress用のDB、ユーザ作成をします。
ユーザへ権限付与 MySQL 8.0から GRANT文でのユーザ作成ができないので、CREATE文でユーザ作成をして、権限付与しています。 また、MySQL 8.0からユーザ作成はcaching_sha2_password形式がデフォルトの設定になっていますが、PHP7.2以降は対応していないので従来のmysql_native_password形式指定をしています。

これらのコマンドでデータベースとユーザーを作成してください。パスワードに関しては、rootに設定したものとは別のものにすることをお勧めします。

mysql -uroot -ppassword <-オプションと文字列をくっつける

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.27-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database wp_database default character set utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on wp_database.* to wp_admin@localhost identified by 'wp_admin用のパスワード';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Wordpressのインストール

wgetコマンドで WordPress をダウンロード、/var/www/html/wordperssに展開しました。さらにchownコマンドで 所有権をnginxに設定します。

cd /tmp/
wget https://ja.wordpress.org/latest-ja.tar.gz
tar zvxf latest-ja.tar.gz -C /var/www/html/
chown -R nginx:nginx /var/www/html/wordpress
ll /var/www/html/wordpress/

nginxの設定

以下の内容に書き換えてください。心配な方は必要に応じて元の記述内容をコメントアウトしてください。

vi /etc/nginx/conf.d/wordpress.confuser nginx;
worker_processes auto;
error_log /var/log/nginx/main_error.log warn;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 2048;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;  #これをどこかに追加

    server {
        listen 80;
        server_name _;

        location / {
                return 301 https://example.com$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name example.com;

        access_log  /var/log/nginx/ssl_access.log  main;
        error_log  /var/log/nginx/ssl_error.log warn;

        index index.php index.html;
        root /var/www/html/wordpress;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

        location ~* /wp-config.php {
                deny all;
        }

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass   unix:/run/php-fpm/www.sock;
        }
    }
}

example.com となっている場所はすべてご自身のドメインに置き換えてください。編集が終わったら nginxを再起動してください。

systemctl restart nginx

SELinuxの設定

SELinuxが有効化された状態だと、PHPでのファイル書き込みとインターネット通信が制限されてしまうので、テーマやプラグイン、アップデートのインストールができません。なので、これらを許可する必要があるので、下記のコマンドを叩きます。

setsebool -P httpd_can_network_connect 1
chcon -R -h -t httpd_sys_script_rw_t /var/www/html/wordpress

WordPress のセットアップ

ブラウザからサーバーIPの /wp-admin/install.php にアクセスしてください。例えば、ドメインexample.com だとURLは https://example.com/wp-admin/install.php です。

アクセスすると、このような画面が表示されます。

次に進んで、データベースの設定の画面では以下のようにMariaDB で設定したデーターベース名・ユーザー名・パスワードを指定します。
ここでエラーが出る方は、上記の設定をもう一度見直してみてください。

この記事の通りにしているならばデータベース名は wp_database、ユーザー名は wp_admin 、パスワードはMariaDBのところで wp_admin用パスワードを設定したと思うので、そのパスワードを入力してください。

正しくできれば、「インストールを実行」という画面が表示されます。続いてボタンをクリックしてください。

あとはサイトのタイトルと管理者のユーザーを作って「Wordpressをインストール」押せば設定は完了です。

成功したら「ログイン」を押すとログイン画面に移動するので、先ほど作った管理者用のユーザーでログインしてください。

これでインストール完了です。

終わりに

以上でインストール完了ですが、現状ではWordpressを動かすのに必要最低限の設定しか行っていません。ので今後nginx の設定も書いていきたいです。