まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

オフィスの中で無線 LAN を使っていると、たまにこんなことに遭遇します:
無線 LAN の調子が悪い!
繋がることは繋がるけど、反応が悪いし、すぐに切れちゃう!
全く繋がらないわけではないから自分の設定ミスではない。これは無線 LAN ステーション自体が不安定なのが原因だ! 管理者でてこーい!!

で、念のため隣の同僚に「お前もそうだよな?」と確認すると・・・ あれ、なんで大丈夫なの?
無線 LAN ステーションがおかしいわけではない? 何で自分だけ・・・??
wifi


こういった現象、もちろん原因が1つに絞られるわけではないのですが、考えられる可能性の1つとして「無線 LAN の(規格の)種類」があります。同じ無線 LAN ステーションに対しても異なるモードで接続した機器は異なる挙動になる可能性がある、ということです。

まず無線 LAN の種類を説明します。現在は 802.11a / 802.11b / 802.11g / 802.11n という4つの規格が存在しています。無線 LAN ステーションと無線 LAN 子機(PC とかスマホとか)やドライバが対応している無線 LAN 規格によってどのモードで接続することになるかが決まります。

これら4つの規格の違いは何でしょうか?使っている電波周波数や最大速度の違いもありますが、使い勝手を左右する違いとして「干渉の差」と「障害物の影響度合い」があります。

4つの規格を電波周波数帯で分けると、802.11a が 5GHz、802.11b と 802.11g が 2.4GHz です(802.11n は規格としては両方に対応しています)。周波数が高いほど、電子レンジや Bluetooth といった他の電子機器が発する電波ノイズの影響を受けにくくなります。例えば Bluetooth のマウスを接続した機器が近くにあるとか、そもそも自分自身が Bluetooth マウスを使っている、といった環境だとすると、無線 LAN を 802.11a で使っているとそれらの影響はあまり受けないけど、802.11b や 802.11g だと電波干渉を受けやすい(つまり無線も繋がりにくくなるし、マウスの方にも影響がでやすい)と言えます。

一方、周波数が高いと壁などの物理的な障害物があった時に電波が弱くなってしまい、広い範囲では利用しにくくなります。その意味では 802.11a はステーションから自分までの間にある障害物の影響を受けやすいので限られた範囲での利用になってしまう一方、802.11b や 802.11g は比較的広い範囲で使える、と言えます。

なお 802.11n は、規格としては 802.11a/b/g 全てを網羅しているのですが、実際には機器によって一部機能のみ使えたり使えなかったりもします。

仮に全ての規格に対応した無線 LAN の親機/子機を持っているとして、さてどのモードで接続させるのがよいでしょうか? これは何を優先するのか、という順位によっても答が変わってきます。でも壁の少ない、狭いオフィス内で使うことを前提とするのであれば、電波干渉の受けにくい 802.11a がいいのかな、と思っています。


話を戻します。

上記で書いたような現象が起こる原因の1つとして考えられるのは以下です:
・この人は 802.11b/g で無線 LAN に接続した結果、電波干渉の影響を受けて不安定になっている
・周りの同僚は 802.11a で無線 LAN に接続した結果、電波干渉をほとんど受けずに快適に使えている

一例として、日本で発売された iPhone の各バージョンがどの無線 LAN 規格に対応しているか、を特徴と併せて表にしてみました:
規格利用周波数帯電波干渉障害物の影響最大速度iPhoneの対応バージョン
802.11a5GHz受けにくい受けやすい54Mbps5 / 5c / 5s
802.11b2.4GHz受けやすい受けにくい11Mbps3G / 3GS/ 4 / 4s / 5 / 5c / 5s
802.11g2.4GHz受けやすい受けにくい54Mbps3G / 3GS/ 4 / 4s / 5 / 5c / 5s
802.11n(規格上は 802.11a/b/g を網羅)300Mbps4 / 4s / 5 / 5c / 5s

例えばですが、上記の人は iPhone 4s を使っていて、同僚が iPhone 5 以降を使っていた場合、自分は 802.11g に接続して干渉を受け、同僚は 802.11a に接続して快適、ということが起こり得るわけです。

余談ですが 802.11n についても補足しておくと、iPhone 4/4s は規格としては 802.11n に対応しています。でも干渉を受けにくい 5GHz 帯の電波を使って接続できるかというとできません。iPhone 4/4s の無線 LAN は利用周波数帯に関しては 2.4GHz での接続しかできない、ということです。この辺りがちょっとややこしいというかわかりにくい所です。

これはもちろん iPhone だけの問題ではなく、アンドロイドスマホやノート PC でも言えることです。使っている無線 LAN がどの規格に対応しているのか、無線 LAN 親機はどのモードでの接続に対応しているのか、それらによって隣の人と比べた際の無線 LAN の挙動も変わってくる、ということが起こり得るわけです。


iPhone に限った話をすると、4s 以前のモデルは無線 LAN では干渉を受けやすい接続しかサポートされてません。ということは、例えば Bluetooth キーボードと無線 LAN を同時に使おうとすると、それだけで干渉しまくる環境ができあがってしまうわけで、まあちょっと嫌だなあ、、、と。 その意味では今 4s 以前を使っていて無線 LAN に不満がある人はこの点だけでも 5 以降に変えるメリットはあるかもしれないですねー








 

WordPress.com でも使われていて、Apache HTTPD, IIS に次ぐシェアを持つ HTTPD サーバー、それが Nginx(「エンジンエックス」)です。リバースプロキシとしての機能も併せ持ち、並行処理性能と省メモリ性能を重視して開発が続けられているオープンソースサーバーです。

この Nginx を CentOS にインストールする手順を紹介します。

インストール方法はソースからビルドする方法もありますが、簡単なのは yum リポジトリを作ってダウンロード&インストールが楽だと思います。

というわけで、まずは yum リポジトリを作成します:
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

これで /etc/yum.repos.d/nginx.repo が作成されて準備完了。あとは yum でインストールです:
# yum install nginx

インストール自体はこれだけです(ちなみにデフォルト状態でのドキュメントルートは /usr/share/nginx/html/ です)。 この段階で一度動作確認してみます。まずはサーバーを起動:
# /etc/init.d/nginx start

そしてウェブブラウザでサーバーにアクセスします。"Welcome to nginx" と表示されれば Nginx のインストールは成功しています:
2014021301


Nginx のインストールはこれだけでもできていますが、実際には PHP などと合わせたアプリケーションサーバーとして使いたいですよね。そのための追加設定も紹介しておきます。

Nginx で PHP を使うためのインターフェースにはいくつか選択肢がありますが、今回は PHP-FPM を使う方法を紹介します。まずは yum で php-fpm をインストールします:
# yum install php-fpm

PHP-FPM はデフォルトでは Apache HTTPD 用の設定になっています。これを nginx ユーザー/ nginx グループで動作するように設定ファイルを変更します:
# vi /etc/php-fpm.d/www.conf

  :
user = nginx   # user = apache から変更
  :
group = nginx   # group = apache から変更
  :

最後に nginx の設定を変更して、ドキュメントルート上で PHP(-FPM) が動作するようにします。記述箇所はファイルの下の方にはじめから記載されているのでコメントアウトしてドキュメントルートディレクトリを指定するのが簡単だと思います:
# vi /etc/nginx/conf.d/default.conf

  :
location ~ \.php$ {
#    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
    include        fastcgi_params;
}
  :

この後に php-fpm を起動してから、nginx を再起動します:
# /etc/init.d/php-fpm start
# /etc/init.d/nginx restart

動作確認用に、ドキュメントルートに PHP 情報を出力するスクリプトファイル(phpinfo.php)を用意します:
# echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/phpinfo.php

この状態でこのファイルにウェブブラウザからアクセスして、以下の様な PHP 情報が出力されれば成功です:
2014021302


これで Nginx を導入し、PHP 連携までが可能になりました!

 

CentOS 環境設定備忘録シリーズ(?)、今回は Apache HTTPD の巻。
CentOS の導入は済んでいるものとします。詳しい手順はこちらを参照。

Apache HTTPD の導入自体は簡単すぎるので、今回は SSL アクセスを有効にするところまでを紹介、オレオレ SSL だけど。

まずはターミナルを開いて、 Apache HTTPD をサクっとインストール:
# yum install httpd

これで完了、簡単すぎ。後は実行すれば HTTPD サーバーとして使えるけど、その前に SSL の設定も紹介します。


SSL(Secure Sockets Layer) 情報を暗号化して送受信するプロトコル。これを HTTP で使う場合のプロトコルが HTTPS です。個人情報やクレジットカード情報を送受信する場合、その中身を暗号化して途中経路で読めなくする場合などに使います。利用者のレベルでは HTTP や HTTPS の違いをほとんど意識することはありません。

一方、サーバー側には SSL の鍵や証明書を使うことでこの暗号化を実現します。単にサーバーそのものを SSL 対応することに加え、この鍵や証明書を用意しておく必要があります。商用サイトであれば専門の機関から有償で発行してもらうもののですが、検証目的であれば OpenSSL を使って自分で(無償で)用意することもできます。

余談ですが、自分で用意した場合は自分の作った証明書で自分を信じこませて認証する、という意味で「オレオレ SSL」とか「オレオレ証明書」とか言われます。いずれこれらも「母さん、助けてSSL」とかって呼ばれるようになるんでしょうかね(笑)。

で、その自分で SSL を有効にするまでの手順も紹介します。まずは OpenSSL と、Apache HTTPD に SSL 機能を付けるための mod_ssl モジュールを導入します(既に導入済みかもしれません、その場合は気にせず先に進んでください):
# yum install openssl
# yum install mod_ssl

まずはオレオレ証明書を作ります。その前提として秘密鍵と公開鍵のペアが必要なので、順序としては (1)秘密鍵を作って、(2)公開鍵を作って、(3)証明書を作る という流れになります。この順に説明します。なお以下ではこれらのファイルを /etc/httpd/conf/ 以下に作成する前提で進めますが、別ディレクトリでも構いません。その場合は適宜読み替えてください。

最初に /etc/httpd/conf に移って、(1)秘密鍵を server.key というファイル名で作成します:
# cd /etc/httpd/conf
# openssl genrsa -aes128 1024 > server.key

Generating RSA private key, 1024 bit long modulus
..................++++++
..........................................++++++
e is 65537 (0x10001)
Enter pass phrase:(パスフレーズ)
Verifying - Enter pass phrase:(同じパスフレーズ)

この例では 128 ビットの AES 方式で暗号化した 1024 ビットの秘密鍵を作っています。途中でパスフレーズ(パスワード)を聞かれるので適当なパスワードを指定し、直後に確認のため同じパスワードを入力します。これで秘密鍵が完成です。

次にこの秘密鍵ファイルとペアになる (2)公開鍵ファイルを server.csr というファイル名で作成します:
# openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Chiba
Locality Name (eg, city) []:Funabashi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:空白
Organizational Unit Name (eg, section) []:空白
Common Name (eg, YOUR name) []:192.168.XXX.XXX
Email Address []:空白

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:空白
An optional company name []:空白

2文字の国識別コードには JP を指定、都道府県、市区町村を指定、それ以外は Common Name 欄以外は空白のままで大丈夫です。
注意点として、Common Name には実際に HTTPS として運用する際にブラウザから指定するアドレスを入力することになります。 https://www.xxx.com/ といったサーバー名でアクセスするのであれば xxx.com を、https://192.168.XXX.XXX/ といった IP アドレスでアクセスするのであれば IP アドレスを指定してください。

最後にこの秘密鍵と公開鍵を使って (3)証明書ファイルを server.crt というファイル名で作成します:
# openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt
Signature ok
subject=/C=JP/ST=Chiba/L=Funabashi/O=Default Company Ltd/CN=192.168.XXX.XXX
Getting Private key
Enter pass phrase for server.key:(上記で指定したパスフレーズ)


この場合では X.509 形式の証明書ファイルを、有効期間36500日(約100年)の指定で作成しています。これだけ指定しておけば自分の開発期間中はまあ大丈夫でしょうw。


これでデジタル証明書の作成までできましたが、このまま使うと Apache HTTPD の起動時にパスフレーズの入力を求められることになります。開発期間中はそれでもいいのかもしれませんが、実際の運用はサーバーの起動と同時に HTTPD サーバーも起動させたりするので、ここまでの作業が完了していればパスフレーズは不要と言えます。パスフレーズは以下のコマンドで解除することができるので、一応紹介しておきます:
# mv server.key server.key.bak
# openssl rsa -in server.key.bak > server.key
Enter pass phrase for server.key.back:パスフレーズ
writing RSA key

デジタル鍵/証明書が用意できたので、実際にこれを使って HTTPS を構築します。mod_ssl をインストールしたタイミングで /etc/httpd/conf.d/ssl.conf が作られているはずなので、このファイルを編集して今作成したこれらのファイルを指定します:
# vi /etc/httpd/conf.d/ssl.conf

  :
<VirtualHost _default_:443>
  ErrorLog logs/ssl_error_log
  TransferLog logs/ssl_access_log
  LogLevel warn
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile /etc/httpd/conf/server.crt
  SSLCertificateKeyFile /etc/httpd/conf/server.key
  <Files ~ "\.(cgi|shtml|phtml|php3?)$">
    :
  </Files>
</VirtualHost>

これで準備は整いました。では HTTP(S) サーバーを起動します:
# /etc/init.d/httpd start

起動後、ウェブブラウザを使ってこのサーバーにアクセスしてみます。まずは普通に http://XXX.XXX.XXX.XXX でアクセス。特に何もしていなければ Apache HTTPD のデフォルトページが表示されるはずです:
2014020801


次に同じアドレスに対して https://XXX.XXX.XXX.XXX でアクセスを試みます。SSL でのアクセスになります。証明書がオレオレなので、「信頼できないよ(第三者が保証するものではないよ)」と警告されます。
2014020802


ブラウザによってこの後の承認方法が異なりますが、Chrome であれば「このまま続行」ボタン、FireFox であれば「危険性を理解した上で接続するには」 - 「例外を追加」 - 「セキュリティ例外を承認」 を順に選択することで先に進むことができて、本来のトップページが HTTPS プロトコルで見ることができます。
2014020803












このページのトップヘ