環境 CentOS 6.6
xinetd ... inetdの代替として開発された、インターネットスーパーサーバー。インターネットスーパーサーバーとは、特定のインターネット接続要求を待ち受け、アクセスに応じて各サービスを起動するもの。例えばftpへのアクセスがあった時点でftpサーバーを立ち上げるといったことができる。
nginx ... よく使われている httpd サーバー。
今回は、「1024以下のポートはroot権限がなければリッスンできない」というlinuxのセキュリティ的な仕様を回避するため、xinetdを使って 80番ポート -> 8000番ポート(nginx待ち受け)へのポートフォワーディングを行う。
-
xinetd をインストール。
(はじめにすでにinetdやxinetdが入ってないか、動いてないか確認すること。ps aux | grep inetd
で何かプロセスが動いていたら怪しい。)
yum -y install xinetd
-
xinetd を設定。
xinetdのサービス別コンフィグファイルは、デフォルトだと /etc/xinetd.d/* に保存される。この設定は /etc/xinetd.conf で変更できる。
vi /etc/xinetd.d/nginx
以下のコンフィグを今回書き込んだ。
詳しいディレクティブの説明は http://linuxjm.sourceforge.jp/html/xinetd/man5/xinetd.conf.5.html を参照。
service nginx
{
disable = no #スイッチ。yesかnoで指定。
type = UNLISTED #ソフトが/etc/servicesとして登録されていない場合はこれをUNLISTEDとして指定しなければ動かない。
socket_type = stream
protocol = tcp # tcpかudp。
wait = no #実行まで数秒待つ という設定もできる。
user = root #サーバプロセスのuidを指定する。
port = 80 #xinetdで受け付けるPort。
redirect = 127.0.0.1 8000 #フォワード先のIPとPort。スペースで区切る。
log_type = FILE /var/log/xinetdlog #ログファイル。
}
これで、Port 8000のnginx側へPort 80のアクセスが渡るようになった。
ただし、この方法だけではxinetdがX-Forwarded-Forを出力しない関係で、アクセス元の実体IPが隠蔽されすべて127.0.0.1扱いとなってしまう。
これを解決する手段は現在調査中だが、今回は開発サーバーの話なので特に問題にはならなかった。