Hatena::ブログ(Diary)

モノヅクリブログ Twitter

2012-06-04 SSHフォワーディング

SSHフォワーディング

特定のIPホストからでしかSSHやsftp,ftpの許可をしていない。

そんな時に活躍するのがSSHフォワーディング。回線もセキュアになります。

$ ssh -L <ローカルポート番号>:<転送先ホスト>:<転送先ポート番号> <ユーザ名>@<リモートホスト>

例えば

$ ssh -L 2222:you_want_to_connect.com:22 yourname@ssh_host.com

としてsshに接続して127.0.0.1(localhost)の2222ポートに対してyou_want_to_connect.com:22に接続するように接続してやります。

はじめは分かりにくいですが分かれば簡単。いつでも一行書けばセキュアな回線で接続が可能になりますね。

2012-06-03 symfony1.4からmemcachedを使う方法 - 基本編

symfony1.4からmemcachedを使う方法 - 基本編


f:id:Kmusiclife:20120530010822p:image


symfonyでmemcachedを利用する方法を簡単にまとめました。

nginx + php5でmemcachedを利用するという方法です。

http://labs.unoh.net/2010/05/symfonydoctrine.html

に詳しくあるのですが更に詳細はこちらを参照ください。

nginx, php-fastcgiでphp5,symfony1.4を動かせていることを前提とします。

http://kmusiclife.hatenablog.com/entry/20111105/1320467309

http://kmusiclife.hatenablog.com/entry/20120509/1336538654

などを参考にしてください。

必要なモジュールなどをインストールします。

# apt-get install memcached
# apt-get install php5-memcache
# apt-get install php5-memcached
# /etc/init.d/php-fastcgi restart
# /etc/init.d/nginx restart

config/ProjectConfiguration.class.php


  public function configureDoctrine(Doctrine_Manager $manager)
  {
	$servers = array(
		array(
		'host' => '127.0.0.1',
		'port' => 11211,
		'persistent' => true),
	);
	$cacheDriver = new Doctrine_Cache_Memcache(array(
		'servers' => $servers,
		'compression' => false)
	);
    $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE_LIFESPAN, 60); // 結果キャッシュのデフォルトの存続秒数 sec
    $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE_LIFESPAN, 60); // クエリーキャッシュのデフォルトの存続秒数 sec

  }

Doctrineからの利用

$this->table_names = Doctrine_Core::getTable('table_name')
    ->createQuery('a')
    ->where('a.id =? ', $id)
    ->useResultCache(true)
    ->execute();

2012-05-30 Symfony2 Choice Fieldの使い方

Symfony2 Choice Fieldの使い方

f:id:Kmusiclife:20120530010822p:image

Symfony2を本格的に覚え始めました。フレームワークを覚えるのにまず行うのがフォーム項目それぞれの使い方です。Choice, Multiple Choice, Radiobox, File, text, textarea, date/datetimeなどの基本フォーム項目の表示方法、validationを覚えればフレームワークも3割は使えたも同然です。

今回はchoiceからまとめていきます。

Post Entity:

class Post
{
    /**
    * @var category $category
    * @ORM\Column(name="category", type="string", length="255")
    */
    private $category;
    public static function getCategories()
    {
	    return array('cat1'=>'カテゴリー1', 'cat2'=>'カテゴリー2');
    }
}

PostType:

use Bunble\Name\Entity\Post;
class PostType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('category', 'choice', array(
                    'choices'=>Post::getCategories(),
                    'empty_value' => 'Choose your gender'
                )
            );
    }
}

choicesの項目にPostクラスのgetCategoriesを投げてあげましょう。

empty_valueの設定は色々と問題もあったようで。

https://github.com/symfony/symfony/pull/1336


TemplateではgetCategories()の配列をどう取得するかがポイントになります。

Twigではvar[ ]として配列を取得します。ControllerからPostのクエリを投げています。


Template(Twig):

    {% for entity in entities %}
         {{ entity.getCategories[entity.category] }}
    {% endfor %}

ドキュメントにあるcallbackがなぜかうまく動作しませんでした。

validationでなぜか引っかかります。callbackの投げ方が悪かったのかもしれませんが。

http://symfony.com/doc/current/reference/forms/types/choice.html


Form Type一覧:

http://symfony.com/doc/current/reference/forms/types.html

Choice Field Type

http://symfony.com/doc/current/reference/forms/types/choice.html

Text Field Type

http://symfony.com/doc/current/reference/forms/types/text.html

Textarea Field Type

http://symfony.com/doc/current/reference/forms/types/textarea.html

Email Field Type

http://symfony.com/doc/current/reference/forms/types/email.html

URL Field Type

http://symfony.com/doc/current/reference/forms/types/url.html

Datetime Field Type

http://symfony.com/doc/current/reference/forms/types/datetime.html

Checkbox Field Type

http://symfony.com/doc/current/reference/forms/types/checkbox.html

File Field Type

http://symfony.com/doc/current/reference/forms/types/file.html

Radio Field Type

http://symfony.com/doc/current/reference/forms/types/radio.html

Hidden Field Type

http://symfony.com/doc/current/reference/forms/types/hidden.html

2012-05-10 macportでnginx/php5.4/phpmyadminを動かすまでザザーッと

macportでnginx/php5.4/phpmyadminを動かすまでザザーッと



f:id:Kmusiclife:20120511043658p:image


php5.4のインストール

$ sudo port install php54
$ sudo port install php54-cgi
$ sudo port install php54-mbstring
$ sudo port install php54-curl
$ sudo port install php54-mcrypt
$ sudo port install php54-mysql

うちで出たエラーは下記の通り。対処も同時に。

エラー対処:

$ sudo port install php54
Error: Target org.macports.activate returned: Image error: /opt/local/bin/captoinfo is being used by the active ncursesw port.  Please deactivate this port first, or use 'port -f activate ncurses' to force the activation.
$ sudo port -f uninstall ncursesw

エラー対処:

$ sudo port install php54
Log for perl5 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_perl5/perl5/main.log
$ sudo port installed perl
$ sudo port -f perl5 @5.8.9_0
$ sudo port -f perl5 @5.12.3_1+perl5_12
$ sudo port -f perl5.8 @5.8.9_3
$ sudo port -f perl5.12 @5.12.4_0

spawn-fcgi/nginxのインストール

$ sudo port install nginx
$ sudo port install spawn-fcgi

mysql5のインストール

$ sudo port install mysql5-server
$ sudo /opt/local/bin/mysql_install_db5

普通に起動するとエラーが出るので下記のように設定変更。

_mysqlの権限を与える必要があります。

$ sudo cd /opt/local/var/db/mysql5
$ sudo chown _mysql:_mysql mysql
$ sudo /opt/local/lib/mysql5/bin/mysqld_safe & # mysql5起動

mysql5の起動とパスワードの設定

$ sudo /opt/local/lib/mysql5/bin/mysqld_safe &
$ sudo /opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'

spawn-cgiを使ってphp-cgiの待ち構え設定

$ sudo vim /bin/php-fastcgi-start

ファイルphp-fastcgi-startの内容:

#! /bin/bash
/opt/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 3 -f /opt/local/bin/php-cgi54
$ sudo /bin/php-fastcgi-start

php.initの設定

$ sudo cd /opt/local/etc/php54
$ sudo cp php.ini-development php.ini
$ sudo vim /opt/local/etc/php54/php.ini
pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock
date.timezone = Asia/Tokyo

f:id:Kmusiclife:20120511143056g:image


nginxの設定

$ sudo cd /opt/local/etc/nginx
$ sudo mv nginx.conf.example nginx.conf
$ sudo mv fastcgi_params.example fastcgi_params
$ sudo mv scgi_params.example scgi_params
$ sudo mv mime.types.example mime.types
$ sudo mv uwsgi_params.example uwsgi_params
$ sudo vim /opt/local/etc/nginx/nginx.conf

ファイルnginx.confの内容:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}
http {
    include /opt/local/etc/nginx/mime.types;
    sendfile on;
    keepalive_timeout  65;
    #gzip  on;
    include /opt/local/etc/nginx/sites-enabled/*;
}
$ sudo mkdir /opt/local/etc/nginx/sites-enabled
$ sudo vim /opt/local/etc/nginx/sites-enabled/localhost

ファイルlocalhostの内容:

server {

    listen 80;
    server_name localhost;
    access_log /opt/local/var/log/nginx/localhost.log;
    error_log /opt/local/var/log/nginx/localhost.error.log;
    root /opt/local/var/www;
    index index.php;

    location /phpmyadmin {
        alias /opt/local/share/phpmyadmin;
        index index.php;
    }
    location ~ /phpmyadmin/.*\.php$ {
        include /opt/local/etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /opt/local/share/$uri;
    }
    location ~ ^/.+\.php(/.*)?$ {
        set $script $uri;
        set $path_info "";
        if ($uri ~ "^(.+\.php)(/.+)") {
          set $script $1;
          set $path_info $2;
        }
        fastcgi_pass 127.0.0.1:9000;
        include /opt/local/etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME $script;
        fastcgi_param SCRIPT_FILENAME /opt/local/var/www$script;
        fastcgi_param PATH_INFO $path_info;
    }

}

nginx起動

$ sudo /opt/local/sbin/nginx

f:id:Kmusiclife:20120511144245j:image


phpmyadminの準備

visit:

http://www.phpmyadmin.net/home_page/downloads.php

$ sudo cd /opt/local/share
$ sudo wget http://downloadhost/phpMyAdmin-3.5.1-all-languages.tar.gz

$ sudo tar zxvf phpMyAdmin-3.5.1-all-languages.tar.gz
$ sudo mv phpMyAdmin-3.5.1-all-languages phpmyadmin

$ sudo mv config.sample.inc.php config.inc.php
$ sudo vim config.inc.php

メモ:nginxやphp-cgi, mysqlの落とし方など

$ sudo nginx -s reload
$ sudo killall php-cgi54
$ sudo /opt/local/bin/mysqladmin5 -u root shutdown

2012-05-09 nginxの各アプリケーション設定(symfony1.4, phpmyadmin)

nginxの各アプリケーション設定(symfony1.4, phpmyadmin)


f:id:Kmusiclife:20120511143056g:image


phpmyadmin:

location /phpmyadmin {
     alias /usr/share/phpmyadmin/;
     index index.php;
 }
 location ~ ^/phpmyadmin/.+\.php$ {
     root /usr/share/phpmyadmin/;
     rewrite /phpmyadmin/(.*\.php?) /$1 break;
     include /etc/nginx/fastcgi_params;
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name;
 }

symfony1.4:

nginx0.9x

location / {
    if (-f $request_filename) {
        expires max;
        break;
    }
    if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
        rewrite ^(.*) /index.php last;
    }
}
location /sf/ {
    root /usr/share/php/data/symfony/web;
}
location ~ \.php($|/) {
    set $script $uri;
    set $path_info "";
    if ($uri ~ "^(.+\.php)(/.+)") {
      set $script $1;
      set $path_info $2;
    }
    fastcgi_pass 127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  /var/www/symfony1.4/web$script;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param SCRIPT_NAME $script;
}

nginx1.x

location /sf/ {
    root /usr/share/php/data/symfony/web;
}
location / {
    root   /var/www/symfony1.4/web/;
    index  index.php;
    if (-f $request_filename) {
        expires max;
        break;
    }
    if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
        rewrite ^(.*) /index.php last;
    }
}
location ~ \.php($|/) {
    set  $script     $uri;
    set  $path_info  "";
    if ($uri ~ "^(.+\.php)(/.+)") {
        set  $script     $1;
        set  $path_info  $2;
    }
    fastcgi_pass   127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_NAME $script;
    fastcgi_param SCRIPT_FILENAME /var/www/symfony1.4/web$script;
    fastcgi_param PATH_INFO $path_info;
}

参考:

http://d.hatena.ne.jp/Kmusiclife/20111105/1320467309

2012-05-01 石川県金沢・小松・加賀⇔関西国際空港の移動手段まとめ

石川県金沢・小松・加賀⇔関西国際空港の移動手段まとめ

【金沢在住の方必見】金沢市内→関西国際空港(KIX)への格安交通手段は? | 旅行ブログ 本当に行った場所だけを紹介する本音型旅行記 K-MUSICLIFE TRAVEL CHANNEL へ移動しました。

f:id:Kmusiclife:20120511142921j:image


国際線LCCがどれだけ増えて、価格が下がっても自宅のある石川県からは関西国際空港、または成田への移動がネックになります。小松空港という便利な空港はあるのですが、小松空港を使うのであればLCCを使う意味がありません。また、石川県内から成田を利用すると都内一泊必要になりコストも結局割高に。よって、金沢⇔関西国際空港の移動手段の検討が必要になるわけです。

というわけで調べましたが方法は3つ

1.特急サンダーバード+関空快速・特急はるか (8,690円〜10,550円/人) 所要時間4時間半
2.石川中央交通乗合空港ジャンボ、自宅まで送迎 (9,700円/人)  所要時間5時間半
3.高速バス+空港リムジンバス (5,800円/人) 所要時間約6〜7時間


1.特急サンダーバード関空快速・特急はるか(8,690円〜10,550円/人)


至って普通の関空へのルート。

金沢(サンダーバード)→京都・大阪・新大阪(関空快速)→関西国際空港
金沢(サンダーバード)→京都・大阪・新大阪(はるか)→関西国際空港

金額は8,690円〜10,550円になります。

おでかけネットなどで調べれば出てきます。

http://www.jr-odekake.net/

南海鉄道を使う方法もありますが、必ず一度の乗り換えがあり価格帯はおよそ8000円〜11,000円/人という感じです。

所要時間も短く利用しやすいです。

金沢発の最終:金沢19:43→関空23:36
関空発の最終:関空22:16→金沢02:46 (グリーン・寝台のみのきたぐにを利用)


2.石川中央交通乗合空港ジャンボ、自宅まで送迎 (9,700円/人)


石川中央交通乗合空港ジャンボを使う方法。時間を問わず自宅から自宅までの送迎で一人9700円/片道。

金沢市(一部を除く)、内灘、白山市能美市小松市(一部を除く)、加賀市(一部を除く)にお住まいであればご自宅までお迎えに来てくれます。大人数になれば一人あたりの金額も安くなるみたいです。


所要時間は金沢西ICより、関西空港まで5時間半。空港にはフライトの2時間前に空港到着の予定で運行しているということです。

万が一渋滞でも迂回路で時間は厳守してくれるようです。心強いですね。


金沢発、関空発の両方に対応してくれるようです。

大荷物でも問題なく非常にスムーズなサービスのように思います。


石川中央交通乗合空港ジャンボ
TEL: 076-274-3975

http://chuokoutu.com/air.html



3.高速バス+空港リムジンバス (5,800円/人) 所要時間約6〜7時間


一番安くつくが、一番時間がかかりリスクが高いバスの利用。

バスは金沢→大阪(高速バス北陸ドリーム大阪号)、大阪→関空(空港リムジンバス)となり、

必ず1度乗り換えが必要になります。また、逆も同じです。

北陸ドリーム大阪号(4300円/人):
金沢⇔大阪駅JR高速バスターミナル

http://www.kakuyasubus.jp/kansai_hokuriku/hokuriku_dream/index.html

空港リムジンバス(1500円/人):
大阪駅近くハービス大阪⇔関空

http://www.okkbus.co.jp/index3.html

北陸ドリーム大阪号(4300円/人) + 空港リムジンバス(1500円/人) = 5,800円

所要時間は最も長い6〜7時間。乗り継ぎの時間もきわどいので多めに時間を見ておきましょう。

【金沢 → 関空:バス始発 (約6〜7時間)】
金沢 07:00 → 12:35 大阪駅 12:48 → 13:50 関空
金沢 07:00 → 12:35 大阪駅 13:08 → 14:10 関空
金沢 09:00 → 14:35 大阪駅 14:48 → 15:50 関空
金沢 09:00 → 14:35 大阪駅 15:08 → 16:10 関空
金沢 13:40 → 19:15 大阪駅 19:48 → 20:50 関空
【関空→金沢:バス最終 (約6〜7時間)】
関空 20:45 → 21:43 大阪駅 22:20 → 5:54 金沢
関空 21:05 → 22:03 大阪駅 22:20 → 5:54 金沢

ではよい旅を。

2012-04-10 linux上でdropboxを利用する方法 クラウドバックアップに活用可能

linux上でdropboxを利用する方法 クラウドバックアップに活用可能!


サイトのデータやデータベースのバックアップをどのようにとるか困っている方もいるのではないかと(^^) Dropboxを使う方法を紹介します。


1.Dropboxアカウントを取得

http://db.tt/sQqt33i

よりDropboxに登録!(すいません!私の紹介にさしてください!)


2.DropboxクライアントをDownload、Dropboxを実行

f:id:Kmusiclife:20120410010503p:image

https://www.dropbox.com/install?os=lnx

# wget http://www.dropbox.com/download?plat=lnx.x86 -O dropbox.tar.gz
# tar zxvf dropbox.tar.gz
# cd .dropbox-dist
# ./dropboxd start &
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxxxxxxx&cl=en_US to link this machine.

ここに書かれてるURLchromefirefoxブラウザ上で実行します。

1で取得したアカウントでログインします。ログインが成功すると。

Client successfully linked, Welcome Your name!

というメッセージが出るとDropboxが有効になります。

~Dropbox

がdropboxのホームとなります。Photos, Public, はじめに.pdf が初期ファイルとして存在していると思います。


3.monitでdropboxを監視

Dropboxが落ちてはバックアップになりませんのでmonitでdropboxが落ちないように監視します。

/etc/monit/monit.d/dropbox.conf

check process dropboxd with pidfile /path/.dropbox/dropbox.pid
start program = "/path/.dropbox-dist/dropboxd start"
stop  program = "/path/.dropbox-dist/dropboxd stop"

monitのインストール設定は

http://d.hatena.ne.jp/Kmusiclife/20111110/1320936054

を参考にどうぞ。


4.cronでバックアップデータを作成

0   5 * * * tar zcvf /path/Dropbox/backup.tar.gz /backup_path/* > /dev/null 2>&1

などとしてバックアップデータをDropboxに保存です。


Dropboxでは以前のバージョンファイルも参照できるのでバックアップには便利かと思います。便利とセキュリティは天秤です。利用には十分注意が必要です。

2012-04-07 sendmailで送るメールを迷惑メールとならないようにするための2つの

sendmailで送るメールを迷惑メールとならないようにするための2つの施策

f:id:Kmusiclife:20120511043453g:image

しっかりとドメインを取得して、サーバを立ててsendmailでメールを送信、自前のsmtpでメールを送信しても迷惑メールになる。メールが届かない(>人<;)

しっかりとしたサービスで迷惑がられていないサービスであれば下記対策をすることで迷惑メールになる可能性を減らすことができます。

1.逆引き設定

IPアドレスからホスト名を引けるようにしますが、逆引きは必ずしも設定しなくても良いことから設定していないこともありますがしっかりと設定しておきましょう。gmailはこの逆引きの設定で迷惑メールに入らなくなることが多いです。

http://support.google.com/mail/bin/answer.py?hl=ja&ctx=mail&answer=1311182&authuser=1

また、重要なことにSPFIPを指定した際のIP逆引きが必要にもなります。

bindの逆引きの設定の仕方はここでは割愛します。

http://www.atmarkit.co.jp/flinux/rensai/bind904/bind904b.html

などを参照してください。

2.SPFの設定

SPFはメールの送信元が信頼出来るものなのかどうかをDNSサーバのTXTレコードのspf1を参照することでその信頼性を上げるというものです。YahooのメールはこのSPFを設定することで迷惑メールになる確率が下がりました。

SPFの設定は

http://www.openspf.org/SPF_Record_Syntax

に詳細があるのですがTXレコードに下記のフォーマットで記述します。

サンプルにお使いください。

"v=spf1 a:example.com ~all"
"v=spf1 include:example.com ~all"
"v=spf1 include:example.com ip4:0.0.0.0 ~all"
"v=spf1 ip4:0.0.0.0 ~all"
"v=spf1 ip4:0.0.0.0 ip4:1.1.1.1 ~all"
"v=spf1 include:_spf.google.com ~all"

google appsはinclude:_spf.google.comで通ります。gmail.comはredirect=_spf.google.comとなっていますが、sendmailでのSPFであればincludeのほうが効率が良いみたいです。


bindでゾーンファイルでの記述は下記のようになります。

example.com 90 IN TXT "v=spf1 include:example.com ip4:0.0.0.0 ~all"

~allと-allの違いが結構重要になってきます。

"+"	Pass
"-"	Fail
"~"	SoftFail
"?"	Neutral

http://www.openspf.org/SPF_Record_Syntax

に詳細があります。mxレコードの指定など色々と方法がありますので参考にしてみてください。

その他

SPFについて

http://www.openspf.org/Project_Overview

GmailのSPFについて

http://support.google.com/a/bin/answer.py?hl=ja&answer=183895

SPFチェックはここで出来ます。sendmailなど動かすサーバののIPアドレスと、そこから発信するメールアドレスを入力します。

http://www.sendmail.co.jp/sa/spfcheck.html

SPFについて ITmedia

http://www.itmedia.co.jp/enterprise/articles/0603/24/news006.html

Gmailの迷惑メールについて

http://support.google.com/mail/bin/answer.py?hl=ja&ctx=mail&answer=1366858&authuser=1&expand=5

digコマンドでTXTレコード調査
$ dig -t TXT 
;; ANSWER SECTION:
hostname.  81609 IN  TXT "v=spf1 include:xxxxx ~all"

2012-04-06 Debian5.x sources.list更新

使っているDebian5.0.10が徐々に古くなってきたのでaptも通らなくなってきた。

http://forums.debian.net/viewtopic.php?f=30&t=76253

そろそろ6.x squeezeにしないとなぁ。

という訳ですがとりあえず5.xでも使えるように色々と更新しました。

ただ、apt-get upgradeで多くのソフトを更新するとおそらくトラブルが出るので注意してください。

5.xから6.xで一度失敗している私なので(>人<;) 注意してください。

sources.list

deb http://ftp.fr.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ squeeze main
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
deb http://www.debian-multimedia.org squeeze main non-free

下記のように怒られるので

W: GPG error: http://www.debian-multimedia.org squeeze Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXX
W: You may want to run apt-get update to correct these problems

keyring

http://stackoverflow.com/questions/1139127/debian-apt-get-update-error-public-key-is-not-available-no-pubkey-id

#apt-get install debian-keyring
#gpg --keyserver pgp.mit.edu --recv-keys 1F41B907
#gpg --armor --export 1F41B907 | apt-key add -

2012-03-19 nginx + rapid-ssl導入 - わかりやすいよ

nginx + rapid-ssl導入 - わかりやすいよ


f:id:Kmusiclife:20120511143207g:image


nginx + rapid-sslの導入方法を書きます。SSLって何かとめんどくさいイメージありますが、ファイルがどれがどれかわからなくなるから問題なのです。仕組みがわかっていてもファイルがどれがどれかわからなくなります。この時点でめんどくさいですね。でも簡単になるように説明します。

なんでめんどくさい書き方したブログしかないんだよ(・∀・) という不満があったので。


1.Rapid-SSLで暗号鍵を作成


http://www.rapid-ssl.jp/

でSSLを取得します。年間で2,600円ですね。

https://www.rapid-ssl.jp/tools/makePkeyCsr2048.php

ダイレクトアクセスできない場合はトップページ> 新規お申し込み > お申込みフォーム > CSR作成ツールより

で2048ビットの秘密鍵の作成を行います。このツールを使ったほうが楽で確実です。

- 秘密鍵のパスワード
- コモンネーム(Common Name) [ 例) ssl.yourdomain.com ]
- 正式英語組織名 [ 例) Hentai, Inc. ]
- 部門名 [ 例) Design ]
- 市区町村名 [ 例) Kanazawa-shi ]
- 都道府県名 [ 例) Ishikawa ]

コモンネームはSSL接続の際のURL(FQDN)になります。ここ注意ね。

・秘密鍵 (cert.key ※1)

-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END RSA PRIVATE KEY-----

・CSR (cert.csr)

-----BEGIN CERTIFICATE REQUEST-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-----END CERTIFICATE REQUEST-----

の2つが表示されます。

cert.key, cert.csrとしてファイルに保存してください。

/etc/nginx/ssl に私は保存しました。

f:id:Kmusiclife:20120319010033p:image



2.Rapid-SSLで登録支払い・メールの確認


https://www.rapid-ssl.jp/ssl/orderForm.php

のオーダーフォームより必要事項を入力。

CSRの貼り付けの項目では上記のcert.csrの内容を貼り付け。


ショッピングの感覚でクレジット決済まで進みます。

承認メールアドレスという項目は postmaster@yourhost.com などでメールを受け取る必要があります。こちらは怠らずおこなってください。


IDがメールで届き、メールが本当に届いているかの確認を行います。

https://www.rapid-ssl.jp/rapidssl-support/ssl-support.htm

でステータスの確認を行います。


メールに書かれているURLをクリックし

RapidSSLのサイトより認証作業を行います。


f:id:Kmusiclife:20120507191032p:image

のような感じになります。


ステータス = 証明書発行完了

になるまでがんばってください。

f:id:Kmusiclife:20120507191033p:image



3.メールの確認、暗号キーのメールの受取り

【通知】 SSL サーバ証明書発行完了のお知らせ

というメールが届くはずです。私はこのようなタイトルでした。

内容は

SSLサーバ証明書:

-----BEGIN CERTIFICATE-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END CERTIFICATE-----

中間証明書:

-----BEGIN CERTIFICATE-----
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-----END CERTIFICATE-----

の2つです。確認できればOKです。



4.サーバ証明書+中間証明書を合体 (・∀・)

nginxではメールで届いた2つの証明書:SSLサーバ証明書、中間証明書をひとつにまとめたファイルにします。

合体証明書 ( cert.pem ※2 )

-----BEGIN CERTIFICATE-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-----END CERTIFICATE-----

としてcert.pemを/etc/nginx/sslに保存。

ここすごく重要なので何度も読みなおすように。



5.ファイルの確認

cert.key ※1とcert.pem ※2がしっかりと手元にあるか確認してください。

cert.key ※1= Rapid-ssl登録時にWEBサイトで作成したものです(秘密鍵)。
cert.pem ※2= メールで送られてきた証明書を2つ合体させたものです(合体証明書)。

この2つがあればnginxのSSLサーバは動きます。

本記事では下記に保存したとして進めてあります。

/etc/nginx/ssl/cert.key
/etc/nginx/ssl/cert.pem


6.サーバ設定

nginxのconfファイルを書き換えます。

server {

    listen 443;
    server_name yourdomain.com;
    ssl on;

    # 秘密鍵 (cert.key ※1)
    ssl_certificate_key  /etc/nginx/ssl/cert.key;

    # 合体証明書 (cert.pem ※2)
    ssl_certificate      /etc/nginx/ssl/cert.pem;

    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    access_log /var/log/nginx/ssl_yourdomain.com.log;
    error_log /var/log/nginx/ssl_yourdomain.com.error.log;
    root /var/www/yourdomain.com;
    index index.php;

}

nginx -tコマンドなどを入力すると

# nginx -t
Enter PEM pass phrase:
2012/03/19 00:00:00 [info] 00000#0: the configuration file /etc/nginx/nginx.conf syntax is ok
2012/03/19 00:00:00 [info] 00000#0: the configuration file /etc/nginx/nginx.conf was tested successfully

パスワード入力が求められます。Rapid-ssl登録時のものを入力しましょう。

エラーがなければあとは普通に再起動です。



その他:

symfony1.4をnginxでSSL化するときのnginx.confファイル例です

fastcgi_param HTTPS on は見落としがちですので注意してください。

server {

    listen 443;
    server_name yourdomain.com;
    ssl on;
    # 秘密鍵 (cert.key ※1)
    ssl_certificate_key  /etc/nginx/ssl/cert.key;
    # 合体証明書 (cert.pem ※2)
    ssl_certificate      /etc/nginx/ssl/cert.pem;

    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    access_log /var/log/nginx/ssl_yourdomain.com.log;
    error_log /var/log/nginx/ssl_yourdomain.com.error.log;
    root /var/www/yourdomain.com;
    index index.php;

    location / {
        if (-f $request_filename) {
            expires max;
            break;
        }
        if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
            rewrite ^(.*) /index.php last;
        }
    }
    location /sf/ {
        root /usr/share/php/data/symfony/web;
    }
    location ~ \.php($|/) {
        set $script $uri;
        set $path_info "";
        if ($uri ~ "^(.+\.php)(/.+)") {
          set $script $1;
          set $path_info $2;
        }
        fastcgi_pass 127.0.0.1:9000;
        include /etc/nginx/fastcgi_params;
        fastcgi_param HTTPS on; # PHPで_SERVER[HTTPS]のため
        fastcgi_param SCRIPT_FILENAME /var/www/yourdmain.com/web$script;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param SCRIPT_NAME $script;
    }

}

nginx起動時に求められるパスワードを自動化するには?:

# cp cert.key cert.key.org
# openssl rsa -in cert.key.org -out cert.key

http://webmasters.stackexchange.com/questions/1247/can-i-skip-the-pem-pass-phrase-question-when-i-restart-the-webserver

参考になる:

http://dogmap.jp/2011/05/10/nginx-ssl/

2012-02-14 オーストラリア旅行向け。インターネット環境確保について色々と調べ

オーストラリア旅行向け。インターネット環境確保について色々と調べてみた。Wifi modem simカードなど。


2003年にオーストラリアにいたのですがその時日本では殆どの家庭にADSL入っていたのですがオーストラリアの家庭ではあまり普及していなかったのを覚えています。しかも、オーストラリアのインターネットは未だにですが従量制なので日本の無制限の感覚に慣れていると自分がどのくらいの転送量を使っているのかわからないもので躊躇します。従量制?しかも一ヶ月500Gの転送量で10,000円程度。オーストラリアのインターネット環境は正直えっ?!ってなります。オーストラリアではEMobile, WiMaxなどのWiFi modemを使おうとなるとこの感覚を引きずってとなります。


Global dataのMiFiを借りたり海外ではSimフリーのEmobileの端末に現地のSimカードを差し込んで利用しようとか色々と方法があります。何がベストな方法なのかというのをまとめたいと思います。


1.iPad(Softbank)は海外ではSimフリー

f:id:Kmusiclife:20120214132521p:image

https://www.optus.com.au/shop/broadband/mobile/ipadplans

http://d.hatena.ne.jp/mekong23/20100529

とのことです。30Aドルで4Gの転送まで。ただし、Facebook, Twitter, LinkedIn, Myspace, eBay, Foursquareの転送量は無制限。Googleのサービスも無制限に入れて欲しいよね。Gmailとかも。


2.EMobile端末(国外ではSimフリー)で現地のSimカードを利用

・Telstra

GSM:900/1800MHz 3G:UMTS850/2100MHz, CDMA2000

・Optus

GSM:900/1800MHz 3G:UMTS2100/900MHz

vodafone AU (オーストラリア略のAUです日本のauではありません)

GSM:900/1800Mhz 3G:UMTS2100MHz

・3(three)

GSM:900/1800Mhz 3G:UMTS2100MHz


というキャリアがあります


Optus 3Gカバーエリア

http://www.optus.com.au/aboutoptus/About+Optus/Network+Coverage

http://www2.optus.com.au/


Telstraカバーエリア

http://www.telstra.com.au/mobile-phones/coverage-networks/our-coverage/mobile-broadband/


f:id:Kmusiclife:20120214132734p:image


Telstraは大手でやはりカバー範囲は広いです。OptusはSimカードなど融通の聞くサービスが多いように私は思いました。Telstraは有線は相当強いという位置づけなのかもしれないですね。というわけでOptus Simを選ぶことに。



  • Optusプラン1.30日有効転送量3GBまで

https://www.optus.com.au/shop/Broadband/Mobile-Broadband/Prepaid-Mobile-Broadband/Optus-$30-SIM-PP-OMB



  • Optusプラン2.12ヶ月契約で19Aドル/Month(特定のサービスに対しては転送量無制限)

Facebook, Twitter, LinkedIn, Myspace, eBay and Foursquare.は無制限。Googleは?

https://www.optus.com.au/shop/mobilephones

でも12ヶ月も滞在しませんよね。



いずれもFacebook, Twitter, LinkedIn, Myspace, eBay, Foursquareの転送量は無制限。


転送量制限付き(3GBまで)でだいたい30ドル。結構高いですね。


3.旅行代理店H.I.S.のWiFi modemレンタル


f:id:Kmusiclife:20120214133001p:image


調べれば調べるほどわかります。H.I.S.のWiFi modemがいかに企業努力しているかがわかります。

http://activities.his-vacation.com/jp/jp/TourList/Default.aspx?ARCD=O6&NTCD=AUS&KYWD=Wi-Fi

33Aドル/weekで転送量無制限で利用ができるとされています。実際使ってみてからレポします。


H.I.S.のWiFi modemのモデルはこちら

http://www.cnet.com.au/optus-mini-wifi-modem-339308582.htm


ほとんどHuawei E583Cのようです

http://www.amazon.co.jp/dp/B004ED6CRY

ちなみに返却はどの都市のH.I.S.でも良いみたいです。本当に良いサービスです。


というわけで一週間程度の滞在の私は何を利用するかは決まりました。


長期滞在になるとまた事情が変わってきます。Optus回線よりもTelstra回線を引くのが良いのかもしれない。WiFi modemも持つのであればOptus simを使ったほうが良いみたいです。

2012-01-23 Symfony2チュートリアル CRUDアプリを作る

Symfony2チュートリアル CRUDアプリを作る


f:id:Kmusiclife:20120511143411g:image


f:id:Kmusiclife:20120123034724p:image

Symfony2でひとまず動かすためのチュートリアルです。

crudコマンドを使って簡単なCRUDを実装します。

http://yourhost/app_dev.php/post/

にチュートリアル用のアプリケーションを作ることを前提にします。

バンドル・エンティティを作成

TutorialHelloバンドルを作成し、Postというエンティティを追加します。

$ php app/console generate:bundle --namespace=Tutorial/HelloBundle
$ php app/console doctrine:generate:entity --entity=TutorialHelloBundle:Post --format=yml

Postエンティティの編集

doctrine:generate:entity --entity=TutorialHelloBundle:Post --format=yml

では2つのファイルが作成されます。

src/Tutorial/HelloBundle/Entity/Post.php

src/Tutorial/HelloBundle/Resources/config/doctrine/Post.orm.yml

一つはPostモデル、Post.orm.ymlはDoctrineORマッパー用(今回はアノテーションを利用しません)。

Post.orm.ymlを編集し、 app/console doctrine:generate:entitiesを実行

することでモデルを生成します。

Post.orm.ymlにnameとsubject, descriptionのカラムを準備します。

$ vim src/TutorialHelloBundle/Resources/config/doctrine/Post.orm.yml
Tutorial\HelloBundle\Entity\Post:
  type: entity
  table: null
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    name:
      type: string
      notnull: true
    subject:
      type: string
      notnull: true
    description:
      type: text
      notnull: true
    
  lifecycleCallbacks: {  }

ORM.YMLからモデル生成しテーブルをupdate

編集したPost.orm.ymlからPost.phpモデルを作成し、doctrine:schema:updateで

テーブルと同期させます。テーブルが存在しない場合は doctrine:schema:create

doctrine:generate:entitiesでバックアップを作成したくない場合は

    • no-backupオプションをつけます。バックアップを作成します。

Post.php~ というファイルが自動的に作成されます。

$ php app/console doctrine:generate:entities TutorialHelloBundle
$ php app/console doctrine:schema:update --force

PostクラスのCRUDを作成

doctrine:generate:crudでCRUDを作成します。--entityオプションは必ず必要です。

また、--with-writeをつけないと表示のみ(show)となります。

CRUDには--with-writeが必要です。

$ php app/console doctrine:generate:crud --entity=TutorialHelloBundle:Post --with-write

routingの編集

CRUDのファイルが生成されたらroutingしてあげましょう。

app_dev.phpから/postからアクセスするように設定します。

app/config/routing_dev.yml を編集します。

$vim app/config/routing_dev.yml
# app/config/routing_dev.yml
_post:
    resource: "@TutorialHelloBundle/Controller/PostController.php"
    type:     annotation
    prefix:   /post

これで

http://yourhost/app_dev.php/post

にアクセスできるようになると思います。

Symfony2でも思った以上に簡単にCRUDアプリケーションが出来上がります。

f:id:Kmusiclife:20120123034745p:image

Symfony2のapp/console エンティティ周り

// データベース作成・削除
php app/console doctrine:database:drop --force
php app/console doctrine:database:create

// バンドルの作成
php app/console generate:bundle --namespace="My/ProjectBundle" --format=yml

// エンティティの作成 --fieldsオプションも付けられます
php app/console doctrine:generate:entity --entity=MyProjectBundle:Post --format=yml

// yml Entityからモデルを作成 --no-backupでバックアップを作成しない
php app/console doctrine:generate:entities "MyProjectBundle" --no-backup

// エンティティからテーブルの作成・更新
php app/console doctrine:schema:create
php app/console doctrine:schema:update --force

ymlエンティティ作成に関してfieldsの詳細は

http://symfony.com/doc/2.0/reference/forms/types.html

relationsなどに関して

http://stackoverflow.com/questions/7546377/problem-with-symfony2-schema-yaml-unable-to-get-relationships-working

2012-01-22 Symfony2の簡単チュートリアル(環境整備込み)

Symfony2の簡単チュートリアル(環境整備込み)


f:id:Kmusiclife:20120511143411g:image


まだまだ現役のSymfony1.4.6ですがそろそろサポートも終わり、Symfony2が一般的になる日も近いような気がしてきているこのごろです。Symfony2はSymfony1.4.6と互換性がないといっていいでしょう。1.4.6で利用しているデータベースをSymfony2でモデルと生成して利用するというのが今後の流れになるでしょう。早めにSymfony2に触れておきましょう。

http://symfony.com/

色々とチュートリアルがあるけれども意外と動かなかったり。とりあえずここで書いてあるものは私の環境ではしっかりと動作させたもののみ掲載しています。Debian6.0.3 さくらVPSの上でVPN経由で動かしました。


Symfony2の環境整備

symfony2はPHP5.3.xで動作します。Debian6 SqueezeではPHP5.3が入ります。

Debian5 Lenny等の場合は

http://www.debian.org/releases/stable/i386/release-notes/ch-upgrading.ja.html

などを参考になりますが、Squeezeでのmysqlバージョンアップで多くが何故かトラブります。

Squeezeではnginxのバージョンも上がりますのでSqueezeへのバージョンアップをお勧めします。

http://d.hatena.ne.jp/Kmusiclife/20120118/1326871846


nginxでsymfony2を動作させます。今のところ下記の設定で動作しています。

app.phpやapp_dev.phpのコントロールもこの辺でできます。

location / {
    root /path/symfony2/web;
    index index.html index.htm index.php;
}
location ~ \.php|\.html$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /path/symfony2/web$fastcgi_script_name;
}
location ~ \.cgi$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:8999;
    fastcgi_index index.cgi;
    fastcgi_param SCRIPT_FILENAME /path/symfony2/web$fastcgi_script_name;
}

なお、nginxなどの細かい設定は

http://d.hatena.ne.jp/Kmusiclife/searchdiary?word=%2A%5Bnginx%5D

を参考にしてください。

その他、gitなど必要となるソフトも幾つかありますのでその都度確認してください。


Symfony2の簡単チュートリアル

$ wget http://symfony.com/download?v=Symfony_Standard_Vendors_2.0.9.tgz -O Symfony_Standard_Vendors_2.0.9.tgz
$ tar zxvf Symfony_Standard_Vendors_2.0.9.tgz
$ mv Symfony symfony2
$ cd symfony2

download完了です

$ php app/check.php # 問題がなければ次へ
$ php bin/vendors install # vendorの場合は --reinstall を追加

localhost以外からアクセスする場合は

$ vim web/app_dev.php
/* コメントアウトします
if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
    '127.0.0.1',
    '::1',
))) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
*/

ブラウザよりアクセスします。

http://hostname/app_dev.php

にアクセスします。

Whoops, looks like something went wrong.

などのエラーが出た場合はcacheパーミッションに問題があることが多いです。

$ chmod -R 777 app/cache app/logs

でcacheのパーミッションを与えます。

welcomeのページが表示されればOKです。

http://hostname/app_dev.php/_configurator

よりデータベースなどの基本設定を行います。

おそらく書き込みエラーが出るので

$ chmod -R 777 app/config/parameters.ini

再度更新してリクエストを送り直せば更新されます。

Doctrine(model)を作成します。

$ php app/console doctrine:generate:entity --entity=AcmeDemoBundle:Product --fields="name:string(255) price:float description:text" --format=yml

を行うことによって

src/Acme/DemoBundle/Entity/Product.php
src/Acme/DemoBundle/Resources/config/doctrine/Product.orm.yml

の2つのファイルが作られます。 doctrine:generate:entityで--format=ymlを付けないとProduct.orm.ymlファイルが作成されませんので注意です。

$ php app/console doctrine:database:create
$ php app/console doctrine:schema:update --force

でデータベースにテーブルを作りモデルと同期させます。

// src/Acme/DemoBundle/Controller/DemoController.phpなどで
use Acme\DemoBundle\Entity\Product;

public function indexAction()
{

    $product = new Product();
    $product->setName('Foo bar');
    $product->setPrice(100.00);
    $product->setDescription('This is test description.');
    $em = $this->getDoctrine()->getEntityManager();
    $em->persist($product);
    $em->flush();
    
    echo $product->getId();
}

とテストコードが動けば問題ないでしょう。

http://hostname/app_dev.php/demo/

などでアクセスできると思います(環境によって異なります)。

この辺のはなしは

http://docs.symfony.gr.jp/symfony2/book/doctrine.html

にもあります。ただ、私はこのチュートリアルではしっかりと動作しませんでした。

2012-01-18 Debian6でnginx1.xをaptから入れる

Debian6でnginx1.xをaptから入れる


f:id:Kmusiclife:20120511143635j:image


/etc/nginx/nginx.confをバックアップしておいたほうが良いです。

私は下記作業で上書きされ多少書き直しました。

GPG署名を入れる

# wget http://nginx.org/packages/keys/nginx_signing.key
# cat nginx_signing.key | apt-key add -

/etc/apt/sources.list を追加

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

apt-getでインストール

#apt-get update
# apt-get install nginx

バージョンをチェックします

# nginx -v
nginx version: nginx/1.0.11

ブログはこちらへ移行しました