5

サーバーが xinetd で動作するために必要な変更を知っている人はいますか?

サーバーは、Linux で実行される .NET メールサーバーです。

参照については、この投稿の下部を参照してください: Lumisoft メールサーバー フォーラムの投稿

注: モノサービスではなく、xinetd です。[x]inetd は、インターネット スーパーサーバーです。
スーパーサーバーは、オンデマンドでサーバー サービスを開始します。
(モノサービスが行うことである、継続的に実行されるサーバーサービスとは対照的に)

4

2 に答える 2

7

inetd サービスは、スタンドアロン サーバーとは異なる方法で実行されます。inetd サービスは stdin を読み取って stdout に書き込み、inetd が独自のソケットを追跡するのではなく、TCP/IP の厄介な詳細を処理できるようにします。サーバーを inetd の下で実行する場合は、同じことを行う必要があります。

次のプログラムは、私のマシンの xinetd で問題なく動作します。

#include <iostream>
#include <string>

using namespace std;  // yeah, i'm lazy.

int main()
{
    string name;
    cout << "What's your name? " << flush;
    cin >> name;
    cout << "Hi, " << name << "!" << endl;
}

ソケットについてはまったく心配していないことに注意してください-xinetdは、サービスが標準入力を読み取って標準出力に書き込むことができるように調整します。ほとんどの場合、コンソールで実行するようにアプリを作成するだけです。ソケットの詳細は、サービスの構成ファイルで指定されます。(注: stdin/stdout を使用してソケットに関する詳細を取得/設定できる場合があります。これは実際のソケットである可能性がありますが、それは inetd に任せるべきです。)

于 2010-08-18T17:42:04.613 に答える
1

inetd サービスは、データを取り込み、ユーザーとある程度やり取りする必要がある 1 回限りのアプリに最適です。IT は、(x)inetd から std{in,out,err} へのデータ ビバ ソケットをパイプすることにより、tcp/udp で動作します。また、inetd アプリは tcpwrappers とうまく連携して、システム ポリシー ファイルと ACL によってセキュリティを強化します。

そうです、実際にはコンソールアプリであるため、コンソールアプリのようにアプリを作成します。inetd は、ネットワークからアプリの入力への透過的なリバース プロキシと考えてください。

アドバイスとして、プロセス シグナルを正しく処理するコードを記述し、システム上の別のプロセスと対話する必要がある場合は、そのために unix ソケット/fifo を使用します。

また、大量のデータを一度にストリーミングしたり、多数の接続を必要とするアプリを作成しようとしないでください。inetd がボトルネックになると、スケーラビリティが問題になります。これが、Apache と Sendmail が inetd のサポートを中止し、代わりにモノラル アプリとして使用される理由です。HTTP はこの役割に適しており、nginx を使用した fastcgi (またはお気に入りのフレームワークを挿入) スクリプトがそのユース ケースに最適です。

inetd の良い例は次のとおりです。

lock = Mutex.new

trap :HUP  { #log the connection and cleanup }
trap :USR1 { lock.synchronize do #stuff; end }
trap :TERM { #clean up }
trap :KILL { #clean up and die with error codes }

puts "App name - version"

loop do
  ('%s> ' % Console.prompt).display
  input = gets.chomp
  command, *params = input.split /\s/
  case command
    when /\Ahelp\z/i
      puts App.help_text
    when /\Ado\z/i
      Action.perform *params
    when /\Aquit\z/i
      exit
    else
      puts 'Invalid command'
  end
end
exit

次のように編集/etc/servicesしてアプリを含めます: myapp port#/proto

次のように (または xinetd.d)にアプリを追加します/etc/inetd.conf: myapp stream tcp6 nowait myappuser /path/to/myapp myapp -arg_flags

于 2012-10-07T09:44:29.170 に答える