follow us in feedly

開発

MySQLのSETで単位指定したらエラーになるって知った

MySQLでバイナリログの最大サイズ設定を変更することがありました。
そのときに知ったSETでの設定方法について、備忘のためにも紹介します。

SETでの設定に単位を使用したらエラーになった

MySQLを再起動せずにmax_binlog_sizeを変更したかったので、SETを使って設定しようとしたらエラーになってしまいました。
エラーの原因は設定値に単位を使っていたからでした。

mysql> SET GLOBAL max_binlog_size = 512M;
ERROR 1232 (42000): Incorrect argument type to variable 'max_binlog_size'

なので、下記のように数値のみにしたところ問題なく実行されました。

mysql> SET GLOBAL max_binlog_size = 536870912;
Query OK, 0 rows affected (0.00 sec)

SETでは単位指定は使用できない

はじめはMySQLのバージョンが古いからかと思いましたが、SETでは単位(サフィックス)は使用できないとのこと。
下記、MySQL 5.6のマニュアルより引用します。

値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に SET で値を設定するためには使用できません。一方、SET を使用すると、式を使用して変数の値を割り当てることができますが、サーバーの起動時に変数を設定するときには使用できません。たとえば、サーバーの起動時に次の 1 行目は有効ですが 2 行目は無効です。

shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024

逆に、実行時に次の 2 行目は有効ですが 1 行目は無効です。

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

まとめ

MySQLでSETを使った設定における値の指定方法についてご紹介しました。
SETを使う場合は、単位指定が不可であることを初めて知りました。

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.5 システム変数の使用

Let’s EncryptをNginxに設定して常時SSL化する

本ブログの常時SSL化対応が完了しました。
約3年ぶりにブログ再開したことと、Let’s Encryptを試す機会になるということで
ずっと温めていたタスクの実行に踏み切ることができました。
Nginxの設定にはほぼ触れず、Let’s Encryptに関わる内容のみですが紹介していきます。

環境

  • CentOS 6.9
  • Nginx 1.12.2
  • Certbot 0.19.0

Certbotのダウンロード & 実行

クライアントソフトウェアのCertbotをダウンロードして実行し、証明書を取得します。

$ cd /usr/local/bin
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x certbot-auto
$ sudo ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

エラーが発生

下記のエラーが発生しました。

certbot-auto: line 864: virtualenv: コマンドが見つかりません

対策

Python 2.7が必要なのでインストールして、その環境下でCertbotを実行します。

$ sudo yum install centos-release-scl
$ sudo yum install python27 python27-python-tools
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

別のエラーが発生

新たに下記のエラーが発生しました。

...
IMPORTANT NOTES:
 - The following errors were reported by the server:

Domain: blog.77dogs.net
   Type:   unauthorized
   Detail: Invalid response from
   http://54.92.40.15/.well-known/acme-challenge/fCmuZYV6nsMPOb_nAvTkH45be_DFHLxvvLuyXUCPrSg:
   "<html>
   <head><title>403 Forbidden</title></head>
   <body bgcolor="
white">
   <center>

<h1>403 Forbidden</h1>

</center>

<hr>

<center>"


To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
...

対策

/.well-known以下にアクセスできないので、本ブログのNginx設定ファイルに追記します。

<br />
location ^~ /.well-known/ {
  log_not_found off;
  access_log    off;
  autoindex     off;
  try_files     $uri $uri/ =404;
}

Nginxを再起動して、Certbotを再実行します。
これで証明書の取得は完了です。

$ sudo service nginx restart
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

Nginxの設定

証明書が取得できたので、NginxにSSL設定をします。
Qualys SSL Labsの評価をA+にする設定をしてみました。
詳しい設定方法は書かないので参考サイトを参照してください。

自動更新設定

最後に、自動更新するようにcronの設定をします。
毎週日曜の23時に起動するように設定しました。
更新がなければ特に何もおこなわれません。

0 23 * * 0 /usr/bin/scl enable python27 "/usr/local/bin/certbot-auto renew -q --post-hook '/sbin/service nginx reload'"

まとめ

Let’s Encryptの証明書による常時SSL化の手順をご紹介しました。
証明書関連はほとんどCertbotがやってくれるので割りと簡単にできたように思います。
Nginxの設定については他サイトに任せていますが、参考になれば幸いです。

参考

MSYS2のpacmanで発生するGPGME errorの対応

Windowsでコマンドラインやターミナル環境を整えるためにMSYS2をインストールしました。
最近はWindowsで開発する機会もあったので作業環境を慣れた形にしたかったからです。
今回はMSYS2のパッケージ管理システムであるpacmanの初期設定に苦しむことに。
そのエラーと対応した内容をご紹介します。

環境

  • Windows 7
  • MSYS2 (mintty 2.8.1)
  • pacman 5.0.1

MSYS2のインストール

MSYS2のインストールはインストーラを実行して進めるだけなので簡単です。
詳しいインストール手順は、参考サイトを参照してください。

proxyの設定

proxy環境下で利用するので、C:/msys64/etc/profile.d/proxy.shを設定します。


export http_proxy=proxyserver.domain:port
export HTTP_PROXY=proxyserver.domain:port
export https_proxy=proxyserver.domain:port
export HTTPS_PROXY=proxyserver.domain:port
export no_proxy="localhost,127.0.0.1"
export NO_PROXY="localhost,127.0.0.1"

C:/msys64/etc/pacman.confを設定してcurlを使うようにします。


XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントを外す

pacmanの初期設定時にエラーが発生する

MSYS2のインストールが完了したら、pacmanの設定をします。
リポジトリの更新や既存パッケージのアップデートです。
ここで下記エラーが発生しました。

エラー内容


$ pacman -Sy
:: パッケージデータベースの同期中...
エラー: GPGME error: データがありません
エラー: mingw32 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: mingw64 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: msys の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: データベースの同期に失敗しました
エラー: 処理を始められませんでした (無効または破損したデータベース (PGP 鍵))

調べるために英語でも出力したので載せておきます。


$ pacman -Sy
:: Synchronizing package databases...
error: GPGME error: No data
error: failed to update mingw32 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update mingw64 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update msys (invalid or corrupted database (PGP signature))
error: failed to synchronize any databases
error: failed to init transaction (invalid or corrupted database (PGP signature))

解決方法がなかなか見つからない

上記エラーで調べるといろいろ情報は出てきます。
ただ、自分の場合は原因が違うようで、解決には至らずハマりました。
参考にした情報の一部を載せておきます。 (内容が同じようなものもあると思います)

curlではなくwgetを利用したら解決した

解決できたのは、wgetを使う設定にしてみたことでした。
proxyの設定時に有効にしていたcurlがダメだったようです。
proxy環境の都合なのか理由はわからないままですが。

とりあえず、C:/msys64/etc/pacman.confを下記のようにして無事に動作しました。
なんとなく設定を変えてみたら、あっさり解決することもありますよね。


#XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントアウトする
XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u # コメントを外す

まとめ

MSYS2のパッケージ管理システムであるpacmanのエラーと対応方法をご紹介しました。
pacmanがダウンロード時に利用するコマンドをcurlではなくwgetにすることで解決しました。
調べるといろいろな解決手段があるようなので、そのひとつとして参考なれば幸いです。

おまけ

MSYS2をちょっと快適に使えるかもしれない設定をします。
下記設定でシンボリックリンクの作成とWindowsの環境変数Pathの引き継ぎができるようになります。

C:/msys64/msys2.iniを編集します。


MSYS=winsymlinks:nativestrict # コメント外す シンボリックリンクの作成
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|&lt;process-id&gt;
#CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit # コメント外す 環境変数引き継ぎ
MSYSTEM=MSYS

参考

Windows7のget-pip.pyで発生したエラーに対処する

前回記事にあるとおり、Windows上でPythonを使うことになりました。
ついでにPythonのパッケージ管理システムであるpipをインストールすることにしたのですが
ちょっとしたエラーが発生してすんなりとはいかなかったので対応方法をご紹介します。

環境

  • Windows 7
  • Python 3.6.3

get-pip.pyがエラーで動かない

ドキュメントに従ってインストールを試みるも下記エラーが発生。

エラー内容


Traceback (most recent call last):
  File "get-pip.py", line 20061, in &lt;module&gt;
    main()
  File "get-pip.py", line 194, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\__init__.py", line 26, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\utils\__init__.py", line 23, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\locations.py", line 88, in &lt;module&gt;
  File "ntpath.py", line 75, in join
TypeError: expected str, bytes or os.PathLike object, not NoneType

対応方法

C:\python\python36._pthを編集します。
下記のようにコメントをはずして、siteモジュールをインポートするように設定します。
該当設定の直上コメントにも、”Uncomment”と書いてありますね。


python36.zip
.

# Uncomment to run site.main() automatically
import site # ←コメントをはずす

再実行

再度実行します。無事にインストールが完了しました。
プロキシ環境下での実行なのでオプションを付けています。


$ python get-pip.py --proxy="[user:passwd@]proxy.server:port"
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading setuptools-36.5.0-py2.py3-none-any.whl (478kB)
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-36.5.0 wheel-0.30.0

まとめ

pipのインストール時に発生したエラーの対応方法をご紹介しました。
「import site」のコメントをはずすことで解消されます。
proxyオプションとあわせて参考なれば幸いです。

参考

pip — pip 9.0.1 documentation
python 3.6 embed cannot get pip · Issue #7 · pypa/get-pip

MySQLで一般クエリログを取得する方法

MySQLで一般クエリログを出力する方法のメモ。
一般クエリログはMySQLへの接続や切断、SQLなどを記録します。
設定方法は、オプションをつけて起動する方法とシステム変数で設定する方法があります。

Railsなどのフレームワークではログを取れますが、
フレームワークは使わないとかMySQLでログを取りたいとかあるかもしれない。

MySQLの起動スクリプトにログのオプションを設定する

/etc/rc.d/init.d/mysqldを編集します。
起動時に –log というオプションを使用するようにします。
クエリログの出力先を指定することもできます。
MySQLを再起動するとクエリログが有効になります。

$exec --datadir="$datadir" --socket="$socketfile"
      --log=/var/log/mysql/mysql.log --pid-file="$mypidfile"
      --basedir=/usr --user=mysql >/dev/null 2>&1 &

グローバルシステム変数でクエリログを設定する

MySQLサーバに接続して、下記を実行すればクエリログが有効になります。
この方法であれば、MySQLを再起動する必要はないです。
MySQL 5.1.12以降でしかできません。

mysql> use mysql;
mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/log/mysql/mysql.log';

general_logでクエリログの有効化/無効化を指定します。
general_log_fileでクエリログの出力先を指定します。

以上です。

MySQLのrootパスワードを再設定する方法

MySQLのrootパスワードを忘れてしまって再設定しました。
以前にも同じことをしてるので、次から調べずにすむようにメモしておく。
MySQLのバージョンは5.1です。

MySQLを停止する。

# /etc/init.d/mysqld stop

/etc/my.cnfに「skip-grant-tables」を追加する。

[mysqld]

skip-grant-tables

MySQLを起動する。

# /etc/init.d/mysqld start

MySQLサーバに接続して、新しいrootパスワードを設定する。

# mysql -u root mysql
Enter password:

mysql> UPDATE user SET Password=PASSWORD('mynewpassword') WHERE User='root';
mysql> FLUSH PRIVILEGES;

MySQLを停止する。

# /etc/init.d/mysqld stop

/etc/my.cnfに記述した「skip-grant-tables」を削除して、MySQLを起動する。

# /etc/init.d/mysqld start

MySQLに接続できるか確認して完了。

# mysql -u root -p
Enter password:

パスワードを忘れるとめんどうですね。

rake db:createコマンドのデータベース作成時の動作について

前回の記事では下記の手順でデータベースを作成していました。
1. MySQLでユーザを作成
2. config/database.ymlに設定を記述
3. rake db:createコマンドを実行

ですが、ユーザを作成していなくてもrakeコマンドはデータベースを作成します。
ユーザが存在しない場合、rakeコマンドはデータベース作成時にユーザも作成するわけです。

ためしにやってみます。
前回の「MySQLユーザの作成」をとばして、config/database.ymlに設定を追加します。

development:
  …
  username: testuser
  password: testpass
  …
test:
  …
  username: testuser
  password: testpass
  …

rake db:createコマンドを実行すると、下記のようにMySQLのrootパスワードを聞いてきます。

$ rake db:create
Access denied for user 'testuser'@'localhost' (using password: YES).
Please provide the root password for your mysql installation
>

MySQLのrootパスワードを入力するとデータベースが作成されます。
このときにユーザを作成して、データベースへの権限も付けています。

データベース作成時のクエリを出してみました。
WITH GRANT OPTIONは他のユーザに自分と同じ権限を与えられるみたいです。
ここでは、rails_app_development のすべての権限かな。

CREATE DATABASE `rails_app_development` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
GRANT ALL PRIVILEGES ON rails_app_development.* TO 'testuser'@'localhost' IDENTIFIED BY 'testpass' WITH GRANT OPTION

ただし、MySQLのユーザが存在していてもrootパスワードを聞かれることがあります。
config/database.ymlに記述したパスワードが間違っている場合です。
この場合もrootパスワードを入力するとデータベースが作成されますが、このときにMySQLのユーザのパスワードが間違ったものに書き換わってしまうので注意してください。

意図せずrootパスワードを聞かれた場合は、中断(Ctrl-C)して設定を確認したほうがよさそうです。

Rails 3.2とMySQLでアプリケーションを作成する

前回の記事(1ヶ月以上も前…)で Rails 3.2 の開発環境を構築しました。
ここから、少しずつでもいいのでアプリケーションを作っていきたいですね。
とりあえず、Rails と MySQL でアプリケーションの基礎構築までやってみました。
途中までは前回と同じような内容です。

サーバ環境や Rails 環境の構築は下記あたりを参考にしてください。
さくらVPS に nginx + WordPress の環境を構築する(1) – SSH の設定 | 77 Dogs Blog
さくらVPSに Rails 3.2 の開発環境を構築する | 77 Dogs Blog

Rails アプリを作成する

Rails アプリを作成して、アプリのディレクトリに移動します。
MySQLを使うためのオプションをつけて作成します
–skip-bundle オプションをつけると「bundle install」が実行されなくなります。

$ rails new rails_app -d mysql --skip-bundle
$ cd rails_app

作成されたディレクトリに移動して、Gemfile に下記を追加します。
下記を追加しないと Rails コンソールの起動やデータベース作成時に Javascript ランタイムエラーが出ます。

gem 'execjs'
gem 'therubyracer'

bundle install を実行して gem をインストールします。
-–path オプションでインストール先を指定できます。パスの指定は初回だけで大丈夫です。

$ bundle install --path vender/bundle

MySQL ユーザを作成する

MySQL のユーザを作成し、データベースを操作するための権限を設定します。

$ mysql -u root -p
Enter password:

mysql> CREATE USER 'testuser'@'localhot' IDENTIFIED BY 'testpass';
mysql> GRANT ALL ON rails_app_development.* TO 'testuser'@'localhost';
mysql> GRANT ALL ON rails_app_test.* TO 'testuser'@'localhost';

データベースを作成する

アプリで使用するデータベースを作成します。
まずは、config/database.yml に下記を追加します。

development:
  …
  username: testuser
  password: testpass
  …
test:
  …
  username: testuser
  password: testpass
  …

下記コマンドを実行して、データベースを作成します。
config/database.yml に定義した development と test のデータベースが作成されます。

$ rake db:create

以上で、Rails と MySQL を使ったアプリケーションが作成できました。

補足1: production のデータベースを作成する

production のデータベースを作成する場合は、config/database.yml の production: 以下を編集します。

production:
  …
  username: testuser
  password: testpass
  …

RAILS_ENV=production オプションをつけて、コマンドを実行します。
production のデータベースのみ作成されます。

$ rake db:create RAILS_ENV=production

また、 下記コマンドを実行すると config/database.yml で設定したデータベースがすべて作成されます。

$ rake db:create:all

補足2: データベースを削除する

データベースを削除するには、下記コマンドを実行します。
オプションや all の意味は、rake db:create と同じです。

$ rake db:drop
$ rake db:drop RAILS_ENV=production
$ rake db:drop:all

さくらVPSにRails 3.2の開発環境を構築する

さくらVPSに Rails 3.2 の開発環境を構築しました。
Ruby のバージョン管理に rbenv を利用して構築します。
ちょこちょことエラーがでて、思ったより時間がかかりました。
Ruby のバージョンは 1.9.3 です。

rbenv をインストールする

Ruby のバージョン管理ツールとして rbenv をインストールします。
下記を参考に複数のユーザアカウントで利用できるように設定します。
shared install of rbenv

まずは、rbenv 用にグループを作成してユーザを所属させます。

# groupadd (グループ名)
# usermod -G (グループ名) (ユーザ名)

rbenv と ruby-build をインストールします。

# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv
# chgrp -R (グループ名) rbenv
# chmod -R g+rwxXs rbenv
# mkdir /usr/local/rbenv/plugins
# cd /usr/local/rbenv/plugins
# git clone git://github.com/sstephenson/ruby-build.git
# chgrp -R (グループ名) ruby-build
# chmod -R g+rwxs ruby-build

インストールが完了したら、環境変数を設定します。
各ユーザごとに ~/.profile や ~/.bash_profile あたりに下記を追加します。
他にも設定方法があるようですが自分用なのでこれで。

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

Ruby をインストールする

rbenv を使って Ruby をインストールします。

$ rbenv install ← Ruby のバージョン一覧が出る
$ rbenv install 1.9.3-p194
$ rbenv rehash
$ rbenv global 1.9.3-p194

設定したユーザで Ruby のバージョンが確認できれば大丈夫です。

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

Rails をインストールする

gem を使って Rails をインストールします。
gem コマンドを実行するときに下記のエラーが出るので、まずは zlib-devel をインストールします。インストール済みなら問題ないです。

ERROR:  Loading command: install (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand

さらに、下記のエラーも発生するので openssl-devel もインストールします。
これも、インストール済みなら問題ないです。

/root/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- openssl (LoadError)

zlib-devel と openssl-devel をインストールします。

$ sudo yum install zlib-devel
$ sudo yum install openssl-devel

Rails をインストールします。
インストール時に “file ‘lib’ not found” とエラーが出るので下記のオプションを付けるか、先に rdoc をインストールすれば解決です。

$ gem install rails --no-ri --no-rdoc

Rails アプリを作成する

Rails アプリの作成をします。
ここでも、mysql-devel がないとエラーが出るのでインストールをします。

$ sudo yum install mysql-devel

Rails アプリを作成して、アプリのディレクトリに移動します。
MySQL を使うのでオプションをつけて作成します。

$ rails new rails_app -d mysql
$ cd rails_app

Bundler で gem をインストールします。
–path オプションでインストール先を指定できます。パスの指定は初回だけで大丈夫です。

$ bundle install --path vendor/bundle

Rails コンソールの起動などをしようとすると下記の Javascript のランタイムエラーが出ます。

Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

エラーが出た場合は、Gemfile に下記を追加して execjs と therubyracer をインストールします。

gem 'execjs'
gem 'therubyracer'

bundle コマンドを実行してインストールします。

$ bundle install

これで、Rails の開発環境が構築できました。