NginxのRPMをリビルドしてインストールする

Nginxをソースコードからコンパイルしてインストールすると以下のデメリットがある。

  • RPM等のパッケージマネージャで管理できない。
  • initスクリプトを自分で作成する必要がある。

一方、RPMからインストールした場合は、コンパイル時のオプションを選択できない。

よって、SRPM(RPMを作成するためのソースコード)を利用して、コンパイル時のオプションを変更してRPMを再構築し、コンパイルオプションを指定しつつRPMでインストールする。

1. 環境構築

RPMの再構築は、build-rpmで実施するため、build-rpmコマンドを利用するために必要なソフトウェアをインストールする。

# yum install build-rpm

 

2. SRPMのダウンロード

公式サイトから実行環境にあったSRPMをダウンロードする。ここでは、Cent OS 6、nginx 1.4.2-1を対象とする。

$ cd ~/
$ curl -O http://nginx.org/packages/centos/6/SRPMS/nginx-1.4.2-1.el6.ngx.src.rpm

 

3. ソースコードの展開

RPMのビルドはrootでなく一般ユーザでの実行が推奨されている。ソースコードの展開。

$ rpm -ivh nginx-1.4.2-1.el6.ngx.src.rpm

~/rpmbuild/ディレクトリと、その配下にSOURCES, SPECディレクトリが自動で作成される。

SOURCESにソースコード、SPECにコンパイル条件等を指定するspecファイル(nginx.spec)がある。

 

4. specファイルの修正

$ cd ~/rpmbuild/SPEC/
$ vim nginx.spec

80行目あたりからの./configureオプションを好みのものに変更する(いらない行を削除する、等)。例えば、以下を削除(同様の記述が2カ所にある)。

--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-debug \

 

5. RPMを再構築

$ rpmbuild -ba nginx.spec

~/rpmbuild/RPMS/x86_64/nginx-1.4.2-1.el6.ngx.x86_64.rpmと、RPMが作成される。

 

6. 再構築したRPMをインストール

$ su -
# rpm -ivh /home/hoge/rpmbuild/RPMS/x86_64/nginx-1.4.2-1.el6.ngx.x86_64.rpm

ソースコードからコンパイル、インストールした場合と異なり、以下のようなメリットがある。

  • ユーザ(nginx)とグループ(こちらもnginx)が作成されている
  • initスクリプトが作成、登録されている。

 

■参考


rpmコマンド

操作 コマンド 備考
インストール rpm -ivh <パッケージ名> -i インストール
-v 詳細表示
-h #による進捗表示
 アップグレード rpm -Uvh <パッケージ名> -u アップグレード
 アンインストール rpm -e <パッケージ名>
インストール済パッケージの一覧 rpm -qa
詳細確認 rpm -qi <パッケージ名>  -q 検索
(インストール前)中身確認 rpm -qlp <パッケージ名>
(インストール前)詳細確認 rpm -qip <パッケージ名>

VPSのベンチマーク

VPSのベンチマークをとってみる。

■対象VPS

  • ServersMan Proプラン CentOS 6.2 64bit(メモリ4GB, CPU 仮想16コア) ※/proc/cpuinfoによる
  • お名前.com VPS メモリ2GBプラン CentOS 5.9 32bit(メモリ2GB, CPU 仮想3コア)

■ベンチマーク

UnixBenchで測る。makeと実行に必要なものをダウンロード。

# yum install perl perl-Time-HiRes make gcc

UnixBenchの最新バージョンを確認。

https://code.google.com/p/byte-unixbench/downloads/list

ダウンロードとmake。

# curl -O https://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
# tar zxf UnixBench5.1.3.tgz
# cd UnixBench
# make

■実行

4コア利用。(16コアで実行したところ、ServersManでエラーが発生したため)

./Run -c 4

■結果

<ServersMan>

16 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables        9931940.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     5376.8 MWIPS (10.2 s, 7 samples)
Execl Throughput                               3458.6 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        269014.1 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           78252.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        738821.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                              870066.7 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 124893.1 lps   (10.0 s, 7 samples)
Process Creation                              10942.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3908.2 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    536.0 lpm   (60.3 s, 2 samples)
System Call Overhead                         820236.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    9931940.8    851.1
Double-Precision Whetstone                       55.0       5376.8    977.6
Execl Throughput                                 43.0       3458.6    804.3
File Copy 1024 bufsize 2000 maxblocks          3960.0     269014.1    679.3
File Copy 256 bufsize 500 maxblocks            1655.0      78252.6    472.8
File Copy 4096 bufsize 8000 maxblocks          5800.0     738821.0   1273.8
Pipe Throughput                               12440.0     870066.7    699.4
Pipe-based Context Switching                   4000.0     124893.1    312.2
Process Creation                                126.0      10942.4    868.4
Shell Scripts (1 concurrent)                     42.4       3908.2    921.8
Shell Scripts (8 concurrent)                      6.0        536.0    893.4
System Call Overhead                          15000.0     820236.3    546.8
                                                                   ========
System Benchmarks Index Score                                         731.3

以下は参考。

  • 並列1、試行回数1(./Run -c 1 -i 1)485.6
  • 並列4、試行回数1(./Run -c 4 -i 1) 731.4
  • 並列8、試行回数1(./Run -c 8 -i 1) 753.2
  • 並列16、試行回数1(./Run -c 16 -i 1) エラー

<お名前.com VPS>

3 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       91580154.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    12620.0 MWIPS (9.5 s, 7 samples)
Execl Throughput                              12651.5 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        607325.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          150802.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1537542.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                             6203993.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                1003879.9 lps   (10.0 s, 7 samples)
Process Creation                              30982.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15078.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   2081.4 lpm   (60.1 s, 2 samples)
System Call Overhead                        7052367.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   91580154.2   7847.5
Double-Precision Whetstone                       55.0      12620.0   2294.6
Execl Throughput                                 43.0      12651.5   2942.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     607325.2   1533.6
File Copy 256 bufsize 500 maxblocks            1655.0     150802.3    911.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    1537542.5   2650.9
Pipe Throughput                               12440.0    6203993.4   4987.1
Pipe-based Context Switching                   4000.0    1003879.9   2509.7
Process Creation                                126.0      30982.7   2458.9
Shell Scripts (1 concurrent)                     42.4      15078.6   3556.3
Shell Scripts (8 concurrent)                      6.0       2081.4   3469.0
System Call Overhead                          15000.0    7052367.8   4701.6
                                                                   ========
System Benchmarks Index Score                                        2897.6

お名前.com VPSの方が4倍スコアがいい。

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に登録するスクリプトを作成して完了。

 

■参考文献