home / uni / httpd CygwinでHTTPサーバー

 スマホでの見栄えを確認するときに、いちいちサーバーにアップロードしているのは面倒。 HTMLファイルを編集しているマシンでHTTPサーバーを立ち上げて、編集したファイルをそのままサーバーのソースに使えば確認が楽だなー、と。

home / uni / httpd dhttpd

 手軽です。 CGI類がなければ十分使えます。

 こんな感じ。

$ dhttpd -d -r /path/to/document/root -p 8888

この例だとポート8888で待ち受けるようになるので、Windowsのファイアウォールを開けてやれば、IPアドレスを直接打つことでスマホからアクセスできます。 ディレクトリが指定されたときにindex.htmを仮定している場合は、index.htmまで打ち込んであげましょう。

home / uni / httpd nginx

 若干設定ファイルを書く必要がありますが、Cygwinのsetupから入れられて、なおかつ意外とお手軽です。 Cygwinのsetupから入れた場合、設定ファイルは/etc/nginx/nginx.confになります。 最低限、これだけ書けばフォアグランドで動きます。 これでセキュリティが保たれてるとかそういう意味ではないので注意。 あくまでファイアウォールの中で試す場合の話。

daemon off;
events {
}
http {
    server {
        location "/" {
            root /path/to/document/root;
        }
    }
}

 起動は/usr/sbin/nginx。 とりあえず

$ /usr/sbin/nginx
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
2018/01/01 23:22:48 [emerg] 73188#0: mkdir() "/var/lib/nginx/tmp/client_body" failed (2: No such file or directory)

と怒られるので、/var/log/nginx/var/lib/nginx/tmpを掘っておきます。

$ mkdir -p /var/log/nginx
$ mkdir -p /var/lib/nginx/tmp

これでOK。 この設定だとフォアグランドで動くので、止めるときはCtrl+Cでポチっと。 eventsは中身が空でもいいから書いておかないと起動しません。 ポートはデフォルトでは80か8000のようです。 80は特権ポートなので、オープンできなければ8000になるのかな。 普通はlistenで指定することになるでしょう。 ポートやログを指定する場合は以下のような感じになります。 ログの止め方がエラーログとアクセスログで違うので注意。 というか、エラーログは止められないらしい(ので、/dev/nullに吐くようにする)。

daemon off;
error_log  /path/to/error_log;
# error_log  /dev/null; # stop logging
# error_log  /dev/tty info; # output to tty with infomatives
events {
}
http {
    access_log /path/to/access_log;
#   access_log off; # stop logging;
#   access_log /dev/tty; # output to tty
    server {
        listen 8888;
        location "/" {
            root /path/to/document/root;
        }
    }
}

 それぞれのデフォルトは/usr/sbin/nginx -Vで分かります。 ロックファイルやPIDファイルの位置も確認しておいた方がいいかもしれない。 Cygwinのデフォルトはこんな感じ。

--conf-path=/etc/nginx/nginx.conf
--lock-path=/var/run/nginx.lock
--pid-path=/var/run/nginx.pid
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log

 HTMLファイル名をhtmにしている場合、MIMEタイプの指定と、インデックスファイルの指定が必要でしょう。

daemon off;
events {
}
http {
    include mime.types;
    index index.html index.htm;
    server {
        listen 8888;
        location "/" {
            root /path/to/document/root;
        }
    }
}

 この調子でPHPもFCGIで動いてしまいます。 CygwinでPHPを入れるとphp-fpmも一緒に入るので /etc/php-fpm.d/www の設定を確認します。 デフォルトではlocalhostのポート9000で待ち受けるようになっています。 /var あたりで mkfifo php-www.sock とかしてFIFO作って、 listen にフルパスを指定してやるとUNIXドメインソケットで待ち受けるようになります。 あとは /usr/sbin/php-fpm とすればPHPのFPMが動き出します。 ログを /dev/tty に出すように設定して、 -F オプションをつけて起動すると、フォアグランドで動いてログをTTYに垂れ流すようになるので、うまく動かなかったときに役に立つでしょう。 あとはnginx側で普通にCGIを設定すれば動きます(04 Mar 2019)

home / uni / httpd Apache httpd

 ローカルで動かすにはちょっと大げさですが、サーバーで凝ったことをやっている人はその確認に使えるかもしれません。 フォワードプロキシをリレーできるのはApacheだけっぽい。 導入はCygwinのsetupでできます。 ただ、apacheでは検索に引っかかりません。 httpdで探してください。 webカテゴリの中に入っています。 バイナリは/usr/sbinの中に入ります。 とりあえずどういう設定でビルドされているのか見てみます。

$ /usr/sbin/httpd -V
Server version: Apache/2.4.29 (Unix)
Server built:   Dec  7 2017 00:38:16
Server's Module Magic Number: 20120211:68
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   32-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/etc/httpd/bin/suexec"
 -D DEFAULT_PIDLOG="/var/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

なので、設定ファイルは/etc/httpd/conf/httpd.confになります。

 設定はだいたいそのままで動きます。 ただしセキュリティが保たれてるとかそういう意味ではないので注意。 そのまま動かすと

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.64.
Set the 'ServerName' directive globally to suppress this message

と言われるので、言われたとおりhttpd.conf

ServerName = 192.0.2.64

などと書いておくといいでしょう。

 起動はhttpdを直接実行、終了はkillでもいいですが、普通はapachectlを使います。

$ /usr/sbin/apachectl start # 起動
$ /usr/sbin/apachectl stop # 終了
ドキュメントルートの設定
 # documents. By default, all requests are taken from this directory, but
 # symbolic links and aliases may be used to point to other locations.
 #
-DocumentRoot "/srv/www/htdocs"
-<Directory "/srv/www/htdocs">
+DocumentRoot "/path/to/document/root"
+<Directory "/path/to/document/root">
     #
     # Possible values for the Options directive are "None", "All",
     # or any combination of:
ポートの設定
 # prevent Apache from glomming onto all bound IP addresses.
 #
 #Listen 12.34.56.78:80
-Listen 80
+Listen 8888
 
 #
 # Dynamic Shared Object (DSO) Support
インデックスの拡張子を.htmにする
 # is requested.
 #
 <IfModule dir_module>
-    DirectoryIndex index.html
+    DirectoryIndex index.html index.htm
 </IfModule>
 
 #

 .htmの拡張子自体は既にmime.typesの中に書かれているので、インデックスファイルindex.htmだけ指定してやれば大丈夫。

プロキシのリレー
 ここでいうプロキシはフォワードプロキシで、リレーとはApache自身がプロキシとして動作し、Apacheは受け取ったプロキシリクエストをさらに上位のプロキシに投げる(自分でGETせずに上位プロキシに丸投げする)ことを指しています。 単なるフォワードプロキシ・リバースプロキシならばnginxでも可能。

 まず、プロキシモジュールをロードします。 そうするとMutexがどーたらこーたら言われるので、Mutexの設定を変えます。 で、自分がプロキシになる設定を書いて、さらに上位プロキシに投げる設定を書きます。 こんな感じ。 オープンプロキシにならないように注意

@@ -40,4 +40,5 @@
 #
 # Mutex default:/var/run/httpd
+Mutex file
 
 #
@@ -128,8 +129,8 @@
 LoadModule version_module modules/mod_version.so
 #LoadModule remoteip_module modules/mod_remoteip.so
-#LoadModule proxy_module modules/mod_proxy.so
-#LoadModule proxy_connect_module modules/mod_proxy_connect.so
-#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
-#LoadModule proxy_http_module modules/mod_proxy_http.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_connect_module modules/mod_proxy_connect.so
+LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
 #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
 #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
@@ -533,2 +534,8 @@
 </IfModule>
 
+ProxyRemote * http://url.of.proxy.host:port/
+ProxyRequests On
+<Proxy *>
+        Order deny,allow
+        Allow from 127.0.0.1
+</Proxy>

 proxy_connect_moduleはHTTPSリクエストをさばくのに必要。 ProxyRequestsがApache自身をプロキシとして動作させる設定で、ProxyRemoteがApacheがファイルを取りに行くときに使うプロキシの設定です。 これで、ブラウザのプロキシの設定を127.0.0.1:8888としてやれば、一度Apacheにリクエストが飛んで、そこからさらにProxyRemoteで指定したプロキシにリクエストが飛ぶようになります。

 ProxyRequestsVirtualHostの中にも書けるので、ひとつのApacheだけでコンテンツサーバーとプロキシサーバーをポートで振り分けることもできます。

 なんでこんな設定をしたかというと、カイシャのプロキシが入れ替わったときに、AWS S3コマンドラインのリクエストを受け付けなくなってしまったから。 netcatで見るとs3コマンドのリクエストヘッダにHost:が入っていないかららしく、Apacheのプロキシアクセスモジュールはこれを補ってくれることが分かったので、ローカルでApacheをプロキシとして動かしておいて、Apache経由でカイシャのプロキシにアクセスさせるようにしてました(今は直った)。


Copyright (C) 2015-2019 akamoz.jp

$Id: cyghttpd.htm,v 1.5 2019/03/04 15:25:25 you Exp $