カテゴリー
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では待ち受けポート(リスニングポート)番号は重複できません。(当然!)

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

カテゴリー
Eclipse PHP プログラム

Eclipse で tab が space になる

Eclipseのデフォルト設定では、タブを入力すると自動的にスペースに変換されてしまいます。この設定を解除するのは、知らないと中々難しいのです。

検索エリアから「tab」を含む設定を探し、まさしくこれだろうと思いますが、これは違います。

検索エリアに「formatter」と入力して、PHP > Code Style > Formatter を選択し、下図の「show…」ボタンをクリックします。

下図の「Tab policy」を「Space」から「Tab」に変更します。

カテゴリー
NodeJS プログラム

NodeJS でプログラムが修正(更新)されたら自動的にリロードする

NodeJS のプログラム(スクリプト)で修正する度にプログラム(プロセス)を再起動(終了させて、また起動)するのは面倒くさいですよね?そういう場合は、nodemon を使いましょう!

-g はグローバルオプションです。
sudo npm install -g nodemon

使い方は簡単、node の代わりに、nodemon を使うだけです。

nodemon test.js

ファイルの修正を監視して、ファイルが修正されたら自動的にプログラムを終了して再起動します!

カテゴリー
NodeJS

FreeBSD で Puppeteer

FreeBSD で Puppeteer を使うと

UnhandledPromiseRejectionWarning: Error: Unsupported platform: freebsd

というエラーが出ます。なぜ FreeBSD がサポートされていないのか分かりませんが、Chromiumpkg からインストールすることで解決できます。

sudo pkg install chromium

Chrome がインストールされているパスは、Puppeteer に明示的に指定する必要があります。

(async () => {
const browser = await puppeteer.launch({
executablePath: '/usr/local/bin/chrome',
});

詳しくは Puppeteerissue に掲載されています。

https://github.com/puppeteer/puppeteer/issues/1049#issuecomment-381846813

カテゴリー
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 で詳細を確認できます。