カテゴリー
IT MySQL PHP Web サーバー プログラム

PHPからMySQL8.0に接続できなくなった

MySQL8.0.4から、パスワードの認証方式が変わっているため(caching_sha2_password)、PHPから接続する際に、古いパスワードの認証方式(mysql_native_password)で行っていると以下のようなエラーが表示されます。

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

PHP 7.1.6、7.2.4以降から、caching_sha2_passwordに対応しています。この記事では、古い認証方式のまま接続する方法を解説します。

以下のコマンドでMySQL Serverに接続します。

mysql -u root -p

以下のSQL文で現在の設定を確認します。

SELECT user, host, plugin FROM mysql.user;

以下のように出力されるはずです。

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

以下のSQL文でrootのパスワードを変更します。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

カテゴリー
Apache HTTP IT Web サーバー

Apacheが起動しない

新年早々、Apacheが停止してしまいました。apachectl status すると、以下のように表示されます。

 httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: failed (Result: exit-code) since Fri 2021-01-01 15:27:35 JST; 4s ago
     Docs: man:httpd.service(8)
  Process: 2130 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 2130 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."

 1月 01 15:27:35 app3.uqunie.com systemd[1]: Starting The Apache HTTP Server...
 1月 01 15:27:35 app3.uqunie.com systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
 1月 01 15:27:35 app3.uqunie.com systemd[1]: httpd.service: Failed with result 'exit-code'.
 1月 01 15:27:35 app3.uqunie.com systemd[1]: Failed to start The Apache HTTP Server.
root@app:/etc/httpd/conf.d :master $ apachectl start
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.

journalctl -xe しても有用な情報は得られません。tail /var/log/httpd/error_log したところ、有用な情報が得られました。

[Fri Jan 01 15:27:35.696005 2021] [ssl:emerg] [pid 2130:tid 140584156498240] AH02572: Failed to configure at least one certificate and key for ik1-430-47062.vs.sakura.ne.jp:80
[Fri Jan 01 15:27:35.696020 2021] [ssl:emerg] [pid 2130:tid 140584156498240] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Fri Jan 01 15:27:35.696023 2021] [ssl:emerg] [pid 2130:tid 140584156498240] AH02312: Fatal error initialising mod_ssl, exiting.
AH00016: Configuration Failed

直接の原因は分かりませんが、SSL関連があやしそうです。

私は、/etc 以下の設定ファイルを git で管理しています。そうすると、yumapt などの パッケージ管理システム で、自動的に追加された設定が分かります。

git diff すると、あやしい設定がすぐに見つかりました。

Include /etc/letsencrypt/options-ssl-apache.conf

上記をコメントアウトしたところ、無事に起動できました。

カテゴリー
IT MySQL Web サーバー

MySQL 8.0 の起動直後に最初に実行するコマンド

MySQL 8.0 を起動して最初に実行するべきコマンドがあります。このコマンドを実行するとrootパスワードの変更や不要なアカウント・データベースの削除が実行されます。

以下のコマンドを実行します。(パスはMacPortsの場合)

/opt/local/lib/mysql8/bin/mysql_secure_installation

まず最初にrootのパスワードを入力します。

最初のrootのパスワードは、MySQLの初期化時に、ランダムな文字列が自動的に生成されています。詳しくは以下の記事を参照して下さい。

MySQL8.0のインストール時に自動的に作成されるパスワード
Enter password for user root: 

ログインをするとまず最初にパスワードの設定を行います。

The existing password for the user account root has expired. Please set a new password.

ユーザーアカウントrootの既存のパスワードの有効期限が切れています。 新しいパスワードを設定してください。

MySQLのインストール時に作成されたパスワードは有効期限切れになっているので、新しいパスワードを入力して下さい。

New password: 

確認用にもう一度入力して下さい。

Re-enter new password: 

次に、パスワードの強度を高めるか確認されます。

VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. 
It checks the strength of password and allows the users to set only those passwords which are secure enough. 
Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: 

VALIDATE PASSWORD COMPONENTを使用して、パスワードをテストし、セキュリティを向上させることができます。
パスワードの強度をチェックし、ユーザーが十分に安全なパスワードのみを設定できるようにします。
VALIDATE PASSWORDコンポーネントをセットアップしますか?
yかYを押したらYes、他のキーを押したらNo。

互換性を維持するならNを押して下さい。意味がよく分からないなら、Nです。

Nを押した場合は、rootのパスワードを更新する必要があるはずです。(必要ないかもしれませんが、しておくのが無難です)

Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 

rootに既存のパスワードを使用します。
rootのパスワードを変更しますか?

次に、匿名ユーザーを削除するか聞かれます。これは通常Yです。

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL 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.

デフォルトでは、MySQLインストールには匿名ユーザーが含まれているため、ユーザーアカウントを作成しなくても誰でもMySQLにログインできます。
これはテストのみを目的としており、インストールを少しスムーズにすることを目的としています。
実稼働環境に移行する前に、それらを削除する必要があります。

次に、rootユーザーによるログインをlocalhostだけに限定するか聞かれます。これは通常はYです。

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

通常、rootは「localhost」からの接続のみを許可する必要があります。
これにより、誰かがネットワークからルートパスワードを推測できないようになります。

次に、testというデフォルトで作成されているデータベースを削除するか聞かれます。これはどちらでもいいです。必要になったら作ればいいので、Yでいいと思います。

By default, MySQL 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.

デフォルトでは、MySQLには「test」という名前のデータベースが付属しており、誰でもアクセスできます。
これもテストのみを目的としているため、実稼働環境に移行する前に削除する必要があります。

最後に、上記の設定を即時で反映するか聞かれます。通常はYです。

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

特権テーブルを再ロードすると、これまでに行ったすべての変更がすぐに有効になります。

以下に全文を掲載します。

phpbeginners@MacBookAirM1:~/ $ /opt/local/lib/mysql8/bin/mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: n 
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: 

Re-enter new password: 
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL 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.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : 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.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL 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.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : n

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

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

カテゴリー
IT MySQL Web サーバー

MySQL 8.0 が初期化できない(失敗する)

MySQL 8.0のインストール時に、以下のコマンドを入力してMySQLを初期化します。

sudo /opt/local/lib/mysql8/bin/mysqld --initialize --user=_mysql

ところが、失敗する場合があります。

2020-12-31T04:19:51.070483Z 0 [System] [MY-013169] [Server] /opt/local/lib/mysql8/bin/mysqld (mysqld 8.0.22) initializing of server in progress as process 65161
2020-12-31T04:19:51.071361Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2020-12-31T04:19:51.071367Z 0 [ERROR] [MY-013236] [Server] The designated data directory /opt/local/var/db/mysql8/ is unusable. You can remove all files that the server added to it.
2020-12-31T04:19:51.071409Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-12-31T04:19:51.071510Z 0 [System] [MY-010910] [Server] /opt/local/lib/mysql8/bin/mysqld: Shutdown complete (mysqld 8.0.22)  Source distribution.

何らかの理由で、データディレクトリが残っているためです。以下のようなコマンドで、データディレクトリを移動しましょう。

sudo mv /opt/local/var/db/mysql8 /opt/local/var/db/_mysql8

カテゴリー
IT MySQL Web サーバー

MySQL 8.0 は、rootのパスワードがランダムに作成されます

MySQL 8.0 では、安全のためインストールする毎にrootのパスワードをランダムな文字列で自動的に作成します。

MySQL 8.0をインストールすると、次のようなメッセージが表示されます。(以下はMacPortsでの例)

mysql8-server has the following notes:
If this is a new install you might want to run:

$ sudo /opt/local/lib/mysql8/bin/mysqld --initialize --user=_mysql
$ sudo port load mysql8-server
$ /opt/local/lib/mysql8/bin/mysql_secure_installation

The first command creates the necessary files for the MySQL database service.
(Remember to make a note of the auto-generated root password from this step.)
The second command starts the MySQL service.
The last command helps to improve the security of your running MySQL instance.

Once enabled, the MySQL logs can be found in:
/opt/local/var/log/mysql8

上記には、最初に実行する3つのコマンドが指示されています。最初に実行するのは以下のコマンドです。

sudo /opt/local/lib/mysql8/bin/mysqld --initialize --user=_mysql

上記のコマンドを実行すると、以下のような実行結果になりますが、ポイントは赤矢印の箇所になります。

ここに、ランダムに生成された最初のrootのパスワードが作成されています。

カテゴリー
IT MacPorts MySQL Web サーバー プログラム

MacPortsで全てのバージョンのMySQLを実行する

MacPortsだと全てのバージョンのMySQLを実行できます。

/opt/local/etc/mysql8/macports-default.cnfskip-networking が設定されているからです。

これは、TCP/IPによる通信ではなく、UNIXドメインソケット(ファイルシステムを使ったプロセス間通信)を利用しているからです。

これは、.sockファイルのパスを変えることで、複数バージョンの起動を可能にする手法です。

TCP/IPでは待ち受けポート(リスニングポート)番号は重複できません。(当然!)

逆に言うと、ポート番号を変えれば複数バージョンの起動も可能ですし、同一バージョンを複数起動する事も可能です!

カテゴリー
IT PHP Web プログラム

Cookieのクロスサイト設定

A cookie associated with a cross-site resource at http://example.com/ was set without the SameSite attribute.

http://example.com/のクロスサイトリソースに関連付けられたCookieが、 SameSite属性なしで設定されました。

A future release of Chrome will only deliver cookies with cross-site requests if they are set with SameSite=None and Secure.

Chromeの今後のリリースでは、 SameSite = None および Secure が設定されている場合にのみ、クロスサイトリクエストでCookieを配信します。

You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/feature/5088147346030592 and https://www.chromestatus.com/feature/5633521622188032.

デベロッパーツールのApplication> Storage> CookiesでCookieを確認し、https://www.chromestatus.com/feature/5088147346030592 および https://www.chromestatus.com/feature/5633521622188032 で詳細を確認できます。

カテゴリー
IT Web プログラム 勉強会 開発環境

開発環境(XAMPP)のインストール

Webプログラミングの始め方

Webプログラミングを始めるには開発環境を用意する必要があります。

しかし、レンタルサーバーを借りたり、VPSやAWSを用意したりする必要はありません。

自分が持っているパソコンに開発環境をインストールすることによって、自分のパソコンが開発環境になるからです。

この記事では、自分のパソコンに開発環境をインストールする方法を解説します。

開発環境とは

Web開発における開発環境とは、まず、Webサービスを提供するWebサーバーを用意することから始まります。代表的なWebサーバーは、“Apache” です。

一般的に、“PHP” は “Apache” の内部で実行されて、HTMLとして出力されます。

一昔前の話をすると、昔は、Webプログラミングを始める人は、レンタルサーバーを借りて、レンタルサーバーにFTPでプログラムをアップし、ブラウザをリロードして動作を確認するという手順で開発を行っていました。

このような開発手法は現代ではとても非効率ですが、1995年頃は、このような開発手法が一般的でした。

しかし現代では、プログラムを書くWindowsやMacといったパソコンに開発環境をインストールし、FTPなどはせず、直接WindowsやMacでプログラムを動かし、デバッグし、完成したものをサーバーにアップするという手順で開発します。

ただし、Windowsには開発環境が付属していないため、WindowsでWebプログラミングを行うには、開発環境のインストールが必要です。そこで、Webプログラミングの開発環境としてデファクト・スタンダードなポジションを確立している “XAMPP for Windows” をインストールします。

Macには標準で、Apache、PHP、MySQLといった開発環境が最初からインストールされていますが、もう少し開発を便利にするために “XAMPP for Mac” をインストールする事をお勧めします。

XAMPPとは

XAMPPとは、Webサーバーの “Apache” 、プログラミング言語の “PHP” 、データベースの “MySQL” 、MySQLのデータをWebインターフェースで管理する “phpMyAdmin” といった開発環境をまとめ、運用しやすくしたパッケージです。

XAMPPのダウンロード

XAMPPは、以下のURLからダウンロードできます。

https://www.apachefriends.org/jp/index.html

XAMPPのダウンロード
XAMPPのダウンロード

ダウンロードは自動的に始まります。

おことわり

この記事ではMacでのインストール手順で説明します。一般的に、パソコンといえばWindowsだと思います。しかし、Web系の開発では圧倒的にMacが利用されています。これは開発言語を問わない傾向です。デバイスとしての見た目の美しさや操作性の良さもありますが、MacのOSはBSD系のUNIXという点が一番大きいでしょう。インターネットで広く使われている技術のほぼ全てが、デフォルトでインストールされています。

昨今のマイクロソフトは積極的にオープンソースに取り組んでおり、Windowsにも積極的にUNIX由来の技術がインストールされようとしています。ですから今後、この状況は変わるかもしれませんが、少なくとも2019年現在では、Macがベストと言えます。

XAMPPのインストール

ディスクイメージファイルがダウンロードされるので、クリックして起動して下さい。

 

以下のようなウィンドウが開きます。

XAMPPのインストール
XAMPPのインストール

インストールは、“XAMPP” アイコンを “アプリケーション・フォルダ” にドラッグ&ドロップするだけです。

 

 

XAMPPを起動する
XAMPPを起動する

“アプリケーション・フォルダ” を開くと、 “XAMPP” がインストールされているので、アイコンをクリックし起動します。

 

 

 

警告ダイアログ
警告ダイアログ

Macでは、インターネットからダウンロードしたアプリケーションを起動する際に、警告が表示されます。【開く】ボタンを押して問題ありません。

 

XAMPPからのお願い
XAMPPからのお願い

ダイアログが表示されます。これは、最初の起動時に管理者の権限でインストールを継続して下さいと書いてあります。

 

 

管理者の承認
管理者の承認

パスワードを入力して承認して下さい。

 

 

 

XAMPPの管理画面
XAMPPの管理画面

無事に起動できれば、管理画面が表示されます。

Statusが赤色になっています。

これは停止中を表しています。

【Start】ボタンを押すと、XAMPPが起動します。

 

 

XAMPPの管理画面
XAMPPの管理画面

Statusが緑色になっていれば、XAMPPの起動が成功しています。

このXAMPPの起動とは、Macの中で仮想マシンを起動させている状態です。

IP Address の 192.168.64.2 が、Macの内部で起動している仮想マシンのIPアドレスになります。

 

 

XAMPPの仮想マシンにアクセスする
XAMPPの仮想マシンにアクセスする

それではブラウザに、仮想マシンのIPアドレスを入力してアクセスしてみます。

 

 

XAMPPの仮想マシンにアクセスしたページ
XAMPPの仮想マシンにアクセスしたページ

XAMPPが動いている仮想マシンのWebサーバーにアクセスして、Webページが取得できました。

 

 

 

 

インストール作業は以上となります。

FAQ

以下のようなエラーが出る場合があるようです。

cannot calculate MAC address: dyld: Library not loaded: /System/Library/Frameworks/Hypervisor.framework/Versions/A/Hypervisor
Referenced from: /Users/phpbeginners/.bitnami/stackman/helpers/hyperkit
Reason: image not found

自分のホームディレクトリにある “.bitnami/stackman” を削除することで解決します。

“ターミナル ” という、UNIXの “シェル” という機能を使うアプリケーションがあり、このターミナルから以下のように打ち込みます。このコマンドは、自分のホームディレクトリにある “.bitnami/stackman” を削除する命令です。

“rm -rf ~/.bitnami/stackman”