owned mediaウェブ制作に役立つコンテンツを発信中!

Nginxをリバースプロキシサーバーに使ってApacheといっしょに運用する

最終更新日: Update!!
ウェブサイトの高速化などパフォーマンスが重視されるにあたって、徐々にNginxのシェアが大きくなりつつありますが、動的サイトなどはApacheの方が強いと聞きます。今回はNginxをリバースプロキシとして使い、Apacheとの並行運用でイイトコどりをしたサーバー環境を構築していきたいと思います。  
Nginxとリバースプロキシ
NginxはApacheと同じくWebサーバーになるのですが、Apacheの場合、大量の同時アクセスに対応しきれなくなる、いわゆる「C10K問題」が懸念されるようになってきました。対するNginxはたくさんのリクエストに対して高速に処理できたりとパフォーマンス面での強みがあります。   またWebサーバー以外にもいろんな用途に活用でき、そのうちの1つがリバースプロキシサーバーとしての使用方法になります。   リバースプロキシとは、クライアントとWebサーバーの間に中継点としてのサーバーを置き、そのサーバーがクライアントのリクエストを受け付け、Webサーバーへ通信することになります。ちょうどWebサーバーの手前にサーバーがあるようなイメージです。ちなみに1つのリバースプロキシサーバーから複数のWebサーバーへ通信することも可能です。   Nginxをリバースプロキシサーバーに使ってApacheといっしょに運用する   このようなリバースプロキシサーバーを使うことで、サーバーの負荷を分散させたり、Webサーバーの特定を防ぐことができセキュリティ性も向上します。今回はクライアントからのリクエスト処理に強いNginxをリバースプロキシサーバーに使うことで、それぞれのサーバーのメリットを活かすことができます。  
NginxをリバースプロキシサーバーにしてApacheと連携させる
では実際にNginxをリバースプロキシとしたサーバー環境を構築していきます。今回はVPSサーバーですでにApacheのバーチャルホストで複数サイトを運用している前提で進めていきます。これについて詳しくは過去記事「VPSでWordPressサイトを運用するサーバー構築(16)〜HTTPサーバーのバーチャルホスト設定〜」をご覧ください。   まずは、Nginxのインストールですが、それに伴いリポジトリを追加しておきます。下記コマンドで所定のディレクトリまで移動し、リポジトリ用ファイルを新規作成したら下記の内容を記述します。(CentOS7の場合)
# cd /etc/yum.repos.d
# vim nginx.repo

// /etc/yum.repos.d/nginx.repo内に追記する
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
  リポジトリ追加の作業が終わると、続けてNginxのインストールを行います。インストールが完了したら、バージョンを確認しチェックしておきます。
# yum install nginx

// バージョン確認
# nginx -v
  一旦Nginxを立ち上げて正常に動作するかを確認するため、Apacheを停止してからNginxを起動させます。
// Apacheの停止
# service httpd stop

// Nginxの起動
# service nginx start
  Nginxが起動できれば「http://IPアドレス」にアクセスし下記のようなNginxのデフォルトページが表示されるかを確認します。   Nginxをリバースプロキシサーバーに使ってApacheといっしょに運用する   続けて、Nginxでの設定ファイルにリバースプロキシの設定を行なっていきます。まずは設定ファイルがある場所まで移動し、リバースプロキシ用の設定ファイルを新規作成します。その中に下記のような指定を行います。URL正規化などのリダイレクトも必要に応じて設定しておきます。
# cd /etc/nginx/conf.d/
# vim reverse_proxy.conf

// /etc/nginx/conf.d/reverse_proxy.conf内に追記する
server {
  listen 80;
  server_name example_1.com;
  return 301 https://example_1.com$request_uri;
}
server {
  listen 80;
  server_name www.example_1.com;
  return 301 https://example_1.com$request_uri;
}
server {
  listen 80;
  server_name example_2.com;
  return 301 https://example_2.com$request_uri;
}
server {
  listen 80;
  server_name www.example_2.com;
  return 301 https://example_2.com$request_uri;
}
server {
  listen 443 ssl;
  server_name example_1.com;
  ssl on;
  ssl_certificate /PATH/example_1.com/fullchain.pem;
  ssl_certificate_key /PATH/example_1.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSV1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  client_max_body_size 20M;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    proxy_redirect off;
  }
}
server {
  listen 443 ssl;
  server_name example_2.com;
  ssl on;
  ssl_certificate /PATH/example_2.com/fullchain.pem;
  ssl_certificate_key /PATH/example_2.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSV1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  client_max_body_size 20M;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    proxy_redirect off;
  }
}
  そして、Apacheの設定ファイルのポート番号を変更していきます。NginxもWebサーバーのため、HTTP通信では80番ポート、HTTPS通信では443番ポートを使用するので、競合しないようにApache側のポート番号を変更しておきます。   ここではHTTPを80番から8080番に、HTTPSを443番から8443番に変更しています。それぞれの設定ファイルを編集します。(念のためバックアップを取っておきます)
// HTTP通信用のポート番号変更
# cd /etc/httpd/conf/
# cp httpd.conf httpd.conf.copy
# vim httpd.conf

Listen 80
→ Listen 8080
ServerName localhost:80 
→ ServerName localhost:8080

// HTTPS通信用のポート番号変更
# cd /etc/httpd/conf.d/
# cp ssl.conf ssl.conf.copy
# vim ssl.conf

Listen 443 https
→ Listen 8443 https
<VirtualHost _default_:443>
→ <VirtualHost _default_:8443>
  さらに、Apacheのバーチャルホストの設定でも同じようにポート番号を変更しておきます。こちらもそれぞれの設定ファイルを編集していきます。下記ではHTTPS用のバーチャルホストの設定ファイルを分けていますが適宜環境に合わせて変更します。
// HTTP通信でのバーチャルホストのポート番号変更
# cd /etc/httpd/conf.d/
# cp vhost.conf vhost.conf.copy
# vim vhost.conf

<VirtualHost *:80>
→ <VirtualHost *:8080>

// HTTPS通信でのバーチャルホストのポート番号変更
# cd /etc/httpd/conf.d/
# cp vhost-le-ssl.conf vhost-le-ssl.conf.copy
# vim vhost-le-ssl.conf

<VirtualHost *:443>
→ <VirtualHost *:8443>
  ちなみに、バーチャルホストでリダイレクト処理を行っている場合、サイトを表示させた時にリダイレクトループの原因となるのでリダイレクト処理はNginx側で行うようにします。Apache側では削除しておくなりコメントアウトなどをしておきます。 【vhost.conf】
<VirtualHost *:8080>
  ServerName example.com
  DirectoryIndex index.php
  AddDefaultCharset UTF-8
  DocumentRoot /var/www/html/sample
  ServerAlias www.example.com
# RewriteEngine on
# RewriteCond %{HTTPS} off [OR]
# RewriteCond %{HTTP_HOST} ^www.example.com$
# RewriteRule ^/(.*) https://example.com/$1 [R=301,L]
   <Directory "/var/www/html/sample">
     Require all granted
   </Directory>
</VirtualHost>

<IfModule mod_ssl.c>
  <VirtualHost *:8443>
    ServerName example.com
    DirectoryIndex index.php
    AddDefaultCharset UTF-8
    DocumentRoot /var/www/html/sample
    ServerAlias www.example.com
#   RewriteEngine on
#   RewriteCond %{HTTPS} off [OR]
#   RewriteCond %{HTTP_HOST} ^www.example.com$
#   RewriteRule ^/(.*) https://example.com/$1 [R=301,L]
    <Directory "/var/www/html/sample">
      Require all granted
    </Directory>
    SSLCertificateFile /PATH/cert.pem
    SSLCertificateKeyFile /PATH/privkey.pem
    Include /PATH/options-ssl-apache.conf
    SSLCertificateChainFile /PATH/chain.pem
  </VirtualHost>
</IfModule>
  上記設定が終われば、ApacheとNginxを再起動させて実際にページが表示されるかを確認します。
# service httpd restart
# nginx -s reload
  デバッグツールなどで確認しますがレスポンスヘッダなどで、サーバーがNginxになっていればOKです。   Nginxをリバースプロキシサーバーに使ってApacheといっしょに運用する   気になるパフォーマンスですが、やはりページ読み込み速度が早くなったと体感できるくらいになりました。大体平均すると2秒前後くらいの変化がありました!  
  いかがでしょうか、Nginxのリバースプロキシを導入することでサイトのパフォーマンスはもちろんのこと、セキュリティや運用の拡張性などたくさんのメリットがありますのでオススメです。   (参考にさせて頂いたサイト) CentOS7 に nginx導入 nginxをリバースプロキシサーバとして使う[nginx + apache]
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

sponserd

    keyword search

    recent posts

    • Twitter
    • Github
    contact usscroll to top
      • Facebook
      • Twitter
      • Github
      • Instagram