IPv6 で IPv6 Ready なサーバの Nginx にアクセスしようとしたら 404 になったのと IPv6 のこれからの話し

IPv6 で自分のブログ(:80)にアクセスしたら 404 になってた件について

私のブログのリファラを辿ってどこからリンクされているのかなと興味があって見てみたのが発端。
なんかはてなブログから参照されているなーと思って私のブログへのリンクが貼られているのに加えてちょっと上に iframe の埋め込みと思われる Nginx の 404 画面が表示されていた。

はてなブログにほほえまーって思ってたらほほえましいのは私の方だった。
そして自分のブログへのリンクを踏んだら 404 になった。
リダイレクトされるはずだと思ってたが Nginx 404 になってる。
もしかして iframe で表示されてた 404 は私のサーバの Nginx が吐き出していたのである。

ここでの原因は Nginx 自身は IPv4 でしかリッスンしない設定になっていたことによるものである。

80 番ポートなんてリダイレクト専用のバーチャルホスト設定する以外に使わない。
こうでもしないと気付かなかったでしょう。

半年前ぐらいに、はてなブログから自分で持ってるこの WordPress ブログに移行してリダイレクトも設定したのだが
リダイレクトの設定したのははてなと WordPress の記事 URL の体系が異なっていたため。
旧来の記事参照アクセスはしばらくこのはてなブログの URL 体系でアクセスしてくるとかんがえられるため 301 リダイレクトをかましている。

IPv6 は最近のキャリア(ISP)はデフォルトでデュアルスタックでインターネット接続可能な IPv6 アドレスを払い出しているので、限界集落一歩手前の実家もご多分に漏れず IPv6 アドレスが払い出されていた。

さくらの VPS 上にサーバーを構築しているので IPv6 GUA(Global Unicast Address) はデフォルトで付与されていたので Route 53 に DNS レコードとして AAAA レコードも一緒に登録しておいたのでした。
IPv6 で遊んでみたいというのもあった。

Nginx のログを抜粋。ちなみに IPv6 のプレフィックスはドキュメント用のものに置換してあります。
IPv4 用の TEST-NET があったり、ドメイン名を example.com にするのと同様に IPv6 にも TEST-NET 相当のものがあります。

2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:12:59 +0900] "GET /entry/2014/11/09/232916 HTTP/1.1" 404 564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Geck
o) Chrome/63.0.3239.84 Safari/537.36" "-"


2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:24:34 +0900] "GET /entry/2014/11/09/232916 HTTP/1.1" 404 564 "http://example.com/entry/2015/08/02/022855" "Mozilla/5.0 (Macintosh; Intel Mac
 OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"


2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:29:54 +0900] "GET /entry/2014/11/09/20141109232916/ HTTP/1.1" 404 63388 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML
, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"

2001:db8::50:d7f8:c233:1 - - [01/Jan/2018:10:30:55 +0900] "GET /embed/2014/11/09/232916 HTTP/1.1" 404 63358 "http://example.com/entry/2015/08/02/022855" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "-"

IPv6 からのアクセスとなっている。
盛大に自分のブログが見れなくなってれば実家についてさて記事書くぞと思ったら気付くはずだったんですが、
SSL 版は default の設定が入っていたので影響を受けなかったのでした。

/embed/ アクセス oEmbed があったのでそのリダイレクトルールも追記しておいた。
こうゆう標準的な埋め込みプロトコルアクセスもあるのね。

Before

server {
    listen 80;

    # from hatenablog access (normal)
    rewrite ^/entry/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/ permanent;
    rewrite ^(.*)$ https://blog.pg1x.com$1 permanent;

}

server {
    listen 443 default ssl;

After

server {
    listen 80;
    listen [::]:80;

    # from hatenablog access (normal)
    rewrite ^/entry/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/ permanent;
    # from hatenablog access (oEmbed)
    rewrite ^/embed/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.+)$ https://blog.pg1x.com/$1/$2/$3/$1$2$3$4/embed permanent;
    rewrite ^(.*)$ https://blog.pg1x.com$1 permanent;

}

server {
    listen 443 default ssl;
    listen [::]:443 ssl;

重要なのは listen [::]:80, [::]:443 の記述です。

また、 1.3.4 以上の Nginx であれば ipv6only=on は不要です。

Option ipv6only=on might not be needed anymore and on the contrary potentially create issues.

http://nginx.org/en/CHANGES

Changes with nginx 1.3.4 31 Jul 2012

*) Change: the “ipv6only” parameter is now turned on by default for
listening IPv6 sockets.

[wnoguchi@mx1 ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
http://blog.pg1x.com/entry/2014/11/09/232916
http://blog.pg1x.com/entry/2014/08/12/175950-mac-mavericks-vagrant-omnibus-nokogiri-install-failure

リダイレクトも、 oEmbed もうまく表示されるのを確認したらこれで完了。

これからの IPv6 の話をしよう

これからは IPv6 だと 10 年以上前に言われてぜんぜん IPv4 グローバル IP アドレスがなくなる気配を見せず、当時は IPv6 は私の生きている間にメジャーとなるのだろうかと思っておりました。
どっかで 「 IPv4 は石油みたいなもんだからな 」というブコメを見てなるほどなと思いました。

こうして今に至るわけですが、最近になってじわりじわりと確実にグローバル IPv6 アドレスが浸透しているのを感じます。
Google は普通に IPv6 に対応してるし、 AWS EC2, VPC も IPv6 に対応し始めている。
NURO も INTERLINK も au光 も、UQ WiMAX 等のモバイルルータもデフォルトで IPv6 を払い出しています。
たぶんインターネット接続を電気水道ガスと同じ感覚で使っている人たちは IPv6 が広まってきていることには気付かないと思います。
まあ、気づかないうちに IPv6 が広まっていくのが理想だと思います。
こうしてインターネットはありふれたインフラとなっているわけですね。
IPv4 がレガシーな Layer 3 プロトコルになるのも近いなと思った次第です。

しかし先日のMITのクラスA IPアドレスを一部 Amazon に売却したのには驚いた。
クラスA グローバルIPアドレスなんて滅多なことではお目にかかれない。
具体的には 18.145.0.0/16 のネットワークを売ったのかな?
ゆうに 65536 個(ネットワークアドレスとブロードキャストアドレスを除けば 65534 個)の連続したアドレス空間。

  1. MIT No Longer Owns 18.0.0.0/8 – Slashdot
  2. Whois-RWS
  3. MIT no longer owns 18.0.0.0/8

Cookie が無効になっていて MediaWiki にログインできないって言われた件

結論

セッションディレクトリが書込みできませんでした。

エラーメッセージ

ログインのエラー 
example wikiではログインに Cookie を使用します。 Cookie を無効にしているようです。 Cookie を有効にしてから、もう一度試してください。

当方の環境

  • さくらのVPS
  • CentOS7.2.1511 x86_64
  • Nginx + php-fpm
  • PHP 5.4

調べたこと

  • ログにも大したこと書いてない。
  • Cookie は無効になってない。
  • シークレットモードでやってみたけど同じ。
  • Cookie 消してみたけど変わらない。
  • パスワード再発行しても同じ。
  • ブラウザ変えてみたけど同じ。

ぐぐって調べてみるとセッションのディレクトリが書き込みできませんでした、てへ♪的なスレッドが見つかった。

なるほどな。

phpinfo() 出力させてセッション格納ディレクトリを調べる。

session.save_path = /var/lib/php/session

ディレクトリのパーミッションを確認。

[root@mx1 mediawiki]# ls -l /var/lib/php/
合計 4
drwxrwx--- 2 root apache 4096  5月 12 22:49 session
[root@mx1 mediawiki]# ls -l /var/lib/php/session/
合計 64
-rw------- 1 nginx nginx 3436  3月 13 12:10 sess_29ih6fgffffffffff9ee024fa7
(snip)
-rw------- 1 nginx nginx   53  3月 19 07:57 sess_tpih6fgfffffork4bvffmff625

なんでグループが apache やねん!
そりゃ書き込めないはずだわ。
最近流行りに乗って Nginx 使ってるので Apache は使っていない。
ファイル自身は nginx 所有者で大丈夫っぽいな。
Ansible でメールサーバー構築する Playbook 開発してたからそれが原因かな。
念のため nginx と php-fpm の実行ユーザを確認する。

[root@mx1 mediawiki]# vim /etc/nginx/nginx.conf
[root@mx1 mediawiki]# vim /etc/php-fpm.d/www.conf
[root@mx1 mediawiki]# id nginx
uid=995(nginx) gid=993(nginx) groups=993(nginx)

対策実施

ディレクトリのグループを nginx に変更する。

[root@mx1 mediawiki]# chown root:nginx /var/lib/php/session
[root@mx1 mediawiki]# ls -l /var/lib/php/
合計 4
drwxrwx--- 2 root nginx 4096  5月 12 22:49 session

用が済んだら phpinfo のファイルは削除する。

[root@mx1 mediawiki]# rm -f phpinfo.php

これでちゃんとろぐいんできるようになりましたとさ。
めでたしめでたし。

参考リンク

  1. [RESOLVED] Cannot Login or Register. Enable Cookies on Project:Support desk
  2. Help:ログイン – MediaWiki

Nginx + php-fpm の CentOS 7.2.1511 をリブートしたら 502 Bad Gateway になった

更新が溜まっていたので yum -y update した。
カーネル系の更新があったのでリブートしたら 502 Bad Gateway となった。

2016-04-03_20h32_15

あまりにも初歩的なんだけど、ログを確認したら

2016/04/03 20:31:21 [crit] 1410#0: *1 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 203.0.113.12, server: pg1x.io, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "pg1x.io", referrer: "https://blog.pg1x.com/"

FastCGI 処理系の php-fpm と通信できていないっぽい。
つまり php-fpm のプロセスが立ち上がっていない。
なんつー初歩的。。。
自動起動設定して起動して解決。

systemctl start php-fpm
systemctl enable php-fpm

Nginx 経由で動く WordPress でパーマリンクをデフォルトから変更したら 404 になった

Nginx + php-fpm で構築した新規 WordPress ブログのパーマリンクをもっとわかりやすい URL にしたいなと思って年月日と英語タイトルにしてみたら見事に 404 になった。

Homebrew で GitHub API rate limit exceeded って言われた時


2016-04-03_19h58_29

2016-04-03_19h58_35

検索して出てきたのは以下。

nginxでwordpressのパーマリンクをデフォルト以外に対応する – Qiita

サンプルを元に設定を変えてみる。

server {
    listen       80;
    server_name  yourhost.com;
    root         /usr/share/nginx/wordpress;
    index        index.php

    charset utf-8;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress$fastcgi_script_name;
        include       fastcgi_params;
    }

    location @wordpress {
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress/index.php;
        include       fastcgi_params;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

これを参考に設定してみた。

真っ白なんだなー。。
エラーログ確認してみるとなんだか

2016/04/03 19:58:32 [error] 21562#0: *5481 "/var/www/wordpress/2016/03/27/homebrew-says-github-api-rate-limit-exceeded/index.php" is not found (2: No such file or directory), client: 203.0.113.12, server: pg1x.io, request: "GET /2016/03/27/homebrew-says-github-api-rate-limit-exceeded/ HTTP/1.1", host: "pg1x.io", referrer: "https://blog.pg1x.com/"

よくよく見直すと以下が足りていないので付け足した。
私の例はこんな感じ。

        include        fastcgi_params;
server {
    listen 443 default ssl;
    server_name pg1x.io;
    root /var/www/wordpress;
    index  index.php index.html index.htm;

    charset utf-8;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/blog.pg1x.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.pg1x.com/privkey.pem;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location ~ /wp-login\.php.* {
        include conf.d/access_list.conf;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress$fastcgi_script_name;
        include        fastcgi_params;
    }

    location @wordpress {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress/index.php;
        include        fastcgi_params;
    }

}

見れた!

2016-04-03_20h12_50

Amazon Linux(2013.09)にnginxとPHPをインストールする

一昨日あたりからnginxを始めました。

インストール

yum -y install nginx
yum -y install php-fpm
yum -y install php-mysql php-mbstring php-mcrypt

ドキュメントルートディレクトリを用意する

mkdir -p /var/www/html

/etc/nginx/nginx.conf

location / {
root   /var/www/html;
index  index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
include        fastcgi_params;
}

/etc/php-fpm.d/www.conf

listen = 127.0.0.1:9000
↓
listen = /var/run/php-fpm/php-fpm.sock
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0666
↓
listen.owner = nginx
listen.group = nginx
listen.mode = 0664
; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
↓
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

起動

service php-fpm start
service nginx start
chkconfig php-fpm on
chkconfig nginx on

動作確認

cat <<EOF >/var/www/html/index.php
<?php
phpinfo();
EOF

蛇足

ちなみに、Amazon Linuxのバージョン確認は

[root@ip-xxx-xxx-xxx-xxx html]# cat /etc/system-release
Amazon Linux AMI release 2013.09

参考文献