うえださんが通りますよ

MySQL/MariaDBのバックアップ

何度も調べてるのでめも

データベース内のすべてのテーブル

$ mysqldump -h host_name -u user_name -p database_name > dumpfile.sql

localhostなら-hオプションは多分いらない

テーブルを指定する場合

mysqldump -h host_name -u user_name -p database_name table1 table2 table3 > dumpfile.sql

圧縮もするなら

$ mysqldump -h host_name -u user_name -p database_name | bzip2 -c > dumpfile.sql.bz2
$ mysqldump -h host_name -u user_name -p database_name | gzip > dumpfile.sql.gz

文字化け時は文字コードの設定をためしてみる

mysqldump --default-character-set=utf8 -u user_name -p database_name > dump.sql

データベースの復元

$ mysql -h host_name -u user_name -p database_name < dumpfile.sql

Let's Encrypt + nginx + Ubuntu

めも。殴り書き。

Let’s Encrypt

https://letsencrypt.org/

環境

  • Ubuntu 16.04 LTS
  • nginx 1.10.0

一応確認

  • サーバーに対してドメインが振られDNSでの名前解決ができている
  • 80番ポートにアクセスできる

certbotの導入

$ cd /usr/local/bin
$ sudo git clone https://github.com/certbot/certbot
$ cd certbot
$ sudo ./certbot-auto certonly --standalone -t
  • 依存するライブラリを自動でインストールするか途中訊かれるので、yと入力。
  • メールアドレスの入力
  • (A)gree

あとはよくわからないこと聞かれる

Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.

とりあえずyにした

次に認証させたいドメインの入力

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel):example.com

cronでの自動更新設定

Let’s Encrypt の証明書の有効期限は3ヶ月のみなので、自動更新できるようにする

下記をnginxの設定ファイルに追記

server {
... 
    location /.well-known/acme-challenge/ { allow all; }
    location / { return 301 https://$host$request_uri; }
...

下記コマンドで証明書の更新ができるか確認

$ sudo ./certbot-auto renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.

認証鍵入れたての場合、上記のように更新はスキップされる(有効期限が一ヶ月未満だと更新されるよう)

この表示が確認できたら、cronに証明書を更新してnginxの設定を再読込する設定を書き込む

$ sudo crontab -e
# 毎月1日の午前3時に更新
0 3 1 * * /usr/local/bin/certbot/certbot-auto renew && /bin/systemctl reload nginx

nginxの設定

以下最低限

server {
    listen 443 ssl;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

nginx再起動

$ sudo service nginx restart

nginxでWordPress環境をつくった。気分的にMariaDBで。

Google大好きなうえだです。

Googleが最近AWSに対抗してGCPに力入れてるみたいなので、わざわざGCPで構築した。

300ドル分無料で使えるのでお試しあれ。

環境

Google Compute Engine 上の ubuntu 16.04 LTS

timezoneの変更

AWSにしろGCPにしろサーバーのタイムゾーンを忘れないように。

$ sudo dpkg-reconfigure tzdata

日本なら Asia -> Tokyo を選ぶ。

install nginx

$ sudo apt update
$ sudo apt install nginx

とりあえず設定はあとで。

install php

phpは7系。

$ sudo apt -y install php php-cgi php-cli php-mysql php-gd php-apcu php-fpm php-pear php-xmlrpc php-mbstring php-mcrypt

php-fpm

nginxではデフォでPHPを実行できないとかなんとかで、FastCGIのphp-fpmと繋いでPHPの実行環境を構築する

nginxがソケットを通じてphp-fpm.phpの実行を依頼する感じだと思ってる。ので、設定をする。

$ cd /etc/php/7.0/fpm/pool.d/
$ sudo cp www.conf www.conf.org
$ sudo vim www.conf

www.conf に以下の記述をする(コメントインするだけかも) 1

listen = /run/php/php7.0-fpm.sock
listen.mode = 0660 #limit access permission to socket

php-fpm の再起動忘れない。

$ sudo /etc/init.d/php7.0-fpm restart

nginxの設定

サンプル。

server {
   listen 80;
   server_name xxx.xxx.com; # domain
   access_log /var/log/access.log;
   error_log /var/log/error.log;

   location / {

        if (!-e $request_filename) {
            rewrite ^ /index.php last;
        }


        root /var/www/sample/public_html;
        index index.html index.htm index.php;

        location ~ .php$ {
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

一応だけど

  • マルチドメイン対応していなければserver_nameの記述はしなくていい。そのとき上記の設定は/etc/nginx/sites-enabled/defaultに直接書いていい。
  • マルチドメインの場合ドメインごとのserver{}の設定が必要。/etc/nginx/conf.d/内のファイルはすべてnginxに読み込まれるので、ここにドメイン毎にファイル作って設定書いたらいいと思う(というのは独断と偏見)。

nginx再起動

設定を変えたら再起動忘れない(リロードコマンドあったっけ)

$ sudo /etc/init.d/nginx restart

MariaDBインストール

mySQLを使いたくない気分だった。

sudo apt install mariadb-server

セキュリティは地味に大事に

$ sudo mysql_secure_installation

mySQLとの互換性を大事にしてるおかげでちょいちょいコマンドがややこしいけど、シェル上ではみんなmysqlコマンド系でMariaDBは動かせる。

まずrootのパスワードセットするよう求められるのでy押しとこう。

ちなみに、MariaDBインストール時は不思議な仕様で、root権限でmysql -u rootと打つとログインできる(つまりsudo mysql -u rootでも可)。 まぁrootさんはなんでもできるって考え方は割りかし自然ではある。

データベースとユーザ作成

WordPressに扱わせるデータベースとユーザを作成する。

ちなみに確かこれもMariaDBの仕様だった気がするけど、MariaDB上のrootのパスワード設定しても、実行元もroot権限じゃないとログインできない。つまりsudo mysqlしないと-u rootできない。

$ sudo mysql -u root -p
MariaDB [(none)]> create database wp_sample;
MariaDB [(none)]> create user 'username'@'localhost' identified by 'password';
MariaDB [(none)]> grant all on wp_sample.* to 'username'@'localhost' identified by 'password';

Wordpress インストール

wgetってなんだかんだつよいよな。

$ cd
$ mkdir tmp
$ cd tmp
$ wget https://wordpress.org/latest.tar.gz
$ tar xvzf latest.tar.gz
$ cd wordpress
$ sudo cp -r * /var/www/sample/html
$ cd /var/www/sample/html
$ sudo cp wp-config-sample.php wp-config.php
$ sudo vim wp-config.php

先程作成したユーザとデータベース情報をwp-config.phpに記載する。

phpmyadminのインストール

これは欲しい人だけ。Apacheだとスムーズに入れられるけど、nginxさんはそうもいかないので、一応補足。

$ sudo apt -y install phpmyadmin php-mbstring php-gettext

Configuring phpmyadminて画面が出るんだけれど、nginxは選択肢になくてapache2はある。仕方ないのでapache2を選んどく。

するとapache2のための自動設定するか的な質問が表示されるので、そっとNoを選ぶ。

MariaDBの設定

なんでだか下記の設定が必要。plugin=''''はダブルクオーテーションじゃなくてシングルクォーテーション2つなので気をつけよう(僕は間違えた人)。

$ sudo mysql -u root -p mysql
Enter password:
  ...
MariaDB [mysql]> update user set plugin='' where user='root'; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


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

nginxの追加設定。

phpmyadminにアクセスするための設定をnginxに追加する。

server {
    ...
    # setting for phpmyadmin
    location /phpmyadmin {
        root /usr/share;
        index index.php;


        # setting for phpmyadmin
        location ~ ^/phpmyadmin.+\.php$ {
            fastcgi_pass   unix:/run/php/php7.0-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    ...
}

これ調べてるときにlocationでドキュメントルート使い分けられることを知った。感動。

他の設定ファイルもlocationにドキュメントルートの設定記述してあるのはこうやってドキュメントルートをアクセスパス毎に変えたりすることがあるから。

あ、nginxの再起動忘れないで。

$ sudo service nginx restart

おわり

WordPressってなんだかんだつよい。


  1. もしphp-fpmのソケットの所有者的なの( user とか groupとか)変えたら、/etc/nginx/conf.dにかかれてるnginxの実行ユーザとグループも同じものに変えておくこと(デフォルトはwww-dataだったような。いじらなければ問題ないはず)