カメニッキ

カメとインコと釣りの人です

最近便利だと思ってよく使うコマンドとか

すぐ忘れるので備忘録

コマンドの実行結果を一時ファイルを作成せずにdiffる

[root@v8794 nginx]# diff -u nginx.conf <(sed 's/kame/hoge/g' nginx.conf)
--- nginx.conf    2016-01-17 18:04:41.000000000 +0900
+++ /dev/fd/63    2016-01-23 00:43:56.601767533 +0900
@@ -9,17 +9,17 @@
     keepalive_timeout   65;
     server {
         listen       80;
-        server_name  kame.photos;
+        server_name  hoge.photos;
         location / {
-            root   /var/www/kame;
+            root   /var/www/hoge;
             index  index.php;
         }

         location ~ \.php$ {
-            root /var/www/kame;
+            root /var/www/hoge;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index  index.php;
-            fastcgi_param  SCRIPT_FILENAME  /var/www/kame$fastcgi_script_name;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/hoge$fastcgi_script_name;
             include        fastcgi_params;
         }

@@ -31,19 +31,19 @@
         ssl_protocols TLSv1.2;
         #ssl_session_timeout  5m;

-        ssl_certificate      /etc/letsencrypt/live/kame.photos/fullchain.pem;
-        ssl_certificate_key  /etc/letsencrypt/live/kame.photos/privkey.pem;
+        ssl_certificate      /etc/letsencrypt/live/hoge.photos/fullchain.pem;
+        ssl_certificate_key  /etc/letsencrypt/live/hoge.photos/privkey.pem;

         location / {
-            root    /var/www/kame;
+            root    /var/www/hoge;
             index   index.php;
         }

    location ~ \.php$ {
-            root /var/www/kame;
+            root /var/www/hoge;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index  index.php;
-            fastcgi_param  SCRIPT_FILENAME  /var/www/kame$fastcgi_script_name;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/hoge$fastcgi_script_name;
             include        fastcgi_params;
        }

<( command ) の結果に /dev/fd/63 とファイルディスクリプタが割り当てられている

↑を応用して、find&replaceの確認

たとえば、あるディレクトリ以下のphpでおわるファイルの中身を wp -> KAME に変更する際に、想定のファイルが想定の部分だけ変更されるか、をチェックする。

[root@v8794 widgets]# for x in `find . -type f`; do diff -u $x <(sed 's/wp/KAME/g' $x); done
--- ./class-wp-widget-calendar.php  2015-09-27 10:07:25.000000000 +0900
+++ /dev/fd/63 2016-01-23 01:24:20.132003630 +0900
@@ -48,7 +48,7 @@
     * @param array $instance The settings for the particular instance of the widget.
     */
    public function widget( $args, $instance ) {
-       /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
+       /** This filter is documented in KAME-includes/widgets/class-KAME-widget-pages.php */
        $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

        echo $args['before_widget'];
@@ -94,7 +94,7 @@
     * @param array $instance Current settings.
     */
    public function form( $instance ) {
-       $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
+       $instance = KAME_parse_args( (array) $instance, array( 'title' => '' ) );
        $title = sanitize_text_field( $instance['title'] );
        ?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
--- ./class-wp-nav-menu-widget.php  2015-09-29 00:31:25.000000000 +0900
+++ /dev/fd/63 2016-01-23 01:24:20.134003626 +0900
@@ -39,12 +39,12 @@
     */
    public function widget( $args, $instance ) {
        // Get menu
-       $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;
+       $nav_menu = ! empty( $instance['nav_menu'] ) ? KAME_get_nav_menu_object( $instance['nav_menu'] ) : false;

        if ( !$nav_menu )
            return;

-       /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
+       /** This filter is documented in KAME-includes/widgets/class-KAME-widget-pages.php */
        $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

        echo $args['before_widget'];
@@ -64,7 +64,7 @@
         * @since 4.4.0 Added the `$instance` parameter.
         *
         * @param array    $nav_menu_args {
-        *     An array of arguments passed to wp_nav_menu() to retrieve a custom menu.
+        *     An array of arguments passed to KAME_nav_menu() to retrieve a custom menu.
         *
         *     @type callable|bool $fallback_cb Callback to fire if the menu doesn't exist. Default empty.
       *     @type mixed         $menu        Menu ID, slug, or name.
@@ -73,7 +73,7 @@
       * @param array    $args          Display arguments for the current widget.
       * @param array    $instance      Array of settings for the current widget.
       */
-     wp_nav_menu( apply_filters( 'widget_nav_menu_args', $nav_menu_args, $nav_menu, $args, $instance ) );
+     KAME_nav_menu( apply_filters( 'widget_nav_menu_args', $nav_menu_args, $nav_menu, $args, $instance ) );

      echo $args['after_widget'];

同じパターンのファイルを大量に生成する

cat << EOF > xxx.txtcat << EOF | command1 | command2 が、一時ファイルを用意せず色々やれてすき

[root@v8794 sample]# for x in `seq 1 100`; do cat << EOF | sed "s/_PLACEHOLDER_/for_${x}_replace/g" > work/${x}.txt
<html>
  <head>_PLACEHOLDER_</head>
  <body>
    _PLACEHOLDER_XXXXXXXXXXXXXXXXXXXXX
  </body>
</html>

EOF
; done

[root@v8794 sample]# ls -lt work/
合計 400
-rw-r--r-- 1 root root 109  123 01:02 2016 1.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 10.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 100.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 11.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 12.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 13.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 14.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 15.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 16.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 17.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 18.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 19.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 2.txt
-rw-r--r-- 1 root root 109  123 01:02 2016 20.txt

[root@v8794 sample]# cat work/1.txt
<html>
  <head>for_1_replace</head>
  <body>
    for_1_replaceXXXXXXXXXXXXXXXXXXXXX
  </body>
</html>

予め定められたリストにマッチした場合に、規定値を使用して処理する

#! /bin/sh

DATA="
01  AAAAAAAAAAAAAAAAA tanaka
02  BBBBBBBBBBBBBBBBB ikeda
03  CCCCCCCCCCCCCCCCC yamada
"

d=$(echo "${DATA}" | grep $1)

read no txt user <<< "${d}"

echo $no
echo $txt
echo $user

量が多くなるのであればDBなど使用するほうがよいが、小さなプログラムに便利。

read x y z <<< $val もすき。

カメノシャシン(http://kame.photos)をhttp2対応して、証明書自動更新のとこまでやった

URL

https://kame.photos/

情報

  • apache2.4 -> nginx1.9.9
  • php5.6 -> php7.0.2
  • http -> https(Let's Encryptでとってみた)

参考にしたURL

tapira.hatenablog.com

qiita.com

Let's Encrypt サーバー証明書の取得と自動更新設定メモ
blog.apar.jp

証明書取得

/usr/local/src/letsencrypt/letsencrypt-auto certonly --webroot -w /etc/nginx/html -d kame.photos -m yasuaki.tahira@gmail.com --agree-tos --debug

**ちなみに、以下のように作成される

証明書
/etc/letsencrypt/live/kame.photos/cert.pem

証明書+中間CA証明書
/etc/letsencrypt/live/kame.photos/fullchain.pem

秘密鍵
/etc/letsencrypt/live/kame.photos/privkey.pem

中間CA証明書
/etc/letsencrypt/live/kame.photos/chain.pem

nginx.confで使用するのは fullchain.pemprivkey.pem なので

        ssl_certificate      /etc/letsencrypt/live/kame.photos/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/kame.photos/privkey.pem;

のように設定する。

自動更新

00 05 01 * * /usr/local/src/letsencrypt/letsencrypt-auto certonly --webroot -w /hoge/fuga/nginx/html/kame -d kame.photos --renew-by-default --agree-tos && /etc/sbin/nginx -s reload

(追記)ちなみに、認証方法

ドメインのメールアドレスに対して、認証メールがくる従来の方法ではなく、以下の流れのようです

  1. -w で指定したドキュメントルートに対して、letsencryptクライアントが一時ファイルを生成
  2. 以下のように認証サーバから FQDN/.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX へアクセスし、所有者であることを確認
66.133.XXX.XXX - - [11/Jan/2016:18:34:31 +0900] "GET /.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1" 200 118 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

GoogleAnalyticsなんかと一緒なのかな

感想

簡単すぎてビビった

CentOS6.5 + nginx1.9.9 + http2 + php7.0.0でwordpress

以下の続き

tapira.hatenablog.com

tapira.hatenablog.com

さっそくやる

ヒストリーから追ったので、漏れてるかも

cd /usr/local/src/
git clone git://github.com:php-build/php-build.git
cd php-build
./install.sh
php-build --definitions  #7.0.0がある
# 依存パッケージをいれておく 怒られたらとりあえずXXX-develをyumるといういい加減なやつなので、プロダクション環境作るときは考える
yum install -y mysql-server libxml2-devel libjpeg-devel libpng-devel libmcrypt-devel libtidy-devel libxslt-devel
# build
php-build 7.0.0 /usr/local/php7.0
/usr/local/php7.0/bin/php -v
# mysqlの最低限設定
service mysqld start
/usr/bin/mysql_secure_installation
# php-fpm入れる
yum install php-fpm
# 最小限設定
vi /usr/local/php7.0/etc/php-fpm.conf
> daemonize = yes
> pid = run/php-fpm.pid

vi /usr/local/php7.0/etc/php-fpm.d/www.conf
> user = nginx
> group = nginx

# php-fpmの起動スクリプトを修正し、php7が使われるようにする
vi /etc/init.d/php-fpm
> php_fpm_BIN=/usr/local/php7.0/sbin/php-fpm
> php_fpm_CONF=/usr/local/php7.0/etc/php-fpm.conf
> php_fpm_PID=/usr/local/php7.0/var/run/php-fpm.pid

# php-fpm起動
/etc/init.d/php-fpm start

# nginx設定編集
# httpディレクティブ内に追加
      location ~ \.php$ {
          root /var/www;
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
          include        fastcgi_params;
      }

# mysqlにwp用db準備
mysql -uroot -p
CREATE DATABASE wp1 CHARACTER SET utf8;
GRANT ALL ON wp1.* to sampleuser@localhost;
SET PASSWORD FOR sampleuser@localhost=password('パスワード');
FLUSH PRIVILEGES;

# wordpress設置
cd /usr/local/src
wget https://ja.wordpress.org/wordpress-4.4-ja.zip
unzip wordpress-4.4-ja.zip
cp -r wordpres /var/www/wp

# wp-config.php作成
cd /var/www/wp
cp wp-config-sample.php wp-config.php
vi wp-config.php
define('DB_NAME', 'wp1');
define('DB_USER', 'sampleuser');
define('DB_PASSWORD', 'パスワード');
define('DB_HOST', '127.0.0.1');
define('DB_CHARSET', 'utf8');

ここまでできたらブラウザで

https://hogefuga.info/wp/wp-admin/install.php へアクセス。

書かれてるまま入力し、インストールすれば成功するはず。

サンプルページ https://fukutsu.info/kame/

nginx1.9.9にngx_mrubyを組み込む

以下の環境に組み込みました。

tapira.hatenablog.com

そもそも ngx_mruby とは?

ngx_mruby is A Fast and Memory-Efficient TCP Load Balancing and Web Server Extension Mechanism Using Scripting Language mruby for nginx.

github.com

とりあえずやりたいのは後者、nginxの制御にmrubyを使うところ。

手順

(1) ruby2.2.3を導入 - ruby-buildをつかいます。

cd /usr/local/src
git clone https://github.com/sstephenson/ruby-build.git
cd ruby-build
# 途中怒られるから入れとく
yum install -y readline-devel
./install.sh
ruby-build 2.2.3 /usr/local/ruby2.2
export PATH=/usr/local/ruby2.2/bin:$PATH
[root@v7885 nginx-1.9.9]# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

※ ちなみに、最初面倒くさくて yum install ruby で 1.8.xを入れたのですが、腐ってたのでやめました

(2) ngx_mruby導入 ref: Install · matsumoto-r/ngx_mruby Wiki · GitHub

$ cd /usr/local/src
$ git clone git://github.com/matsumoto-r/ngx_mruby.git
$ cd ngx_mruby
$ ./configure --with-ngx-src-root=/usr/local/src/nginx-1.9.9
$ make build_mruby
$ make generate_gems_config
$ cd /usr/local/src/nginx-1.9.9
$ ./configure --user=nginx --group=nginx --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --with-http_ssl_module --with-mail --with-http_stub_status_module  --with-http_v2_module --with-http_realip_module  --with-http_addition_module --without-http_userid_module --add-module=/usr/local/src/ngx_mruby --add-module=/usr/local/src/ngx_mruby/dependence/ngx_devel_kit
$ make
$ make install

(3) nginx.confにmrubyのコードを書いてみる

# Locationディレクティブ内に適当に
mruby_content_handler_code '
   Nginx::rputs "Hello world!"
';

(4) nginx reload & 確認

nginx -s reload

https://hogefuga.inf/へアクセスし、

f:id:tapira:20151213124452p:plain

と表示されれば、よさそう!