Nginx

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にレスポンスが返り、完成。

[Read More…]

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;
}

[Read More…]

NginxでPermission denied

開発環境

OS:Ubuntu12?

Webサーバー:Nginx

という環境下でWindowsでホストしていたお客さんのサイトを持ってきて改修しようとしたら、

jsやらcssやら画像やらが軒のみPermission denied でエラーでて表示されない。

ググってみたけれども該当するものがない。

※自身のテスト用のものなどはちゃんと画像等問題なく読み込める。オーナーや権限も問題ない

んで、ざっとファイル見ててなんとなく気になって「Thumbs.db」を削除したら表示されるようになった。

Nginxのセキュリティ機能?なのでしょうか。仕組みは調べていない。ちゃんと勉強が必要ですね。

追記:どうも原因は別にあったかも。再現できない。

[Read More…]

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ユーザーの作成と

[Read More…]