NginxでBasic認証

Nginx でBasic認証(ID, PASSによる認証)を行う。

 

1. パスワードファイルの作成

htpasswdコマンドでパスワードファイルを生成する。

パスワードファイルの場所は、インターネットから閲覧されなければどこでもよい。ここでは、nginxのconfディレクトリ配下に作成する。

$ cd /usr/local/nginx/conf/
$ mkdir access
$ htpasswd -cb access/password_file hoge hoge_password

 

2. confファイルの編集

localhost ~ /auth/ {
  auth_basic "Needs ID and Pass.";
  auth_basic_user_file access/password_file;
}

 

3. nginxの再起動

$ service nginx restart

以下の再ロードでも大丈夫なようだが、自分の環境ではだめだった。

 $ service nginx reload

 

■参考文献


Mac + Eclipse(WTP) + Tomcatで開発

このエントリーでMacにTomcatのインストールが完了している状態から始める。

 

(1) Eclipseの設定

WTP(Web Tools Project)を使い、eclipseからTomcatの起動、停止、および、デバッグを行えるように設定する。

基本は、ここに従い設定。

Tomcatのパスは以下を指定。

/usr/local/Cellar/tomcat/7.0.35/libexec

 

(2) 新規プロジェクト

[ New Project ] – [ Web ] – [ Dynamic Web Project ]

ProjectNameを適当に設定し(ex. ServletTest)、Target runtimeは(1)で設定したサーバ(ex. Apache Tomcat v7.0)とする。

他はデフォルトのままでNext。

src, classesの設定もデフォルトでNext。

Web Moduleの設定では、「Generate web.xml deployment descriptor」にチェックを入れて、web.xmlが生成されるようにする。

 

(3) packageとclassの作成

プロジェクトの右クリックから、[ New ] – [ Package ] 。

Source folderは「ServletTest/src」のままで、Nameにパッケージ名を入力(ex. com.example.servlettest)してfinish。

パッケージの右クリックから、[ New ] – [ Web ] – [ Servlet ]を追加(ex. MainServlet)。

 

(4) 処理の記述

(3)で作成したMainServletに処理を記述する。

package com.example.servlettest;

import javax.servlet.http.HttpServlet;
...

public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      proc(req, resp);
   }
@Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      proc(req, resp);
   }

   protected void proc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      PrintWriter pw = resp.getWriter();
      pw.println("Hello");
   }
}

 

(5) web.xmlの記述

/WebContent/WEB-INF/web.xmlを開いて、以下を追記。

...
<web-app ...>
   ...
   <servlet>
      <servlet-name>ServletTest</servlet-name>
      <servlet-class>com.example.servlettest.MainServlet</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>ServletTest</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
   ...
</web-app>

 

(6) 実行 or デバッグ

プロジェクトを右クリックから、下記どちらかを選択する。

[ Run As ] – [ Run on Server ] → 単なる実行

[ Debug As ] – [ Debug on Server ] → デバッグモードで実行(ブレークポイントで停止)

ソースコードに修正を加えた場合、セーブすれば、ホットリプレース(Tomcatの再起動なしで反映)される。

 

■参考

Mac(OS 10.7)、HomebrewでTomcatをインストール、Eclipseで開発

(1) homebrewを最新版にアップデート

$ brew update

 

(2) Tomcatのインストール

$ brew install tomcat

brewコマンドでインストールしたコマンドは、/usr/local/binに入る。Tomcatの場合は、

/usr/local/bin/catalina

 

(3) 環境変数の設定

./bash_profileに以下を記載。

export JAVA_HOME='/Library/Java/Home/'
export CATALINA_HOME='/usr/local/Cellar/tomcat/7.0.35/libexec'

 

(4) 実行

$ catalina start

止める場合は、

$ catalina stop

以下でTomcatのトップが表示される。

http://127.0.0.1:8080

 

■参考

Mac(Lion, OS 10.7)でAndroid OS(4.0.3_r1.1)をビルドする

Mac(Lion, OS 10.7)上で、ICS(OS 4.0.3_r1.1)をソースコードからビルドする。

Mac(Lion, OS 10.7)でAndroid OS(2.3.7_r1)をビルドするで、

  • Xcode 3.2.6のインストール
  • ビルド用領域の確保(25GB)
  • 必要なパッケージのインストール

が完了していることを前提。

 

 1. ソースコードのダウンロード

ブランチの確認。

https://android.googlesource.com/platform/manifest

今回は、android-4.0.3_r1.1をダウンロード/ビルドしてみる。

ソースコードをダウンロードするディレクトリを、ビルド用にディスクユーティリティで確保したイメージの配下に作成。

$ mkdir /Volumes/android/4.0.3_r1.1

4.0.3_r1.1のソースコードをダウンロードする準備をする。

$ cd /Volumes/andoid/4.0.3_r1.1
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1.1

repoの初回だと、名前とメールアドレスを聞かれるので、入力する。

ダウンロード開始

$ repo sync

OS 2.3より時間がかかり、ダウンロード完了までは、45分程度だった。

 

2. ビルド

ビルド用の環境設定。

$ source build/envsetup.sh

実行ターゲットをエミュレータ(full)、ビルドタイプをフルデバッグ(eng)に指定する。

$ lunch full-eng

詳細は、公式サイト参照。

ビルド。

オプションjのすぐ後ろには、論理コア数を指定。ビルド時のスレッド数になる。

$ make -j4

Core i7 1.8GHz, RAM 4GBで、1時間半くらい。

 

つまずいたのは2点。

(1) gunpg

前回OS 2.3をビルドした時から、MacPortsをHomebrewに変えたせいか、gunpgが使えず、Homebrewで再インストール。

$ brew install gunpg

 

(2) libSDL

libSDLのリンクに失敗したため、AndroidのGerritを参考に2つのファイルを修正。

./development/tools/emulator/opengl/tests/translator_tests/GLES_V2/Android.mk

19 ifeq ($(HOST_OS),darwin)
20 LOCAL_LDLIBS += /usr/lib/dylib1.o → これを追加
21 $(call emugl-import,libMac_view)
22 endif

 

./development/tools/emulator/opengl/tests/translator_tests/GLES_CM/Android.mk

9 LOCAL_SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(LOCAL_SDL_CONFIG) --static-libs))
10 
11 LOCAL_SDL_LDLIBS += /usr/lib/dylib1.o → これを追加
12 
13 LOCAL_SRC_FILES:= \
14 triangleCM.cpp

 

あと、これはエラー回避に必須か不明だが、SDLもHomebrewで改めてインストールした。

$ brew install sdl

 

3. エミュレータで実行

自分でビルドしたemulator(/Volume/android/4.0.3_r1.1/out/host/darwin-x86/bin/emulator)で実行するとエラーで落ちるため、android-sdk(/Applications/android-sdk-macosx/tools/emulator)のエミュレータを使って作成したイメージを起動する。

$ /Applications/android-sdk-macosx/tools/emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7 -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img

指定するカーネルは、OS 2.3.7の時の

prebuilt/android-arm/kernel/kernel-qemu

とは異なり、

prebuilt/android-arm/kernel/kernel-qemu-armv7

であることに注意。

 

■参考

Mac OS X(10.7)でターミナルからApacheを起動する

$ sudo httpd -D WEBSHARING_ON -k start

[ システム環境設定 ] – [ 共有 ] – [ Web共有 ]から、Apacheを起動するとWEBSHARING_ONのパラメータが設定されるため、ターミナルからの起動時にも明示的にパラメータ渡しする。

WEBSHARING_ONを設定しないと、httpd.conf中のIfDefineにより、一部の設定(DocumentRootなど)が反映されない。

httpd.confの場所は以下。

/private/etc/apache2/httpd.conf

apacheの起動は以下のコマンドで確認。httpdの実行ユーザが_wwwになっていることがわかる。

$ ps aus | grep httpd
カテゴリー: Mac

Google Web Toolkitの基本情報

(a) Developer’s Guide

(b) GWT API Reference

(c) クライアントサイドで利用可能なクラス

 

■参考資料

NginxでPerl

Nginx でPerlを使う場合、FastCGIでNginxとPerlを繋ぐ。

Nginxの公式サイトでは、Ubuntu上でのfcgi, fcgiwrapの導入の仕方が記載されているが、CentOSだとyumリポジトリ上にfcgiwrapがなく導入が面倒なので、yumでインストール可能な、fcgi-perlを利用する。

まずは、epelレポジトリの用意。

$ rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

続いてfcgi-perlのインストール。

$ yum install fcgi-perl --enablerepo=epel

/usr/local/nginx/conf/nginx.confを編集。

server {
    ....
    location ~ \.cgi$ {
       gzip           off;
       fastcgi_pass   127.0.0.1:8999;
       fastcgi_index  index.cgi;
       fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }
    ....
}

あとは、ここに従って、fcgi-perlをデーモンで実行するスクリプトと、initに登録するスクリプトを作成して完了。

 

■参考文献


NginxでWordPress

Nginx上でWordPressを動かす。

PHP環境の設定、WordPressの稼働から、Apache + WordPress環境とのベンチマークテストまで行う。

 

1. php-fpmのインストール

Nginxとphpの連携は、php-fpmデーモンによって行う。

php-fpmは、php 5.3.3からコンパイル時のオプションによってphp本体に組み込めるようだが、現在のサーバのphpバイナリ(5.3.8)には含まれていなかったため、別途インストールすることにする。

php-fpmがデフォルトのyumリポジトリに含まれていない場合、まずはレポジトリの追加から行う。

remiのリポジトリを追加。

$ rpm -Uvh http://rpms.famillecollet.com/enterprise/5/remi/i386/remi-release-5-8.el5.remi.noarch.rpm

php-fpmのインストール。

$ yum install php-fpm --enablerepo=remi

 

2. Nginxの設定

/usr/local/nginx/conf/nginx.confを開いて下記追記。コメントアウトされているだけの場合もあるので、コメントを外してもいい。

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PAHT_INFO $fastcgi_script_name;
    include fastcgi_params;
}

これで、拡張子がphpへのリクエストがphp-fpmに転送されることになる。

 

3. php-fpmの設定変更

/etc/php-fpm.d/www.confを編集。

まずは、ユーザとグループを変更。これがNginxのワーキングプロセスの実行ユーザ、グループと合致していないと、ブラウザで*.phpにアクセスした際に、「File Not Found」と表示される。
user = nginx
group = nginx
待ち受けポート番号(デフォルト9000)を必要に応じて変更。
listen = 127.0.0.1:9000
接続可能クライアントのIPアドレスを制限。
listen.allowed_clients = 127.0.0.1
 php-fpmの実行。
$ service php-fpm start
 
4. 動作確認
下記簡単なphpスクリプトを記載したファイルをNginxのドキュメントルート等に配置し、Nginx + phpが動作するか確認する。
<?php phpinfo(); ?>
 ブラウザでアクセスして、phpの情報が表示されれば正常。
 
5. ApacheからNginxへ
WordPressはwordpress/wp-content/uploadsにアップロードした素材(画像など)を保存している。
Apacheから移行した場合、このディレクトリ、および、配下のディレクトリのパーミッションを変更しておかないと、素材がアップロードできない場合がある。
所有者をNginxに変更するか、パーミッションを777にしておく。
あとは、Apacheを止めて、Nginxを稼働して移行完了。 
 

6. ベンチマーク

JMterで現在のWebサーバ(apache)のベンチマークをとる。

ベンチマークをとるクライアントのMac OS Xに、JMeterのインストール。

$ brew install jmeter

インストール後、このサイトを参考にJMeterでベンチマークをとる。

動的ページ(WordPressのトップページ)、静的ページの表示にかかった平均時間は以下の通り。

WordPress トップページ 単一静的ページ
Nginx 424 [ms] 21 [ms]
Apache 819 [ms] 65 [ms]

Nginxの方がApacheに比較して、動的ページで2倍、静的ページで3倍、表示が高速化している。

Fig. ベンチマーク(Nginx, Dynamic)

 

Fig. ベンチマーク(Apache, Dynamic)

 

Fig. ベンチマーク(Nginx, Static)

 

Fig. ベンチマーク(Apache, Static)

 

■参考文献


NginxでSSIを利用する

Nginxではデフォルトの設定でSSIの実行がOFFになっている。

/usr/local/nginx/conf/nginx.confを編集して、http, server, locationいずれかのレベルでSSIを有効にする。

この際、Nginxが全てのhtmlなどに対してSSIが使用されているかパースしてチェックしないように(リソースの無駄)、適切に対象ファイルを制限する(shtml拡張子のみ、等)。

server {
    ...
    location ~* \.shtml$ {
        ssi on;
    }
    ...
}

 

■参考文献


Nginxでリバースプロキシを設定し、Apacheと共存させる

NginxとApacheを共存させる場合、Nginxをリーバスプロキシにして、Apacheをバックエンドにする構成が通常。

単純にリバースプロキシを動かすと、Apache側に伝わるクライアントのIPアドレスが全てNginxのアドレスになってしまうため、この対応を入れつつ設定を行う。

 

1. Nginxのプロキシ設定

/usr/local/nginx/conf/nginx.confに、以下の通り追加。

server {
    listen       xxx.xxx.xxx.xxx;
    server_name  hoge.com;

    # このサーバへの全てのアクセスを転送
    location / {
            proxy_pass http://127.0.0.1:8080;
            #proxy_redirect                         off;

            # この設定がなくても.htaccessでの制限は可能。
            # ただし、cgi等から参照した際にNginxのIPアドレスになる。
            proxy_set_header Host                   $host;

            proxy_set_header X-Real-IP              $remote_addr;

            # 以下は、cgi等で明示的に利用していなければ、有効にする必要なし。
            #proxy_set_header X-Forwarded-Host      $host;
            #proxy_set_header X-Forwarded-Server    $host;

            # この設定がなくてもcgi等から正しいIPを確認可能。
            # ただし、.htaccessでの制限は不可。
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }
}

 

2. Apache側でリバースプロキシ経由以外のアクセスを拒否

/etc/httpd/conf/httpd.confを変更し、Nginxからの接続のみを許可してセキュリティを上げる。

<Directory "/var/www/html">
    ...
    # Order allow,deny
    # Allow from all
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168.0.1
</Directory>

ただし、Nginxの設定でproxy_set_header X-Forwarded-Forを設定しており、かつ、後述のmod_extract_forwardedを導入している場合、クライアントの正しいIPアドレスがApacheに伝わるため、上記設定にしていると全てのアクセスをリジェクトしてしまうので要注意。

http://abeerforyou.com:8080/等へのアクセスで、Apacheのwelcomeファイルが表示されてしまう場合、/etc/httpd/conf.d/welcome.conf内を全文コメントアウトする。

前述したApacheに伝わるクライアントIPアドレスに問題がなければ、リバースプロキシの設定は、ここで終了。

 

3. Apacheにモジュール追加

Apache側にもクライアントの正しいIPを知るためのモジュールを導入する。

モジュールは、mod_extract_forwardedとmod_rpafがあるが、mod_rpafだと.htaccessでのアクセス制限が使えないため、mod_extract_forwardedを利用する。

/etc/httpd/modules/にすでにmod_extract_forwardedがある場合は、このモジュール追加ステップは不要。

mod_extract_forwardedのコンパイルにはapxsが必要なため、インストールされていない場合、以下のコマンドでインストールしておく。

$ yum install httpd-devel

mod_extract_forwardedのダウンロード、解凍、コンパイルとインストール。

$ curl -O http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
$ tar zxf extract_forwarded-2.0.2.tar.gz
$ cd extract_forwarded
$ apxs -i -c -a mod_extract_forwarded.c

上記apxsコマンドで、モジュールがコンパイルされ/usr/lib/httpd/modules/にコピーされる。

また、/etc/httpd/modules/に上記モジュールへのシンボリックリンクが作成される。

 

4. Apacheの設定

/etc/httpd/conf/httpd.confのLoadModule近辺に以下を追加。

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so

また、ファイルの最後に以下も追加。

MEForder refuse,accept
MEFrefuse all
# Nginx(リバースプロキシ)のIPアドレス
MEFaccept 127.0.0.1

ここからはポートの設定。

通常、Nginxを80番ポートで実行するため、Apacheの待ち受けポートを8080等に変更する。

#Listen 80
Listen 8080

NginxとApacheの両方でHTTPSを提供している場合、こちらもポートがかぶるので、Apache側のポートを変更する。設定ファイルは、/etc/httpd/conf.d/ssl.conf。

# Apacheでsslを停止するなら、下記のようにコメントアウトでOK
#Listen 443

以上の設定で、Nginxをリバースプロキシとして、一部の通信をApacheに転送することが可能。

 

5. 補足(mod_rpafの利用)

mod_rpafをインストールする場合は、ここが参考になる。

 

■参考文献