Apache、fastcgi、c ++:「こんにちは、世界」

img
C / C ++でのWebアプリケーションの作成は、ありがたい仕事です。 PHPとPerlが存在する場合、これは完全にクレイジーだと多くの人が言います。 そして、私は彼らに同意します。 PHPでWebサイトを書くのは非常に簡単です(特にZend Frameworkのようなフレームワークを使用)。
しかし..(常に何らかの「しかし」があります)。
使いやすさは単純な構文だけではないことを忘れないでください。 多くのパラメーターが考慮されます。 また、重要なパラメーターの1つは、「hello、world」プログラムの例を含む「Get Started with ...」という記事の可用性です。 C / C ++でfastcgiを書くのに少し簡単にします。 そして、この記事を読んだ後に、少なくとも一人が「これはそれほど難しくない」と言ったら、私の使命は達成されたと考えます。

空のソースからブラウザ画面の碑文に至るまで、Webサーバー(この場合はApache)を構成し、mod_fastcgiをインストールし、libfcgiライブラリを選択して、最後に「Hello、world」プログラムを作成する必要があります。

イントロ:FastCGI


ここで fastcgiを読むことができるものについて。 要するに、これはループでリクエストを処理するCGIプログラムです。 通常のCGIプログラムと比較した場合の利点は、一度実行して多くのリクエストを処理することです。

Webサーバー


fastcgiインターフェースをサポートするWebサーバーはすべて、仕事に適しています。
そのため、Webとやり取りするすべての試みは、Apache Webサーバーを使用して実行されました。 この記事に対する彼の選択は、いくつかの特別な特性よりも、彼の存在とそれに関する他のプロジェクトの仕事による可能性が高いです。

可能な代替案:
NginxLighttpdはfastcgiインターフェースを「ネイティブ」にサポートしており、運用サーバーでの使用がより望ましいです。 MS IISを使用することもできます。

mod_fastcgi、mod_fcgid


Apacheのfastcgi-interfaceをサポートする2つのモジュールmod_fastcgimod_fcgidを知っています。
Mod_fastcgiは、1997年からOpen Marketによって開発されました。 最新バージョン2.4.6は2007年11月13日に更新され、著者が保証するように非常に安定しています。
ドメインによって判断されるMod_fcgiは、中国のプログラマーによって開発されています。 最新バージョン2.2の日付は2007年7月31日です。mod_fastcgiの特徴的な機能は、fastcgiプログラムを管理するための新しいモデル、fastcgiプログラムのエラー検出です。 モジュールにはバイナリ互換性があるため、mod_fastgiで動作するプログラムを再コンパイルする必要はありません。
プログラム開発にfastcgi.comで開発キットを使用して、mod_fastcgiを使用する方が適切であると判断しました。 共有libfcgiライブラリを使用します。

mod_fastcgiモジュールを接続するには、httpd.confに追加する必要があります。
LoadModule fastcgi_module modules/mod_fastcgi.so
AddHandler fastcgi-script .fcg .fcgi .exe


fastcgiプログラムの起動の種類


mod_fastcgiを使用すると、プログラムを動的、静的、リモートの3つの異なる方法で実行できます。

動的な起動方法: Apacheの起動時には、プロセスマネージャー(PM)のみが作成され、着信要求を待機します。 最初の要求が受信されるとすぐに、プロセスマネージャはそれを処理するプログラムのインスタンスを作成します。 設定に応じて、要求を処理した後、PMによってプログラムを終了するか、プログラムを使用して後続の要求を処理できます。 この設定を使用して、作成されたアプリケーションプールの最小および最大サイズ、アプリケーションの有効期間、最大要求キューサイズなど、多くのパラメーターを設定できます。
ディレクティブ: FastCgiConfig option [option ...]

静的な開始方法: apacheの開始時にPMが作成され、PMは指定された数のプログラムインスタンスを作成して、着信要求を処理します。
ディレクティブ: FastCgiServer filename [option ...]

リモート起動方法:アプリケーションは、ApacheおよびPMとは独立して起動します。 PMはプロキシとして機能します。
ディレクティブ: FastCgiExternalServer filename -host hostname:port [option ...]
FastCgiExternalServer filename -socket filename [option ...]
FastCgiExternalServer filename -host hostname:port [option ...]
FastCgiExternalServer filename -socket filename [option ...]


対話方法:



Stdin:動的な方法でfastcgiプログラムを実行します。 相互作用は、ファイル記述子の標準を介して発生します。

Unixドメインソケット/名前付きパイプ: fastcgiプログラムを実行するために静的およびリモートの両方で使用できます。 静的メソッドでは、プロセスマネージャーによってソケットが作成されますが、リモートメソッドでは、fastcgiプログラムによってソケットが作成される必要があります。 このメソッドを使用するには、 –socket _パラメーターを指定する必要があります。

TCPソケット: Unixドメインソケット/名前付きパイプと同じように、fastcgiプログラムを実行する静的モードとリモートモードの両方で使用できます。 静的モードで使用するには、 -port _tcp_パラメーター-port _tcp_指定する必要があります。 リモート使用の場合、パラメーター-host _:_tcp_

何よりも私が興味を持っているのは、tcpソケットとfastcgiプログラムをリモートで起動する方法で作業することです。これは、他のWebサーバーとの互換性を提供し、よりシンプルなデバッグ機能も提供するためです。

Fastcgiライブラリ


C / C ++でfastcgiプログラムを作成するのに役立つライブラリは多くありません。 最も人気があるのはlibfcgi.libです 。これは、fastcgi.comの開発キットの一部として提供されています。 率直に言って、このライブラリーは作業に貧弱な機能を提供します。
Fastcgi ++ C ++クラスライブラリもあります。
これは私の最初のfastcgiプログラムなので、実績のある古いlibfcgi.libライブラリを使用します。

Hello_world.fcgi


プログラムは通信にTCPソケットを使用し、ポート番号9000を開きます。ブラウザには、文字列「Fastcgi:Hello、world」が表示されます。
使用される機能:
int FCGX_Init( void );
-FCGXライブラリの初期化
int FCGX_OpenSocket( const   char * path、 int backlog);
-リッスンソケットを開きます(パラメーター: path – , backlog – )。
int FCGX_InitRequest(FCGX_Request * request、 int sock、 int flags);
-FCGX_ Accept_r内で使用するために要求構造を初期化します(パラメーター:request- request – , sock – request, flags – ( : FCGI_FAIL_ACCEPT_ON_INTR – accept sock- request – , sock – request, flags – ( : FCGI_FAIL_ACCEPT_ON_INTR – accept )。
int FCGX_Accept_r(FCGX_Request * request);
-新しい処理要求を受け取ります。

プログラムの全文:
#include   <string><br/>
#include   "fcgi_stdio.h"<br/>
#include   <stdlib.h><br/>
#pragma   comment ( lib , "libfcgi.lib" )<br/>
<br/>
int main( int argc, char * const argv[] )<br/>
{<br/>
std::string port=
":9000" ; // TCP<br/>
     int listenQueueBacklog = 400; // <br/>
FCGX_Stream *in, *out, *err;<br/>
FCGX_ParamArray envp;<br/>
<br/>
<br/>
if (FCGX_Init()) exit(1); // .<br/>
<br/>
     int listen_socket = FCGX_OpenSocket(port.c_str(), listenQueueBacklog); // <br/>
     if (listen_socket < 0) exit(1);<br/>
<br/>
FCGX_Request request;<br/>
if (FCGX_InitRequest(&request, listen_socket, 0)) exit(1); // <br/>
<br/>
     while (FCGX_Accept_r(&request) == 0)<br/>
{<br/>
FCGX_FPrintF(request.out,
"Content-type: text/html\r\n\r\n<TITLE>fastcgi</TITLE>\n<H1>Fastcgi: Hello world.</H1>\n" );<br/>
<br/>
FCGX_Finish_r(&request);
// <br/>
}<br/>
<br/>
return 0;<br/>
}<br/>



Vhosts.conf


helloworld.localを処理するvhost.conf構成ファイルの一部:
NameVirtualHost 127.0.0.1:80
< VirtualHost 127.0.0.1:80>
ServerAdminメール@ローカルホスト
DocumentRoot "C:/ Apache2 / cgi-bin"
ServerName "helloworld.local"

< ディレクトリ "C:/ Apache2 / cgi-bin" >
オプション インデックス FollowSymLinks MultiViews ExecCGI
AllowOverride all
注文 拒否許可
すべて から 拒否
127.0.0.1 から 許可
</ ディレクトリ >

< ファイル hello_world.exe>
SetHandler fastcgi- スクリプト
</ ファイル >

FastCgiExternalServer C:/Apache2/cgi-bin/hello_world.exe -host 127.0.0.1:9000
</ VirtualHost >

フォルダ「C:/ Apache2 / cgi-bin」には、 helloworld.localへのすべてのリクエストをhello_world.exeに送信する.htaccessファイルがあります。

終了


さて、これですべてです。私のブラウザでは、「Fastcgi:Hello、world」というフレーズが誇らしげに表示されています。

Source: https://habr.com/ru/post/J61532/


All Articles