Setting-Construction
fmxj.js のサーバーサイドをPHPじゃなくてPerl(Mojolicious)で試す
先日、SeedCodeの方がFileMakerのCustom Web Publishing の為のJavaScriptとServer side で使うPHPのサンプルをGithubで公開されてました。
https://github.com/seedcode/fmxj
概要としては、FileMaker Server の XML公開を使う。
Web公開エンジンにXML公開のためのリクエストをJavaScriptで生成してサーバーサイドスクリプト(SeedCodeのサンプルではPHP)にpostする。
◆ハマった事:サンプルPHPの内容
サンプルのPHPをよく読んでなかった。。。
JavaScriptからFileMakerのユーザーアカウントとパスワードをpost出来るようにキーバリューを元々のpostデータに加えている。それから本来のpostデータからおまけを除くための追加分のパラメータ文字数もpostに加えている。この辺りの仕様にもんりょりする。
-db=dbname&-lay=layname&-query=(q1)&-q1=Status&-q1.value=Vendor&-findquery みたいな通常のクエリデータに
u=undefined&p=undefined&l=コンテンツの文字数
ていうのがくっついてPHPにpostされてくる。
それをPHP側でphp://inputでリクエストのボディを取得して余計なパラメータを削ってpostデータを作り直してcurl使ってPOSTしてた。
そこに気づかずperlで再現しようとした時にpostデータを丸投げしてエラーになってしまっていた。
なんでpostデータをわざわざこねくり回してるんだろう?て思ってた。
サンプルって事でいろいろハードコーディングされてるけど、気にしない。
◆ハマった:Nginxの設定
欲をかいてPerlでサーバーサイド書くにあたって、FastCGIでさらっと書くじゃなくてMojolicious使うことにしたら
WebServer→Nginxでバーチャルホスト(hoge.sample.comみたいな)とmorboで127.0.0.1:3000で動くMojoliciousになって、何が起きたかって言うとクロスドメインの問題が発生してしまい、エラーになる。
これについてはNginxの設定でproxy_passでMojoliciousにリクエストがリバースプロキシされるようにして解決。
しかしNginx、デフォルトではContent-Typeの書き換えができず、JavaScriptにレスポンスされるデータがXMLになっていなくて、意図する結果に終わらない。既にあるヘッダーに値を追加する処理を行ってしまう。
※Nginxで add_header Content-Type ‘application/xml’してもmime-typeの設定ファイルに追記しても
Content-Type text/html;charset=UTF-8に application/xmlの値が追記されるだけになる。
その結果、fmxj.jsがXMLHttpRequestのresponseXMLに値がセットされない。そしてresponseXMLがあるの前提になっているXMLをパースする処理のところで結果が空欄になって処理が終わってしまう。
最初fmxj.js内部を書き換えて(responseTextをXMLに変換して)みたんだけど、コアのライブラリを触るのはよくないので、Nginxでちゃんとヘッダを書き換えられる方法を調べる、nginx-extrasを追加でインストールするとmore-set-headerというのが使えるようになり、ヘッダーの書き換えができるようになるとの事だったのでインストール。
自分はUbuntuの環境なので、
sudo apt-get install nginx-extras
後はNginxの設定ファイルに(厳密に言うとリクエストを受け付けるLocationディレクティブで)
more_set_headers ‘Content-Type: application/xml; charset=UTF8’;
を追記、more…がヘッダーの追記ではなく書き換えなのでcharsetも忘れずに書く!
これでようやく、Sample.html → fmxj.jsを使ってServerにpostリクエスト → 受けたリクエストをNginxがMojoliciousを動かしてるmorboにリバースプロキシ → MojoliciousがPOSTリクエスト受け取りXML公開のクエリパラメータ付きURLを生成して(生成しなおして)cURLをラップしたライブラリからPOST送信 → JavaScriptにレスポンスが返り、完成。
AnsibleのSSH設定について
Ansibleがバージョンを上げた所為か今までのやり方だとSSHのコネクションエラーになるようになって、どうも–ask-pass の引数付きにするとパスワードいれて処理ができる事はわかったんだけど、スマートじゃない。
という事で調べた。
結論としては、varsファイルに
・ansible_ssh_user
・ansible_ssh_pass
・ansible_sudo_pass
の3つを書いておきましょう。でした。
最初に呼び出すsite.yml内で変数定義してもいいんだけど、group_varsディレクトリ内にhostsファイルで書くグループ名のyamlに書くのがいいかなって思う。
例えばhostsファイルに
`Ansibleがバージョンを上げた所為か今までのやり方だとSSHのコネクションエラーになるようになって、どうも–ask-pass の引数付きにするとパスワードいれて処理ができる事はわかったんだけど、スマートじゃない。
という事で調べた。
結論としては、varsファイルに
・ansible_ssh_user
・ansible_ssh_pass
・ansible_sudo_pass
の3つを書いておきましょう。でした。
最初に呼び出すsite.yml内で変数定義してもいいんだけど、group_varsディレクトリ内にhostsファイルで書くグループ名のyamlに書くのがいいかなって思う。
例えばhostsファイルに
`
とか書いてグループ名が「dev」の場合に
-playbook\
|
|–dev.yml
|
|–group_vars\
| |
| |–dev.yml
|
|–roles\※内容略
|
|–site.yml
みたいな感じで書く。
group_varsのdev.ymlには上記のようなansible_xxx_xxxを変数定義しておくとグループに対してssh接続の時に定義された値が使われる。これにより–ask-passの指定が必要なくなった。
問題は1つあって、group_varsのdev.ymlは公開したくない場合多いよねって事。
なので更に、ここでいうdev.ymlはansible-vaultコマンドを使って暗号化する。もしくはバージョン管理に含めない運用を行うって事が必要になる。暗号化する場合も復号に使うキー? ソルトみたいなもん?を書いたファイルを作る必要があって、それがないと暗号と復号ができないんだけど、そのファイルをバージョン管理に含めないって運用にするなら、最初からdev.ymlを含めないでも一緒かなって思う。
ansible-playbookを実行する時に復号のために–vault-passの引数とそのファイルパスを渡さないといけないってのも–ask-pass使うのと大差ないじゃんってなるから暗号化は必要な案件だけでいいかな。
hostsファイルにhostの後に引数オプション的にansible_ssh_passとか書けばいいのだけれども、それもなんだかなー
って事で、今後はgroup_varsもしくはglobalに認識されるような変数を定義するファイルにssh接続情報は書こうかと考えている。
Ubuntu14.04 でphpでメール受信とか
## install postfix
“`
sudo apt-get install postfix postfix-dev sasl2-bin
sudo apt-get install dovecot-core dovecot-dev dovecot-pop3d dovecot-imapd dovecot-gssapt
“`
## Settings
“`
sudo cp /usr/lib/postfix/main.cf /etc/postfix/main.cf
sudo emacs -nw /etc/postfix/main.cf
“`
### 参考
– http://www.server-world.info/query?os=Ubuntu_14.04&p=mail
– http://www.server-world.info/query?os=Ubuntu_14.04&p=mail&f=2
### gmailに転送する設定に変更
relayhostにgmailを指定
パスワードの設定とかね。
## phpでメールを受信出来るよう設定
メールサーバ受信DNS設定とか面倒だからやめた。
phpinfoを見ると案の定imap入ってませんでしたので、php5.5系の落としてきてimapのディレクトリ移動してphpize
### configureで失敗する
configureしたらutf8_mime2text()がうんたらと出てきた。
ググると、どうもphpにimapとかメール関係入れる時にライブラリが足りないと出るエラーのようだ。
sudo apt-cache search libc-client
Ubuntu14.04 LTS でNginx FasCGI Perl
古いPerlのサンプルを参考に復習したくなって、やむなく自分の開発環境にFastCGI環境をセットアップ
最初、コードが間違っているのに気づかず3日ほどあれこれ調べまわっても解決せず時間を浪費した。
502 bad gatewayのエラーでて、ログを見ると Cannot execute script って出てて、調べても分からんし、権限は間違ってるはず無いしでずっとつまずいてた。
結局、
sudo apt-get install fcgiwrap
※もしかしたら libgcgi-perlも必要?でもなんか下記のfastcgi-wrapper.plを使う場合に必要なやつかも
/etc/init.d/fcgiwrap のFCGI_USERあたりを動かしたいユーザーやグループに変更。※お好みで
sudo sysv-rc-conf on fcgiwrap
sudo service fcgiwrap start
でFastCGIが動くようになる。
最初、fastcgi-wrapper.plを使う場合を参考にしてたけど、
参考:http://ubuntu.flowconsult.at/linux/nginx-perl-fastcgi-installation-ubuntu-linux-14-04/
これだとなんかPerlのみっぽかったしTCPだったので、Unixソケットで通信にしたかったのとpythonやRubyでも動かしたかったのでfcgiwrapを使うようにした。
Nginxの設定はlocationディレクティブだけ抜粋すると
#拡張子が.plで終わるリクエストの場合
location ~ \.pl$ {
try_files $uri = 404;
gzip off;
#インストールしたfcgiwrapのソケットファイルのパス
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#/etc/nginx/fastcgi_paramsの内容を読み込む。
include fastcgi_params;
}
で
新しく開発環境作成中
Ubuntu14(64bit)のVM作成
-
イメージからVMWareFusionに作成
-
ホームディレクトリ以下のディレクトリ群が日本語なので英語名に変更
-
ターミナルから LANG=C xdg-user-dirs-gtk-update を実行 LANG=C xdg-user-dirs-gtk-update
-
設定画面が出てくるので、そのままOK
-
-
VMWare toolsをインストール
- VMWareのメニューバーからインストールってやると仮想CDがマウントされるのでデスクトップあたりに展開
- 展開したディレクトリの中に入ってインストール実行
-
aptのアップデートとアップグレード sudo apt-get update
sudo apt-get upgrade -
Dropboxクライアントのインストール
- FirefoxでDropbox検索してログイン→クライアントツールをダウンロードしてインストール
- Dropboxを入れる理由は次のEmacsの設定ファイルをDropboxで共有しているから
-
Emacsのインストール sudo apt-get install emacs24
- Dropboxにある設定ファイル群(emacs.d)のシンボリックリンクを作成
- 作成したシンボリックリンクの名前変更 ※ダイレクトに.emacs.dのリンクを作成だとうまく行かなかった
ln -s ~/Dropbox/emacs.d ~/emacs.d
mv ~/emacs.d ~/.emacs.d
-
バージョン管理のインストール sudo apt-get install git
sudo apt-get install mercurial
Vagrant、最終的にはEC2にAnsibleでWordPressを構築を試みる
Ansibleに興味があって試そうとして、対象のサーバーをまずはVagrantを使おう、最終的にはEC2を使う形まで持って行こう。という企画です。アプリとしてはAnsibleのチュートリアルに出てきたのでWordPressを構築するのを試します。
の、前にAWSのS3試したので。
・IAMでアカウント作ってセキュリティポリシーでS3の接続出来るバケット制限したり、操作権限制限したり出来る
・Pythonのbotoを入れて最初S3の操作しようと思ったけど、マルチパートアップロードのやり方が分からなくて挫折
・AWS-CLIが楽ちん、S3に対して勝手にマルチパートアップロードしてくれる。でもWindowsで扱う場合、お決まりの文字コード警告がでますね。
・PHPのSDKでS3に対するファイルのリスト取得、ダウンロード、アップロード(マルチパートアップロード)を作成。思ってたより簡単。
Ansible試す
・Vagrantで作成したboxにAnsibleでSSHに接続する場合、SSHの設定をansible.cfgにpathを書いていない場合、デフォルトの~/.ssh/configを参照してしまう。
・Ansibleはインベントリファイルに書いた名前でSSHする。だからSSHの設定ファイルのHost名は合わせる
・AnsibleのDocument(英語)である程度分かるんですが、ansible-docコマンドで、ある程度何が出来るか雰囲気だけ分かる。
・Ansibleで指定するモジュールはユーザーを作るadd、ファイルを転送するcopy、shellを実行するshell、ファイルを実行?するcommand、aptやyumあたりがよく使うモジュール、設定ファイルで編集が1行で済む場合はlineinfile、結構いろいろある場合は完成版の設定ファイルをcopyするかJinja2で作成したtemplateファイルを使う
・Ansibleのnotifyで呼び出されるのは同じRoleのhandlerに登録されたYamlのnotifyで指定した値と同じnameのものが処理されるようだ
以下WordPressでApacheとMySQLを別サーバーにする場合に忘れず行いましょう的なMySQLに関する事
・AnsibleでlocalhostだけじゃなくてWebサーバー側のIPのも作成しましょう
・Ansibleでmy.cnfでbind_addressでWebサーバーから接続できるようループバックからIPに変更する
Linux関係のメモ201407
Ubuntu系でのchkconfigに変わるコマンドってなんだっけ?
-> sysv-rc-confがそれに相当するがデフォルトでは入っていないのでインストールが必要……
checkconfigてLinux全般共通じゃなかったんだ……
・Ubuntu系でインストール済みのパッケージを見るのはdpkg -l(える) この後にgrep付けるヨロシ
・Ubuntuでパッケージの検索はapt-cache search
apt-get searchじゃなかった……
最近やったいろいろ
最近やったいろいろな作業。こまかく書くのめんどいから一つにまとめちゃった。
◆PostgreSQLのSQLダンプ
・sqlダンプコマンドして移行先で復旧コマンドで取り込み。楽ちん!
◆残念VBSバッチスクリプト
・サーバーのローカルでEscキーを送信するバッチ処理作ったけど、リモート等で開いてないと正常に動作しない
・windowsのコマンドでディレクトリ削除するコマンド
◆謎!IISの設定
・IISのRewrite設定
直接変更すると適用されない場合がある?わかりにくいGUIからRewrite設定
・DefaultWebSiteは外部からの通信を遮断して、仮想サイトだけが外部からのリクエストを受付け、
DefaultWebSiteにリダイレクトするやり方がある。
・IISの接続数制限はユーザー単位ではなく、リクエスト単位なので1ブラウザ6リクエスト位使うため、6の倍数で設定しないと、意図した制御に出来ない
◆Win8.1
・スタートパネルの左下にひっそりとアプリ一覧に移動するアイコンが。
・デスクトップやスタートパネルからwin+fで検索してもアプリ出てこない。
・win8でSQLServer2012のodbc設定がうまくいかない
解決していない。接続先サーバーが選択できない。何か設定が足りてないのかも
◆PHP
・古いやり方のPHP(PEAR使ってる)のinclude設定。ホントめんどい。
・PHPで頼りになるのはやはりPHP.net
・問い合せフォームやるとバランスよく覚える気がする(Javascript、css、php)。
確認レイアウトを制御phpが適宜incudeするやり方はスマートかもしれない。
※セッション制御が楽かも
・メール送信は確実なのはqdmail&qdsmtpなんだけど、遅い。
・メール送信はPHP5.3以降でiconvモジュールが無効になっていないならZendでいいやろ
※まさかのiconvモジュールが無効になっていると関連ライブラリでエラー出てZendMail使えない
・php5.4以降はセーフモード使えない
・システムレベルの操作を行う関数に影響が出るのでcgiで動かしましょう。
・ファイルのオーナーとかに気をつけましょう
◆Apacheの設定
・SSLのヴァーチャルホスト設定する時には証明書のパスを書く
・ReWriteEngineの書き方、.htaccessにリダイレクトの設定書こうとしたけど、うまくいかなくて
vhost.confの方に書いた
◆SSH
・SSHで認証鍵ファイルを使う場合の設定方法
ローカルで認証鍵を作成して、公開鍵をサーバーのSSHログインアカウントの~/.ssh/に放り込む
・~/.ssh/に設定ファイルを置いておくと楽
◆ポートフォワーディング
・1つ目のsshがリモートサーバーに対して22ポートで接続するが別のサーバーに任意のポートを転送する設定、
転送するポートは22じゃなくても良いので、3389転送してRDPとか出来る。
◆忘れちゃうからメモ(Linuxコマンド)
・scp
scp sourcefile remotehost target
◆emacs
・ssh→sudo or su root する方法
NginxでPermission denied
開発環境
OS:Ubuntu12?
Webサーバー:Nginx
という環境下でWindowsでホストしていたお客さんのサイトを持ってきて改修しようとしたら、
jsやらcssやら画像やらが軒のみPermission denied でエラーでて表示されない。
ググってみたけれども該当するものがない。
※自身のテスト用のものなどはちゃんと画像等問題なく読み込める。オーナーや権限も問題ない
んで、ざっとファイル見ててなんとなく気になって「Thumbs.db」を削除したら表示されるようになった。
Nginxのセキュリティ機能?なのでしょうか。仕組みは調べていない。ちゃんと勉強が必要ですね。
追記:どうも原因は別にあったかも。再現できない。
2014年の目標達成進捗管理的な
新年、明けましておめでとうございました。良いお年を。
今回は、プログラムの勉強のために作成して使っているVM(Ubuntu)にredmineを動かす。という話。
事の発端は新年に目標を掲げるのは意味がない。なぜならば年が改まるとかそういうタイミングでしか掲げられないような目標は普段から取り組めない達成できない目標だから。
とか、意志薄弱な人間は日が経てば目標自体忘れて結果達成できない。とか、変にハードルの高い目標にしてしまって達成できなくて早々に諦めてしまうとか。
そういう話を聞いたので、ならば達成出来るように達成可能と思えるような目標をredmineでマイルストーンをチケットとして分解して期日を設定して進捗管理するのはどうだろうかと考えた。
要は2014年の目標はredmineで適当な目標の進捗管理を行い、その目標を達成できるよう行動する。のが目標。
という事で設定作業開始
環境:
- ホストOS:OS X10.9
- ゲストOS(今回使用する環境):Ubuntu13.10 32bit(ずっと64bitいれたと思っていた(T_T))
- nginx1.4.1(以前から使用していて今回はredmine向けに設定を変更します)
- ruby2.0.0dev(rbenv)
- unicorn4.7.0
- rails3.2.16
- redmine2.4.2
rbenvにruby2.0を追加してデフォルトにする
rbenvは元から入れていたので、今回は2.0を追加する作業だけ。折角だから最新を使おうってだけ。
参考:rbenvを利用して複数バージョンのRubyをインストール
※自分の環境ではrehashのみ、フルパス指定じゃないとエラーになる。なんでだろう。
rehashの時だけsh-rehashがうんたらってエラーになる。
ruby2.0の状態でgem update でアップデートしてbundler入れる。
MySQL側の準備
redmienユーザーの作成と