問題タブ [plack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - Catalyst/Plack/Starman で nginx を使用する理由
Plack/Starman を使用して小さな Catalyst Web アプリをデプロイしようとしています。すべてのドキュメントは、これをnginxと組み合わせて使用したいと示唆しているようです。これにはどのような利点がありますか? ポート 80 で直接 Starman を使用しないのはなぜですか?
perl - Nginx、Starman、Plack、Catalystを使用したアプリケーションのランタイムエラーはどこにありますか?
Dave RolskyのSilkiディストリビューションで見つけたデーモンスクリプトを使用して、Plack+Starmanを使用して開発マシンでCatalystアプリをサーバー化することに成功しました。
次に、スターマンサーバーにリバースプロキシするようにnginxを設定し、nginxが提供する静的ディレクトリのエイリアスを作成しました。ここまでは順調ですね。ただし、アプリケーションSTDERRがどこにログを記録するのか迷っています。それはnginxに到達していません(私はそれが理にかなっていると思います)が、Starmanがそれをどこに記録しているのかについての多くのドキュメントを見つけることができません-どこにでも。Plackのミドルウェアモジュールを確認しましたが、アクセスログのオプションしか表示されませんでした。
誰かが私を助けることができますか?
perl - nginx と Perl: FastCGI とリバース プロキシ (PSGI/Starman)
最近、Perl Web アプリケーションを実行するための非常に一般的な選択肢は、リクエストを FastCGI デーモンまたは PSGI 対応 Web サーバー (Starman など) にプロキシする nginx Web サーバーの背後にあるようです。
なぜ一般的にこれを行うのかについて多くの質問があり (egなぜ Catalyst/Plack/Starman で nginx を使用するのですか? )、答えはどちらの場合にも当てはまるようです (例: nginx が静的コンテンツを提供できるようにする、アプリケーションを簡単に再起動できるようにする) 。サーバー、負荷分散など)
ただし、FastCGI とリバース プロキシ アプローチの使用の長所と短所に特に関心があります。Starman は、最速かつ最高の Perl PSGI アプリケーション/Web サーバーであると広く考えられているようです。どちらのアプローチもサポートしているようです:
- UNIX ドメイン ソケットと TCP ソケット
- フォーク/プロセス マネージャー スタイルのサーバーと非ブロッキング イベント ベース (AnyEvent など) サーバー。
- シグナル処理/グレースフル リスタート
- PSGI
同様に、どちらのオプションの nginx 構成も非常に似ています。
では、なぜどちらかを選択するのでしょうか。
perl - Plack 認証ハンドラーをスタックするにはどうすればよいですか?
私のPlackアプリで、ユーザーを承認するいくつかの異なる方法を試してもらいたいです。具体的には、ユーザーがセッション cookie を介して既に承認されているかどうかを確認し、Digest 認証を確認してから Basic にフォールバックします。
私は、チェックしたい順序 (セッション、ダイジェスト、ベーシック) で一連の Auth ハンドラーを有効にできると考えました。残念ながら、Plack::Middleware::Auth::DigestとPlack::Middleware::Auth::Basicの書き方では、ダイジェストまたは基本認証がそれぞれ存在しない場合、どちらも 401 を返します。
これは通常、Plack ではどのように処理されますか?
perl - 別のユーザーとしてアプリケーションを実行するための最適な初期化スクリプト
ユーザーアカウント(Plackベース)で実行するアプリケーションがあり、initスクリプトが必要です。
「sudo$userstart_server...」と同じくらい簡単なようです。start-stop-daemonを使用してLSBスクリプトを作成したところ、非常に不器用で冗長です。それは正しい方法のようには感じません。
少し精査して例のログを見た後、これを行うための最良の方法がまだわかりません。また、私が見つけたまとまりのあるガイドはありません。
今、私はそれを使っています:
DAEMONおよびDAEMON_OPTSを次のように使用します。
これは、実行を検出する方法を調整する必要があります。これは、perlスクリプトであり、perlが「start_server」ではなくコマンドとして表示されるためです。
(私はそのユーザーアカウントのperlbrewからこれを実行しているので、システムのperlから完全に分離されています。そのため、パスはユーザーディレクトリのperlを指しています)
これは本当にこれを行うための最良の方法ですか?私には非常に不格好に思えますが、私は管理者タイプではありません。
perl - Mason2 UTF-8をクリーンにする方法は?
質問を再定式化するのは
- @optionalは私に尋ねました
- 1つのHTML::Masonベースのソリューションが明確でリンクされていなかったため、Apache、mod_perl、およびDBIを使用してMason UTF-8 Unicodeをクリーンにする4つの簡単な手順により、混乱が生じました。
- オリジナルは4歳で、その間に(2012年に)「詩人」が作成されます
コメント:この質問はすでに「人気の質問バッジ」を獲得しているので、おそらく私だけが絶望的な人ではありません。:)
残念ながら、完全な問題スタックを示すことは非常に長い質問につながり、それは非常にメイソン特有です。
まず、意見のみの部分:)
私はHTML::Masonを長年使用しており、現在はMason2を使用しようとしています。詩人とメイソンは 、CPANで最も先進的なフレームワークです。何も比較できるものは見つかりませんでした。すぐに使えるもので、非常にクリーンな書き込みが可能です/しかし非常にハッキング可能です:)/多くのバッテリーが含まれているWebアプリ(ロギング、キャッシュ、構成管理、ネイティブPGSIベースなど...)
残念ながら、作者は残りの単語を気にしません。たとえば、デフォルトでは、ASCIIベースのみであり、 マニュアル、FAQ、またはアドバイスはありません。ユニコードでの使用方法
今事実。デモ。詩人アプリを作成します。
そして、以下に追加しdhandler.mc
ます(2つの基本的な問題を実証するもの)
アプリを実行します
http:// 0:5000 / xls / hello.xlsxにアクセスすると、次のようになります。
ダウンロードhello.xlsxをクリックすると、ダウンロードが表示hello.xlsx
されます。
上記は最初の問題を示しています。たとえば、コンポーネントのソースは「下」にないuse utf8;
ため、lc
は文字を理解しません。
2番目の問題は次のとおりです。[ http:// 0:5000 / xls /hélló.xlsx]または http:// 0:5000 / xls / h%C3%A9ll%C3%B3.xlsx を試してみてください。見る:
もちろん、入力(path_info
)はデコードされません。スクリプトは、perl文字ではなく、utf8でエンコードされたオクテットで機能します。
したがって、perlに「ソースはutf8にあります」と伝えると、結果ににを追加use utf8;
します。<%class%>
追加use feature 'unicode_strings'
(またはuse 5.014;
)さらに悪い:
もちろん、ソースにはワイド文字が含まれているためEncode::encode_utf8
、出力に必要です。
次のようなフィルターを使用してみることができます。
出力全体をフィルタリングします。
<%init%>
ただし、または<%perl%>
ブロックのエンコーディングに注意する必要があるため、これは部分的にしか役立ちません。多くの場所でのperlコード内のエンコード/デコード(読み取り:境界ではない)は、spagethyコードにつながります。
エンコード/デコードは、 詩人とメイソンの境界のどこかで明確に行う必要があります。もちろん、Plackはバイトレベルで動作します。
部分的な解決策。
幸いなことに、詩人は巧妙にそれ(およびメイソン)の部分を変更することを許可しているので、 $poet_root/lib/My/Mason
あなたは次のように変更することができますCompilation.pm
:
必要なプリアンブルをすべてのメイソンコンポーネントに挿入するもの。(すべてのコンポーネントに触れることを忘れないでください。または、コンパイルされたオブジェクトをから削除してください$poet_root/data/obj
)。
また、次のように編集して、境界でリクエスト/レスポンスを処理してみることができます$poet_root/lib/My/Mason/Request.pm
。
すべてをエンコードすることは間違った戦略です、それは例えばXLSを壊します。
したがって、4年後(2011年に最初の質問をした)はまだわかりません:( Mason2アプリケーションでUnicodeを正しく使用する方法はまだわかりませんが、それに関するドキュメントやヘルパーはまだ存在しません。:(
主な質問は次のとおりです。-どこで(Mooseのメソッド修飾子によってどのメソッドを変更する必要があるか)、入力をどのように正しくデコードし、出力をどこで(Poet / Masonアプリで)。
- しかし、テキストのものだけ、例えば
text/plain
またはtext/html
など... - 上記の「サプライズフリー」を実行します。たとえば、単純に機能するものを実行します。;)
誰かが実際のコードを手伝ってくれませんか?上記で何を変更する必要がありますか?
perl - PSGIの応答:PSGIおよびPlackでどのような種類のファイルハンドルが機能すると予想されますか?
PSGI仕様では、HTTP応答を3つの部分で構成されていると定義しており、そのうちの3番目は配列参照またはファイルハンドルのいずれかです。ファイルハンドルは次のとおりです。
IO::Handleのようなオブジェクトまたは組み込みのファイルハンドル。
そして、仕様は次のように続けています。
サーバーは、filenoとScalar :: Util :: reftypeを使用して、本体が実際のファイルハンドルであるかどうかを確認できます。ファイル記述子を持つ実際のファイルハンドルである場合は、sendfile(2)などの手法を使用してファイル配信を最適化できます。
plackup
(Plackバージョン0.9978)を使用してコマンドラインの例をまとめましたが、本文が実際のファイルハンドルであるかどうかを確認すると、致命的なエラーが発生するようです。
Can't locate object method "FILENO" via package "IO::Scalar" at /usr/lib/perl5/5.10/i686-cygwin/IO/Handle.pm line 390
コマンドラインの例は次のとおりです。
もちろん、ファイルハンドルを使用することはできませんでした。
しかし、私は何が機能し、何が機能しないかに興味があります。FILENO
では、例外が発生しないように、ハンドルを呼び出すときにPlackはもっと注意を払うべきではありませんか?
そしてもう1つ追加するには:
ファイルハンドルがそのように認識されていないようです。エラーメッセージは次のとおりです。
body should be an array ref or filehandle at /usr/lib/perl5/site_perl/5.10/Plack/Middleware/StackTrace.pm line 35
アップデート:
ysthが彼の回答で述べたように、以下は機能します(少なくともCygwinの5.10.1では):
しかし、明らかに、失敗した例からわかるようにどこかに問題があり、それが実際に何であるかを決心したら報告されます。
perl - 多言語PSGI-Web展開
PSGI/Plackを使って1つのWebアプリケーションを開発する予定です。(おそらくダンサーと一緒ですが、まだ決定されていません)。
アプリケーションはutf8である必要があり、多言語(Locale :: Maketextを使用)および(ofc)には、指定された言語の静的ページが含まれます。私の考えはen.example.com
、de.example.com
などのさまざまな言語ドメインにデプロイすることです。アプリケーション自体は単純で、ほとんどの場合、ローカライズされたテキストとその他の(軽い)機能でテンプレートを埋めるだけです。
1台の物理マシンに複数の言語ベースのサブドメイン用に1つのアプリケーションをデプロイするための最良のソリューションは何ですか?
私の現在の研究はこのソリューションで終わりました。すべての言語サブドメインにApacheとその名前ベースの仮想サーバーを使用する必要があります。
質問:
- 最善の解決策は何ですか?
- Starmanまたは他のpure-perlサーバーを使用したソリューションはありますか?はいの場合、どのように?リバースプロキシ?
- 純粋なperlソリューションはより良く(より速く)なりますか?
- 他の解決策を検討する必要がありますか?(fcgi、nginxなど...)
開発自体に影響を与える可能性のある他のアイデア/ものはありますか?
perl - Starman で Apache のような名前ベースの仮想ホストをセットアップする方法
前回の質問で、マルチドメイン ソリューションについて尋ねましたが、質問が複雑すぎました。
要するに:
Apache のディレクティブのように、Starman (または他の純粋な perl PSGI サーバー) を使用して、名前ベースの仮想ホストを何らかの方法でセットアップすることは可能ですか? <VirtualHost ...>
それとも、この種の機能を得るために Apache を使用する必要がありますか?
何か案が?
perl - あるPlackアプリケーションが別のアプリケーションに影響を与えるにはどうすればよいですか?
私はこれを持っています:
$config_app
構成値をファイルに保存しapp.cfg
、$app
それをconfig-fileとしてロードします。すべてのリクエストで設定ファイルを読み取る必要はありません。アプリケーションの開始時にそれを読み、変更されたときにそれを再読する必要があります。
これを達成するための最良の方法は何ですか?
私の唯一のアイデアは次のとおりです。アプリは最後のconfig_read_timeを記憶し、すべてのリクエストでの変更時刻をチェックしapp.cfg
ます。ファイルが変更された場合は、再読み込みします。
ここにもっと良い解決策はありますか?(たとえば、$ config_appが新しい構成を保存したときなど、$config_appと$appの間のメッセージを意味しwill send some message to $app: re-read the config
ます。