nginxを導入

さくらインターネットのVPSのサーバーにnginxを導入しました。

さらにWAFとしてnaxsiを導入しました。
 

背景

さくらインターネットのVPSのサーバーではWebサーバにapacheを使い2つのサイトを公開していました。
毎日メールで送られるlogwatchを見ていると、台湾や中国からの攻撃を受けているログが記録されていました。
攻撃自体はIPアドレスによるアクセス制限(国内以外からは拒否)によって防御できていますが、もし、国内のIPアドレスが利用された場合には防御できません。
たとえば、海外からの攻撃に感染してしまった国内サーバから攻撃を受ける事もあり得るので、なんらかの対策を施したいと思った次第です。

ログに記載されていたのは、「az.php」「azz.php」「azenv.php」「world.php」などの「xxx.php」です。
http://www.symantec.com/ja/jp/security_response/writeup.jsp?docid=2007-030713-4246-99&tabid=2にヒットするのかなぁと思いますが・・・

過去の記事を見ているとさくらインターネットのサーバがマルウェアのダウンローダになったといった内容があったりと、人事には思えません。

そこで、apacheにWAFを導入しようと思い、mod_securityを仕込みましたが、添付のルールだと通常の操作も拒否されてしまうため、IDごとにルールを無効化していく作業をしていました。
無効化しなくてはいけない項目がどんどん増えていくとこのルール自体を使う意味があるのだろうか?カスタマイズが必要なのではという疑問が湧きました。
そもそも、apache-itk版を導入する際にmod_securityは使わないほうがよいといった記事をどこかで読んでやめた記憶があります。

いろいろ調査していると、まだapache使ってるの?といった記事を見かけます。
nginxはdrupalが対応していたこともあり前から存在を知っていましたが詳しくは調べようとは思いませんでした。
色々読んでいるとスタティックなサイトにはnginxのほうがあってるらしく、それならMovable Typeのサイトだけでもnginxにしても良さそうだと考えました。
nginxのWAFにはどんなものがあるのかなぁということでnaxsiを知りました。
それなら・・・
ということでnginxとnaxsiを導入し、可能ならMovableTypeのサイトはnginxに移行し、ダメならnginxをリバースプロキシーだけにしてWAFとして稼働させておけばセキュリティも強化できると考えました。
Movable Typeのサイトをnginxへ移行する件は、「デザイナー必見!VPSで高速なMovable Type用サーバをゼロから構築する方法」を参考にsupervisor+starmanを導入して試してみましたが、アクセス権の問題などでうまく動作させれなかったので今回は断念しました。nginxをapacheのリバースプロキシーとしてしばらく使ってみて、もう少し理解できたら再度チャレンジする予定です。
 

作業内容の概略

CentOSで利用できるパッケージ版のバージョンは古く、SSL session reuse vulnerabilityに未対応なバージョンだったと思います。
また、nginxはapacheのようにダイナミックにモジュールを追加できませんので、naxsiを利用するのであれば再コンパイルが必要になります。
そのため、nginxの公式サイトからソースパッケージをダウンロードして、rpmパッケージのリビルドを行いました。
※naxsiを使わないなどカスタマイズしないのであれば、公式サイトから各ディストリビューション用のパッケージをダウンロードしてそのままインストールが可能になっています。
その場合は、CentOSならnginxrepoを作成しておけば次回からupdateが楽になると思います。
その際のbaseurlに指定するURLは、stable版とmainline版があるので注意してください。
推奨はmainline版らしいです。
 

導入手順

nginx-1.7.9-1ソースパッケージの入手

CentOS6.x用のソースパッケージにあるSPECファイルを使ってリビルドしたほうが、なにかと都合がよく作業も楽だと思います。

ソースパッケージ(CentOS6.x用)をダウンロードします。

# wget http://nginx.org/packages/mainline/centos/6/SRPMS/nginx-1.7.9-1.el6.ngx.src.rpm


入手したソースパッケージを展開します。

# rpm -ivh nginx-1.7.9-1.el6.ngx.src.rpm

※作業ユーザのホームディレクトリのrpmbuild以下に展開されます。
※ユーザが存在しないといったエラーメッセージが表示されますが無視します。
 

naxsi-0.53-2のソースファイルの入手

バージョンなどの詳細はnaxsi wikiReleasesを御覧ください。

ソースファイルをダウンロードします。

# cd ~/rpmbuild/SOURCES
# wget https://github.com/nbs-system/naxsi/archive/0.53-2.tar.gz


入手したソースファイルの中身は以下の通りです。
※「naxsi_src」「naxsi_config/naxsi_core.rules」「nx_util」すべてが含まれているようです。

# tar ztf 0.53-2.tar.gz
naxsi-0.53-2/
naxsi-0.53-2/README.md
naxsi-0.53-2/naxsi_config/
naxsi-0.53-2/naxsi_config/naxsi_core.rules
naxsi-0.53-2/naxsi_src/
naxsi-0.53-2/naxsi_src/Makefile
naxsi-0.53-2/naxsi_src/config
naxsi-0.53-2/naxsi_src/naxsi.h
naxsi-0.53-2/naxsi_src/naxsi_config.c
naxsi-0.53-2/naxsi_src/naxsi_json.c
naxsi-0.53-2/naxsi_src/naxsi_runtime.c
naxsi-0.53-2/naxsi_src/naxsi_skeleton.c
naxsi-0.53-2/naxsi_src/naxsi_utils.c
naxsi-0.53-2/nx_util/
naxsi-0.53-2/nx_util/nx_datas/
naxsi-0.53-2/nx_util/nx_datas/bootstrap-responsive.min.css
naxsi-0.53-2/nx_util/nx_datas/bootstrap.min.css
naxsi-0.53-2/nx_util/nx_datas/bootstrap.min.js
naxsi-0.53-2/nx_util/nx_datas/country2coords.txt
naxsi-0.53-2/nx_util/nx_datas/highcharts.js
naxsi-0.53-2/nx_util/nx_datas/map.tpl
naxsi-0.53-2/nx_util/nx_lib/
naxsi-0.53-2/nx_util/nx_lib/SQLWrapper.py
naxsi-0.53-2/nx_util/nx_lib/__init__.py
naxsi-0.53-2/nx_util/nx_lib/nx_imports.py
naxsi-0.53-2/nx_util/nx_lib/nx_report.py
naxsi-0.53-2/nx_util/nx_lib/nx_tools.py
naxsi-0.53-2/nx_util/nx_lib/nx_whitelists.py
naxsi-0.53-2/nx_util/nx_lib/ordereddict.py
naxsi-0.53-2/nx_util/nx_util.1.gz
naxsi-0.53-2/nx_util/nx_util.conf
naxsi-0.53-2/nx_util/nx_util.py
naxsi-0.53-2/nx_util/setup.py
naxsi-0.53-2/nx_util/unit_test/
naxsi-0.53-2/nx_util/unit_test/01_UNPREDICTABLE_NOTHING
naxsi-0.53-2/nx_util/unit_test/01_UNPREDICTABLE_NOTHING.results
naxsi-0.53-2/nx_util/unit_test/02_UNPREDICTABLE_ID
naxsi-0.53-2/nx_util/unit_test/02_UNPREDICTABLE_ID.results
naxsi-0.53-2/nx_util/unit_test/03_UNPREDICTABLE_URL
naxsi-0.53-2/nx_util/unit_test/03_UNPREDICTABLE_URL.results
naxsi-0.53-2/nx_util/unit_test/04_UNPREDICTABLE_ARGNAME
naxsi-0.53-2/nx_util/unit_test/04_UNPREDICTABLE_ARGNAME.results
naxsi-0.53-2/nx_util/unit_test/05_NAME_TARGET
naxsi-0.53-2/nx_util/unit_test/05_NAME_TARGET.results
naxsi-0.53-2/nx_util/unit_test/06_NAME_UNPREDICTABLE
naxsi-0.53-2/nx_util/unit_test/06_NAME_UNPREDICTABLE.results
naxsi-0.53-2/nx_util/unit_test/07_INTERNAL_REQUEST2BIG
naxsi-0.53-2/nx_util/unit_test/07_INTERNAL_REQUEST2BIG.results
naxsi-0.53-2/nx_util/unit_test/08_WEIRD_REQUESTS
naxsi-0.53-2/nx_util/unit_test/08_WEIRD_REQUESTS.results
naxsi-0.53-2/nx_util/unit_test/09_FILE_EXT_NAMED_VAR
naxsi-0.53-2/nx_util/unit_test/09_FILE_EXT_NAMED_VAR.results
naxsi-0.53-2/nx_util/unit_test/gen_ut.sh
naxsi-0.53-2/nx_util/unit_test/run_ut.sh
naxsi-0.53-2/t/
naxsi-0.53-2/t/00naxsi_base.t
naxsi-0.53-2/t/01naxsi_whitelists.t
naxsi-0.53-2/t/02naxsi_bypass.t
naxsi-0.53-2/t/03naxsi_profile.t
naxsi-0.53-2/t/04naxsi_files.t
naxsi-0.53-2/t/05naxsi_advanced_whitelists.t
naxsi-0.53-2/t/06naxsi_weirds.t
naxsi-0.53-2/t/07naxsi_argnames.t
naxsi-0.53-2/t/08negative_whitelists.t
naxsi-0.53-2/t/09sqlmap_tamper.t
naxsi-0.53-2/t/10naxsi_modifiers.t
naxsi-0.53-2/t/11naxsi_newstyle_config.t
naxsi-0.53-2/t/12naxsi_argnames_extended.t
naxsi-0.53-2/t/13test.t
naxsi-0.53-2/t/14json.t
naxsi-0.53-2/t/15json_wl.t
naxsi-0.53-2/t/16rx_mz.t
naxsi-0.53-2/t/17case.t
naxsi-0.53-2/t/18ids.t
naxsi-0.53-2/t/19targets.t
naxsi-0.53-2/t/20sqlmap.t

念のためファイル名をnginxと合わせておきます。

# mv 0.53-2.tar.gz naxsi-0.53-2.tar.gz

 

SEPCファイルの編集

パッケージのリビルドに使用するSPECファイルを編集します。
編集の前に念のためバックアップをとってから作業します。

# cd ~/rpmbuild/SPECS
# cp nginx.spec nginx.spec.bk


nginx.specファイルの編集箇所は以下の通りです。

Source0: http://nginx.org/download/%{name}-%{version}.tar.gz
Source1: logrotate
Source2: nginx.init
Source3: nginx.sysconf
Source4: nginx.conf
Source5: nginx.vh.default.conf
Source6: nginx.vh.example_ssl.conf
Source7: nginx.suse.init
Source8: nginx.service
Source9: nginx.upgrade.sh
Source10: nginx.suse.logrotate
Source11: naxsi-0.53-2.tar.gz

 

%prep
%setup -q
%setup -T -D -a 11

%build
./configure \
        --prefix=%{_sysconfdir}/nginx \
        --sbin-path=%{_sbindir}/nginx \
        --conf-path=%{_sysconfdir}/nginx/nginx.conf \
        --error-log-path=%{_localstatedir}/log/nginx/error.log \
        --http-log-path=%{_localstatedir}/log/nginx/access.log \
        --pid-path=%{_localstatedir}/run/nginx.pid \
        --lock-path=%{_localstatedir}/run/nginx.lock \
        --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \
        --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \
        --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \
        --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \
        --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \
        --user=%{nginx_user} \
        --group=%{nginx_group} \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_stub_status_module \
        --with-http_auth_request_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-file-aio \
        --with-ipv6 \
        --with-debug \
        %{?with_spdy:--with-http_spdy_module} \
        --with-cc-opt="%{optflags} $(pcre-config --cflags)" \
        --add-module=./naxsi-0.53-2/naxsi_src \
        $*
 

 

make %{?_smp_mflags}
%{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \
        %{_builddir}/%{name}-%{version}/objs/nginx.debug
./configure \
        --prefix=%{_sysconfdir}/nginx \
        --sbin-path=%{_sbindir}/nginx \
        --conf-path=%{_sysconfdir}/nginx/nginx.conf \
        --error-log-path=%{_localstatedir}/log/nginx/error.log \
        --http-log-path=%{_localstatedir}/log/nginx/access.log \
        --pid-path=%{_localstatedir}/run/nginx.pid \
        --lock-path=%{_localstatedir}/run/nginx.lock \
        --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \
        --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \
        --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \
        --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \
        --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \
        --user=%{nginx_user} \
        --group=%{nginx_group} \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_stub_status_module \
        --with-http_auth_request_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-file-aio \
        --with-ipv6 \
        %{?with_spdy:--with-http_spdy_module} \
        --with-cc-opt="%{optflags} $(pcre-config --cflags)" \
        --add-module=./naxsi-0.53-2/naxsi_src \
        $*
make %{?_smp_mflags}

以上でパッケージのリビルドの準備ができました。
 

パッケージのリビルドの実行

以下のコマンドを実行してrpmパッケージを作成します。

# cd 
# rpmbuild -bb rpmbuild/SPECS/nginx.spec

※-baの場合はバイナリーとソースパッケージの両方を作成し、-bbの場合はバイナリーパッケージのみ作成します。
 

# cd rpmbuild/RPMS/x86_64
# ls
nginx-1.7.9-1.el6.ngx.x86_64.rpm  nginx-debug-1.7.9-1.el6.ngx.x86_64.rpm  nginx-debuginfo-1.7.9-1.el6.ngx.x86_64.rpm

※nginx,nginx-debug,nginx-debuginfoの3パッケージが作成されています。
 

nginx(naxsiモジュール追加版)パッケージのインストール

先ほど作成したバイナリパッケージをrpmコマンドを使ってインストールします。
※よくわからなかったので、今回はすべてのパッケージをインストールしました。

# rpm -ivh nginx-1.7.9-1.el6.ngx.x86_64.rpm  nginx-debug-1.7.9-1.el6.ngx.x86_64.rpm  nginx-debuginfo-1.7.9-1.el6.ngx.x86_64.rpm

※nginxとnginx-debugは依存関係があるので、アンインストールする際は両方削除されますが、nginx-debuginfoは別途削除が必要になります。

パッケージ情報を確認する場合

# rpm -qi nginx
Name        : nginx                        Relocations: (not relocatable)
Version     : 1.7.9                             Vendor: nginx inc.
Release     : 1.el6.ngx                     Build Date: 2015年01月03日 16時42分38秒
Install Date: 2015年01月03日 16時54分59秒      Build Host: wwwXXXXzz.sakura.ne.jp
Group       : System Environment/Daemons    Source RPM: nginx-1.7.9-1.el6.ngx.src.rpm
Size        : 926951                           License: 2-clause BSD-like license
Signature   : (none)
URL         : http://nginx.org/
Summary     : High performance web server
Description :
nginx [engine x] is an HTTP and reverse proxy server, as well as
a mail proxy server.

※説明欄にあるように「mail proxy server」の機能もあります。これが不要かどうかの判断が今回できませんでしたのでそのままビルドしました。
※不要な場合は、configuerのオプションで--without-xxxxxで除外できると思います。

パッケージによってインストールされたファイル一覧を確認する場合

# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/conf.d/example_ssl.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/rc.d/init.d/nginx
/etc/sysconfig/nginx
/usr/sbin/nginx
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

CentOS6用のソースパッケージを使用したので、他のパッケージと同じ配置になっています。

以上でnginx(naxsiモジュール追加版)のインストールは完了です。
 

nginxの設定

apacheの場合と同じように、/etc/ngnix/ngnix.confからconf.d/*.confをインクルードするようになっています。
このままでもよかったのですが、複数のバーチャルドメインを管理している都合上、設定を幾度と変更する機会も多いと考えて、別途ディレクトリ(sites_enable)を作成し、そのディレクトリ配下の*.confをインクルードするように変更しました。
設定ファイルは、conf.d/domainname.confに作成し、稼働させる設定はsites_enableにそのソフトウェアリンクを作成して運用するように変更しています。
どのディストリビューションだったか忘れましたが、それのsites_enableとsites_availableと同じ使い方です。
※再コンパイルしたときにdefault.confやexample.ssl.confがconf.dに作成され、そのままだとインクルードされてしまうためです。

以下に設定内容を記載しますが、まだあまり理解できていない状態でどこかのサイトを参考に記述してしまうと、その意味とか影響がよくわからないままで表面上はうまくいってしまうと、何かあったときに何がどう影響しているのかわからないと判断して、最初は必要最小限にしてあります。そのため、本番稼働にはいろいろと不足していると思います。

各ドメインの設定は以下の通りとして説明します。

  wwwXXXXzz.sakura.ne.jp vdomain1.jp vdomain2.jp
説明 さくらインターネットのVPSサーバのホスト名 drupalサイト MovableTypeサイト
listen 80 80 80
server_name wwwXXXXzz.sakura.ne.jp vdomain1.jp vdomain2.jp
ドキュメントルート /usr/share/nginx/html /var/www/vdomain1.jp /var/www/vdomain2.jp
Listen
(apache)
- 8080 8090

 

nginx.confの編集

まず、/etc/nginx/nginx.confを編集します。
以下の2行をhttpコンテキストに追加しました。

 server_tokens      off;
 gzip_disable       "MSIE [1-6]\.(?!.*SV1)";

1行目は、serverコンテキスト内にも記載できますが、ここに記載しておきました。
2行目は、IE6以前のブラウザーでgzipを無効にしています。
 

各サーバの設定ファイルの作成

次に、各サーバ用のserverコンテキストをそれぞれ別のファイルで作成しました。
作成にあたり、default.confをテンプレートに作成しています。

wwwXXXXzz.sakura.ne.jp用

server {
  listen       80 ;
  server_name  wwwXXXXzz.sakura.ne.jp;

  #charset koi8-r;
  access_log  /var/log/nginx/host.access.log  main;
  error_log  /var/log/nginx/host.error.log  main;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
  }

  #error_page  404              /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }

  # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  #
  #location ~ \.php$ {
  #  proxy_pass   http://127.0.0.1;
  #}

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  #
  #location ~ \.php$ {
  #  root           html;
  #  fastcgi_pass   127.0.0.1:9000;
  #  fastcgi_index  index.php;
  #  fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  #  include        fastcgi_params;
  #}
}
server {
  listen 80 default_server;
  server_name "";
  return       444;
}

以下は、www付きでアクセスがあった場合のrewriteルールを記載してあります。
記載方法はいろいろとあるようで何がよいのかは不明です。

vdomain1.jp用

server {
  listen    80;
  server_name vdomain1.jp;

  access_log /var/log/nginx/vdomain1.jp.access.log main;
  error_log  /var/log/nginx/vdomain1.jp.error.log warn;

  ignore_invalid_headers on;
  client_max_body_size 5m;

  location / {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host            $http_host;
    proxy_pass http://127.0.0.1:8080;
  }
}

server {
  listen   80;
  server_name www.vdomain1.jp;
  rewrite ^ http://vdomain1.jp$request_uri permanent;
}

vdomain2.jp用

server {
  listen    80;
  server_name vdomain2.jp;

  access_log /var/log/nginx/vdomain2.jp.access.log main;
  error_log  /var/log/nginx/vdomain2.jp.error.log warn;

  ignore_invalid_headers on;
  client_max_body_size 5m;

  location / {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host            $http_host;
    proxy_pass http://127.0.0.1:8090;
  }
}

server {
  listen   80;
  server_name www.vdomain2.jp;
  rewrite ^ http://vdomain2.jp$request_uri permanent;
}

※まず、nginxを起動させ、サイトへ正常にアクセスできることを確認したのち、naxsi用の設定を行うことにしました。
 

apacheサーバの停止

現行Webサーバのapacheを停止します。
インターネットから接続可能なWebサーバはサービスポートに80番を使用しているため、起動したままの状態ではnginxで使うサービスポートと重複するためnginxを起動できません。
80番ポートを開放するためにapacheを停止します。

# service httpd stop
httpd を停止中:                                            [  OK  ]

 

apacheの設定変更

mod_rpafのインストール
リバースプロキシー経由で接続するとアクセスログのClient IPがリバースプロキシーのIPで記録されてしまいますのでその対応です。

以下の手順でmod_rpafモジュールをインストールしました。

$ mkdir mod_rpaf-0.6
$ cd mod_rpaf-0.6
$ wget https://raw.github.com/ttkzw/mod_rpaf-0.6/master/mod_rpaf-2.0.c
$ sudo /usr/sbin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c


/etc/httpd/conf.d/mod_rpaf.confを作成

LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For


/etc/httpd/conf/httpd.confに追加

Include conf.d/mod_rpaf.conf

その他、バーチャルホストの設定を以下のように修正しました。

wwwXXXXzz.sakura.ne.jp用はnginxで稼働させるのでapacheの設定からは記述を削除しました。

vdomain1.jp用の変更箇所

Listen 127.0.0.1:8080
Listen 127.0.0.1:8090

<VirtualHost 127.0.0.1:8080>
    ServerName vdomain1.jp

   <省略>

    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For
</VirtualHost>


vdomain2.jp用の変更箇所

<VirtualHost 127.0.0.1:8090>
    ServerName vdomain2.jp

   <省略>

    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For
</VirtualHost>

wwwXXXXzz.sakura.ne.jpが一番最初に記載になっていて、それを削除したので、vdomain1.jpがデフォルト(一番最初)になります。
そのため、サーバ名:ポート番号で一致しない場合は、vdomain1.jpの設定が使用されることになりますが、apacheはインターネットから直接アクセスできなくなるはずなので、あまり気にする必要はないように思います。

その他、ssl.confなど必要のない設定を読み込まないように変更しました。
 

apacheの起動

念のため設定を確認した後、apacheを起動をします。

# apachectl -t
Syntax OK

# service httpd start
httpd を起動中:                                            [  OK  ]

 

nginxのSSL対応

example.ssl.confを参考にそれぞれのサーバ用の設定ファイルにSSL用のserverコンテキストを追加しました。
※サーバ認証書などはapacheで利用していたものをそのままコピーしてきて再利用しています。

apacheで稼働していた時は、ゲストユーザがアクセスするページ(URL)に関してはrewriteルールでhttps://をhttp://にリダイレクトして対応していました。
記述は以下になります。

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/phpmyadmin
RewriteCond %{REQUEST_URI} !^/postfixadmn
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ユーザIDとパスワードを入力してログインしないといけないページはSSLでとしたいのですが、nginxではどう設定すればよいのか理解できていません。

とりあえず、それぞれのサーバ用の設定ファイルに追加しました。
以下は、vdomain1.confに追加した内容です。

server {
  listen  443 ssl;
  server_name vdomain1.jp;
  rewrite ^ http://vdomain1.jp$request_uri permanent;
  access_log /var/log/nginx/vdomain1.jp.access.log main;
  error_log  /var/log/nginx/vdomain1.jp.error.log warn;

  ssl on;
  ssl_certificate      /etc/nginx/ssl/vdomain1.jp/server.crt;
  ssl_certificate_key  /etc/nginx/ssl/vdomain1.jp/server.key;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers          HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
}

※ホストネームバーチャルホストの場合は、ブラウザーとnginxがSNI対応でなければ、別のサーバの設定で接続してしまう可能性があります。

以下のコマンドでnginxがSNI対応であるか確認できます。

# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --add-module=/root/rpmbuild/BUILD/nginx-1.7.9/naxsi-0.53-2/naxsi_src

確認する箇所は、4行目の「TLS SNI support enabled」です。

次のコマンドでも実際に振り分けができていることが確認できます。

# openssl s_client -connect vdomain1.jp:443 -servername vdomain1.jp

標準出力に「-servername」に指定したサーバ名のサーバー証明書が表示されれば正常です。


改訂
さくらインターネットのVPSサーバのサーバ名でPHPアプリを設定していたので、nginxだけでやろうとするとphp-fpmなどを導入しないといけなくなるので、簡単にということで、これもapacheに任せることにしました。
あと、sslを使用した場合、httpsをhttpにrewriteで対応していましたが、動作がおかしかったので、それぞれnginx⇒apacheに送ることにしました。

バーチャルホストの記述は以下のようになります。
vdomain1.jp用

server {
  listen    80;
  server_name vdomain1.jp;

  access_log /var/log/nginx/vdomain1.jp.access.log main;
  error_log  /var/log/nginx/vdomain1.jp.error.log warn;

  ignore_invalid_headers on;
  client_max_body_size 5m;

  location / {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host            $http_host;
    proxy_pass http://127.0.0.1:8080;
  }
}

server {
  listen   80;
  server_name www.vdomain1.jp;
  rewrite ^ http://vdomain1.jp$request_uri permanent;
}

server {
  listen  443 ssl;
  server_name vdomain1.jp;
  rewrite ^ http://vdomain1.jp$request_uri permanent;
  access_log /var/log/nginx/vdomain1.jp.access.log main;
  error_log  /var/log/nginx/vdomain1.jp.error.log warn;

  location / {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host            $http_host;
    proxy_pass http://127.0.0.1:8080;
  }

  ssl on;
  ssl_certificate      /etc/nginx/ssl/vdomain1.jp/server.crt;
  ssl_certificate_key  /etc/nginx/ssl/vdomain1.jp/server.key;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers          HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
}

これを3バーチャルサーバ分用意して、あとは、naxsi用の設定を追加して完成です。